c# – 所有案例都涵盖了Bresenham的线算法

c# – 所有案例都涵盖了Bresenham的线算法,第1张

概述我需要检查一行中的所有像素,所以我使用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 swa 我需要检查一行中的所有像素,所以我使用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,y));    track.Add(new Point(x,y));  }}private voID Swap(ref int x,ref int y) {  int temp = x;  x = y;  y = temp;}

Check_Pixel用于检查线像素是否在有效位图上.我将创建的像素添加到List< Point>逐点渲染他的元素并确保Bresenham检查正确的像素(确实如此).问题是我的算法并不涵盖所有情况,但大约有50%.

P.S:我的坐标系原点位于左上角(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 ;        }    }}
总结

以上是内存溢出为你收集整理的c# – 所有案例都涵盖了Bresenham的线算法全部内容,希望文章能够帮你解决c# – 所有案例都涵盖了Bresenham的线算法所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1241337.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存