C# 所有病例均涵盖Bresenham';s线算法

C# 所有病例均涵盖Bresenham';s线算法,c#,.net,algorithm,line,bresenham,C#,.net,Algorithm,Line,Bresenham,我需要检查一行中的所有像素,所以我使用Bresenham的算法来访问其中的每个像素。特别是,我需要检查所有像素是否位于位图的有效像素上。代码如下: private void Bresenham(Point p1, Point p2, ref List<Point> track) { int dx = p2.X - p1.X; int dy = p2.Y - p1.Y; int swaps = 0; if (dy > dx) { Swap(ref dx,

我需要检查一行中的所有像素,所以我使用Bresenham的算法来访问其中的每个像素。特别是,我需要检查所有像素是否位于位图的有效像素上。代码如下:

private void Bresenham(Point p1, Point p2, ref List<Point> track) {
  int dx = p2.X - p1.X;
  int dy = p2.Y - p1.Y;

  int swaps = 0;
  if (dy > dx) {
    Swap(ref dx, ref dy);
    swaps = 1;
  }

  int a = Math.Abs(dy);
  int b = -Math.Abs(dx);

  double d = 2*a + b;
  int x = p1.X;
  int y = p1.Y;
  color_track = Color.Blue;
  Check_Pixel(ref area, new Point(x,y));
  track.Clear();
  track.Add(new Point(x, y));

  int s = 1;
  int q = 1;
  if (p1.X > p2.X) q = -1;
  if (p1.Y > p2.Y) s = -1;

  for(int k = 0; k < dx; k++) {
    if (d >= 0) {
      d = 2*(a+b) + d;
      y = y + s;
      x = x + q;
    }
    else {
      if (swaps == 1) y = y + s;
      else x = x + q;
      d = 2 * a + d;
    }
    Check_Pixel(ref area, new Point(x, y));
    track.Add(new Point(x, y));
  }
}

private void Swap(ref int x, ref int y) {
  int temp = x;
  x = y;
  y = temp;
}
private void Bresenham(点p1、点p2、参考列表轨道){
intdx=p2.X-p1.X;
int dy=p2.Y-p1.Y;
int-swaps=0;
如果(dy>dx){
交换(参考dx,参考dy);
互换=1;
}
int a=数学Abs(dy);
intb=-Math.Abs(dx);
双d=2*a+b;
intx=p1.x;
int y=p1.y;
color\u track=color.Blue;
检查_像素(参考区域,新点(x,y));
track.Clear();
轨迹。添加(新点(x,y));
int s=1;
int q=1;
如果(p1.X>p2.X)q=-1;
如果(p1.Y>p2.Y)s=-1;
对于(int k=0;k=0){
d=2*(a+b)+d;
y=y+s;
x=x+q;
}
否则{
如果(互换=1)y=y+s;
否则x=x+q;
d=2*a+d;
}
检查_像素(参考区域,新点(x,y));
轨迹。添加(新点(x,y));
}
}
私人无效掉期(参考整数x,参考整数y){
int-temp=x;
x=y;
y=温度;
}
Check_Pixel用于检查线条像素是否位于有效的位图像素上。我将创建的像素添加到
列表中
以逐点渲染他的元素,并确保
Bresenham
检查正确的像素(确实如此)。问题是,我的算法并没有覆盖所有的情况,而是覆盖了大约50%的情况


备注:我的坐标系原点位于左上角(x从左向右,y从上向下)

查找完整版本:

public void line(int x,int y,int x2, int y2, int color) {
    int w = x2 - x ;
    int h = y2 - y ;
    int dx1 = 0, dy1 = 0, dx2 = 0, dy2 = 0 ;
    if (w<0) dx1 = -1 ; else if (w>0) dx1 = 1 ;
    if (h<0) dy1 = -1 ; else if (h>0) dy1 = 1 ;
    if (w<0) dx2 = -1 ; else if (w>0) dx2 = 1 ;
    int longest = Math.Abs(w) ;
    int shortest = Math.Abs(h) ;
    if (!(longest>shortest)) {
        longest = Math.Abs(h) ;
        shortest = Math.Abs(w) ;
        if (h<0) dy2 = -1 ; else if (h>0) dy2 = 1 ;
        dx2 = 0 ;            
    }
    int numerator = longest >> 1 ;
    for (int i=0;i<=longest;i++) {
        putpixel(x,y,color) ;
        numerator += shortest ;
        if (!(numerator<longest)) {
            numerator -= longest ;
            x += dx1 ;
            y += dy1 ;
        } else {
            x += dx2 ;
            y += dy2 ;
        }
    }
}
公共虚线(整数x,整数y,整数x2,整数y2,整数颜色){
int w=x2-x;
int h=y2-y;
int dx1=0,dy1=0,dx2=0,dy2=0;
如果(w0)dx1=1;
如果(h0)dy1=1;
如果(w0)dx2=1;
int longest=Math.Abs(w);
int最短=数学绝对值(h);
如果(!(最长>最短)){
最长=数学绝对值(h);
最短=数学Abs(w);
如果(h0)dy2=1;
dx2=0;
}
整数分子=最长>>1;

对于(int i=0;实际上,Bresenham's的C#版本是一个有效的版本,它实际上覆盖了所有的八位字节,并且没有一半的时间反转点!pro reopen:问题写得很好,包括足够的代码来重新解释问题。问题文本包含一个可以回答的问题陈述。现有的答案很有用。我想d另一个(更为最新的)答案,但不能。