c# - 一条线穿过的所有点

标签 c# algorithm rasterizing

我需要找到一条线上的所有点。我尝试了 Bresenham 的算法,但它不适用于以下情况:

 (0, 0)
.-----------+-----------+-----------.
|...........|           |           |
|...........|           |           |
|.....XXXX..|           |           |
|........XXXX           |           |
|...........XXXXX       |           |
+-----------+---XXXX----+-----------+
|           |......XXXXX|...........|
|           |..........XXXX.........|
|           |...........|.XXXXX.....|
|           |...........|...........|
|           |...........|...........|
`-----------+-----------+-----------´
                              (2, 1)

X 是实际的行,. 是 Bresenham 算法返回的内容,注意该行穿过 (1, 0) 但它不是标记。
如何有效地找到一条线经过的所有像素?我不需要这种抗锯齿,所以我认为 Wu 的算法有点矫枉过正。线端点位于像素中间。

引用我的算法是:

int dx = System.Math.Abs(x0 - x1);
int dy = System.Math.Abs(y0 - y1);

int sx = x0 < x1 ? 1 : -1;
int sy = y0 < y1 ? 1 : -1;

int err = dx - dy;

int lx = x0;
int ly = y0;

for(int i = 0; true; i++)
{
    Mark(x0, y0);

    if(x0 == x1 && y0 == y1)
        break;

    int e2 = err * 2;
    if(e2 > -dy)
    {
        err -= dy;
        x0 += sx;
    }
    if(e2 < dx)
    {
        err += dx;
        y0 += sy;
    }
}

最佳答案

好吧,只需实现显而易见的直接算法:从直线的一端开始,找到它穿过起始方 block 的哪一侧,跳转到相应的相邻方 block ......等等。一直走到终点广场。

用整数实现它的最简单方法是切换到超像素精度:只需将所有内容乘以一个常数因子。当您发现没有足够的整数范围来充分乘以它时,困难的部分就开始了……我不知道您的情况是否属于这种情况。

关于c# - 一条线穿过的所有点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5885806/

相关文章:

c# - 我有一个 c sharp dll。我怎样才能使它在其他语言(例如 PHP 或 Delphi)中可用?

c# - ASP.NET 页面性能

php - 对多维数组进行排序的最佳方法

C++三角形光栅化

graphics - 将 3d 球体投影到屏幕上的 2d 圆中

r - 有没有办法将 grob 直接保存到 rasterGrob?

c# - 检测何时设置了 Application.Current.RootVisual (Silverlight)

c# - 从 BackgroundWorker C# 更改控件的属性

algorithm - 包络算法优化——放置圆圈的最佳位置

algorithm - 矩阵的二进制搜索