超对称线算法?

10

我遇到了一个特殊情况,需要在二维网格中以从 (x0, y0) 到 (x1, y1) 的顺序产生超级对称的线条或射线,像这样:

void drawSymmetricalLine(int x0, int y0, int x1, int y1)
{
    // loop and handle each (x, y)...
}

实际问题在于流行的线条绘制算法并未绘制两个坐标(另一个标记为x),因为它看起来变粗了,而这正是我想要的。此外,性能并不重要,但简单性很重要。

这是我所说的超对称线:

ox   ooo
 oo     ooo


o    o
 o    o
  o   o
       o
4个回答

4
你可以使用Bresenham的线算法,并稍微修改一下,这样当步骤改变时,从一行移动绘图位置到另一行时,你可以在当前x轴上沿y轴同时绘制前后两个像素。

3

把这条线渲染两次,一次从p0到p1,再从p1到p0。


这是我在游戏中实现对称视线的方法。 - Madmenyo

1
如果更喜欢简单而不是性能,那么编写递归算法。在每一步计算DX=X1-X0和DY=Y1-Y0。
当DX=0或DY=0时停止递归(此时您的线是垂直或水平的)。
否则,根据DX和DY的奇偶性计算两个“中间”端点,并递归绘制两条半线。

0

除非你在 (x0+dx, y0+dy) 处绘制一个点,否则使用Bresenham's line algorithm,同时还要在 (x1-dx, y1-dy) 处绘制一个点。这样可以确保从两侧都对称。

这样做有些低效,但你说那没关系。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接