You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求实现返回像素坐标列表的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 08:32:21