Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Java2D图形正确地绘制具有密集点的粗线?_Java_Graphics_Java 2d_Shapes - Fatal编程技术网

如何使用Java2D图形正确地绘制具有密集点的粗线?

如何使用Java2D图形正确地绘制具有密集点的粗线?,java,graphics,java-2d,shapes,Java,Graphics,Java 2d,Shapes,我正在尝试使用Java2D绘制地图。当我的地图缩小时,我的道路上到处都是画作。这是绘制完整美国州时屏幕的一小部分: 放大时,这是一段类似的道路: 使用的线条样式是一条蓝色实线,其宽度缩放为等于2像素。 我尝试过各种渲染提示和线条连接规则,但似乎没有任何帮助 我在运行OS/X10.8的Mac上使用OpenJDK1.7,这在带有Sun JDK1.6的Linux机器上也是可以复制的 使用Java2D,所有形状和变换都尽可能达到双精度。 线条的几何体有许多密集的点,我怀疑绘制人工制品的原因是渲染器被

我正在尝试使用Java2D绘制地图。当我的地图缩小时,我的道路上到处都是画作。这是绘制完整美国州时屏幕的一小部分:

放大时,这是一段类似的道路:

使用的线条样式是一条蓝色实线,其宽度缩放为等于2像素。 我尝试过各种渲染提示和线条连接规则,但似乎没有任何帮助

我在运行OS/X10.8的Mac上使用OpenJDK1.7,这在带有Sun JDK1.6的Linux机器上也是可以复制的

使用Java2D,所有形状和变换都尽可能达到双精度。 线条的几何体有许多密集的点,我怀疑绘制人工制品的原因是渲染器被比单个像素更近的连续点弄糊涂了

有没有办法在不细化点的情况下改善缩小形状的外观

编辑 图形人工制品位于单独线段相交的点上,因此缺少的像素与线帽(端点)不相交有关,即使端点相同。此图显示了两条线段之间的交点。我以7像素的缩放线条样式(白色的XOR ed)高亮显示了每个线段,但如果你仔细观察,你仍然可以看到原始蓝线的一部分(这是由于圆角帽重叠和XOR绘制模式)。在普通比例下,端点似乎重叠,但在普通绘制模式下缩小并返回时,会出现折线效果

一种解决方法是在绘制所有连续线段之前将它们连接在一起,但我仍然想知道绘制人工制品的真正原因

请检查它是否能回答您的问题

基本概念

function plot(x, y, c) is
plot the pixel at (x, y) with brightness c (where 0 ≤ c ≤ 1)

function ipart(x) is
return integer part of x

function round(x) is
return ipart(x + 0.5)

function fpart(x) is
return fractional part of x

function rfpart(x) is
return 1 - fpart(x)

function drawLine(x1,y1,x2,y2) is
dx = x2 - x1
dy = y2 - y1
if abs(dx) < abs(dy) then                 
  swap x1, y1
  swap x2, y2
  swap dx, dy
end if
if x2 < x1
  swap x1, x2
  swap y1, y2
end if
gradient = dy / dx

// handle first endpoint
xend = round(x1)
yend = y1 + gradient * (xend - x1)
xgap = rfpart(x1 + 0.5)
xpxl1 = xend  // this will be used in the main loop
ypxl1 = ipart(yend)
plot(xpxl1, ypxl1, rfpart(yend) * xgap)
plot(xpxl1, ypxl1 + 1, fpart(yend) * xgap)
intery = yend + gradient // first y-intersection for the main loop

// handle second endpoint
xend = round (x2)
yend = y2 + gradient * (xend - x2)
xgap = fpart(x2 + 0.5)
xpxl2 = xend  // this will be used in the main loop
ypxl2 = ipart (yend)
plot (xpxl2, ypxl2, rfpart (yend) * xgap)
plot (xpxl2, ypxl2 + 1, fpart (yend) * xgap)

// main loop
for x from xpxl1 + 1 to xpxl2 - 1 do
    plot (x, ipart (intery), rfpart (intery))
    plot (x, ipart (intery) + 1, fpart (intery))
    intery = intery + gradient
end function
函数图(x,y,c)为
用亮度c(其中0)在(x,y)处绘制像素≤ C≤ 1)
ipart(x)的功能是
返回x的整数部分
函数轮(x)为
返回ipart(x+0.5)
函数fpart(x)是
返回x的小数部分
函数rfpart(x)为
返回1-第一部分(x)
功能绘制线(x1、y1、x2、y2)为
dx=x2-x1
dy=y2-y1
如果abs(dx)
我无法重现您使用OS X 1.6 JDK时的情景,但我仍有一些建议供您参考

如果您只是使用它来概述状态,请考虑使用。您可以使用

lineTo(x,y)
方法在直线上建立每个点。同样,因为我无法使用
Line2D.Double
重新创建您的问题,所以我不知道这是否会有任何不同


第二,可能更重要的是,你是如何放大和缩小的。我在我的
图形2d
对象上使用了一个(带有
setScaleTo(x,y)
),一切都很顺利。与通过缩放因子(或其他任何可以做的事情)缩放数据中的点相比,这相当容易。您还必须通过因子调整线条的笔划,因为它将缩小所有内容。如果你愿意,我可以发布截图。

+1关于算法,特别是维基百科上的链接,上面说“小于一个像素长的线应该作为特例处理。”如果这篇文章准确地解释了如何处理这种特殊情况,那么这篇文章将更具相关性,因为这个问题特别提到亚像素线段是人工制品的一个可能原因。我希望在Java2D API中实现低级渲染算法。我正在寻找的解决方案要么解释如何使用Java2D API来实现连续的、加厚的行。感谢您提供的内容丰富的答复。另一个可接受的解决方案将解释为什么目前不可能这样做,并提供比问题中建议的解决方案更好的解决方案(渲染形状前进行点细化)。感谢您的答复。我使用的是仿射变换,它是缩放和平移操作的组合。我也在缩放笔划宽度。我的一些坐标相距5-10米。缩小时画布的全宽约为1000000米。我将看看是否可以回滚到使用Apple 1.6 JDK运行的旧版本代码。我主要看到绘制道路时出现的问题。县边界看起来不错,但可能没有相同的细节。我也看到了苹果JDK1.6的问题。我开始怀疑这个问题是否与在直线内绘制人工制品无关,而是在线段的端点处。仔细观察数据,道路不是具有许多顶点的长连续线,而是具有连续端点的短线段。接受这个答案,因为它最终引导我找到了解决方案。我要么关闭该层的一个图形优化,要么将每条公路的路段连接在一起。