.net 在C#控制台中画一条线,但只返回坐标

6rqinv9w  于 2023-03-24  发布在  .NET
关注(0)|答案(1)|浏览(133)

这很难描述,基本上我想要的是,画一条线,但是返回坐标,例如,如果我触发一个函数,叫做 public static void returnLineCoordinates(int x1, int y1, int x2, int y2),假设我像这样触发函数: returnLineCoordinates(1, 1, 3, 3),则函数应打印:

1X 1Y
2X 2Y
3X 3Y

基本上,这就像我们画了一条线,但我们实际上所做的是打印每个像素位置的坐标。
我怎么用C#控制台来做呢?实际上,控制台在这里并不重要,它可以是Windows窗体,WPF,只是不画线,而是返回像素坐标。
Bresenhams直线绘制算法是可以完善的。

这里有一个小的编辑。我实际上不需要打印值,但类似的东西。只需将X和Y像素坐标保存为两个整数,存储像素X和Y位置并每次更新它。

先谢了。

n6lpvg4x

n6lpvg4x1#

此函数有四个参数:开始点的x和y坐标,以及结束点的x和y坐标。它返回一个坐标列表,其中每个坐标代表行上像素的x和y坐标。基本上这个algorithm

public static List<(int, int)> GetLineCoordinates(int x1, int y1, int x2, int y2)
{
    List<(int, int)> coordinates = new List<(int, int)>();
    
    int dx = Math.Abs(x2 - x1);
    int dy = Math.Abs(y2 - y1);
    int sx = x1 < x2 ? 1 : -1;
    int sy = y1 < y2 ? 1 : -1;
    int err = dx - dy;
    int x = x1;
    int y = y1;
    
    while (true) {
        coordinates.Add((x, y));
        
        if (x == x2 && y == y2) {
            break;
        }
        
        int e2 = 2 * err;
        
        if (e2 > -dy) {
            err -= dy;
            x += sx;
        }
        
        if (e2 < dx) {
            err += dx;
            y += sy;
        }
    }
    
    return coordinates;
}

相关问题