求实现返回像素坐标列表的C# Bresenham画线函数
C# 实现 Bresenham 画线算法函数
以下是满足需求的Bresenham画线算法实现,仅使用整数运算,返回包含所有像素坐标的列表:
using System.Collections.Generic; public static List<Tuple<int, int>> BresenhamLine(int xStart, int xEnd, int yStart, int yEnd) { var pixelCoordinates = new List<Tuple<int, int>>(); int deltaX = System.Math.Abs(xEnd - xStart); int deltaY = System.Math.Abs(yEnd - yStart); int stepX = xStart < xEnd ? 1 : -1; int stepY = yStart < yEnd ? 1 : -1; int error = deltaX - deltaY; int currentX = xStart; int currentY = yStart; while (true) { pixelCoordinates.Add(Tuple.Create(currentX, currentY)); // 到达终点时退出循环 if (currentX == xEnd && currentY == yEnd) break; int doubledError = error * 2; // 调整X坐标 if (doubledError > -deltaY) { error -= deltaY; currentX += stepX; } // 调整Y坐标 if (doubledError < deltaX) { error += deltaX; currentY += stepY; } } return pixelCoordinates; }
说明
- 函数接收四个整数参数:
xStart、xEnd、yStart、yEnd,分别对应线段的起止坐标 - 内部通过整数运算实现Bresenham算法,避免浮点计算的性能损耗
- 返回的
List<Tuple<int, int>>中,每个元组的Item1为像素X坐标,Item2为像素Y坐标
可选优化:自定义像素结构体
如果需要更清晰的坐标访问方式,可以自定义一个简单的结构体替代Tuple:
public struct PixelCoordinate { public int X { get; } public int Y { get; } public PixelCoordinate(int x, int y) { X = x; Y = y; } } // 修改后的函数 public static List<PixelCoordinate> BresenhamLine(int xStart, int xEnd, int yStart, int yEnd) { var pixelCoordinates = new List<PixelCoordinate>(); int deltaX = System.Math.Abs(xEnd - xStart); int deltaY = System.Math.Abs(yEnd - yStart); int stepX = xStart < xEnd ? 1 : -1; int stepY = yStart < yEnd ? 1 : -1; int error = deltaX - deltaY; int currentX = xStart; int currentY = yStart; while (true) { pixelCoordinates.Add(new PixelCoordinate(currentX, currentY)); if (currentX == xEnd && currentY == yEnd) break; int doubledError = error * 2; if (doubledError > -deltaY) { error -= deltaY; currentX += stepX; } if (doubledError < deltaX) { error += deltaX; currentY += stepY; } } return pixelCoordinates; }
内容的提问来源于stack exchange,提问作者winscripter
相关产品推荐
相关产品推荐

