【问题标题】:Bresenham's line drawing CodeBresenham的线描代码
【发布时间】:2013-09-12 10:13:46
【问题描述】:

我正在尝试使用 Bresenham 的算法在 C 语言中画一条线。我在 windows 7 的 dosbox 中使用 turbo C++ 来实现此代码。编译时我没有收到任何错误,但是当我运行代码时获得2个坐标后程序终止。请帮助..

编译消息如下..

目录路径如下

我的代码..

  # include <stdio.h>
  # include <conio.h>
  # include <graphics.h>

  void main()
  {
    int dx,dy,x,y,p,x1,y1,x2,y2;
    int gd,gm;

    clrscr();

    printf("\n\n\tEnter the co-ordinates of first point : ");
    scanf("%d %d",&x1,&y1);
    printf("\n\n\tEnter the co-ordinates of second point : ");
    scanf("%d %d",&x2,&y2);

    dx = (x2 - x1);
    dy = (y2 - y1);

    p = 2 * (dy) - (dx);

    x = x1;
    y = y1;

    detectgraph(&gd,&gm);
    initgraph(&gd,&gm,"e:\\tc\\bgi");
    putpixel(x,y,WHITE);

    while(x <= x2)
    {
      if(p < 0)
      {
        x=x+1;
        y=y;
        p = p + 2 * (dy);
      }
      else
      {
        x=x+1;
        y=y+1;
        p = p + 2 * (dy - dx);
     }
     putpixel(x,y,WHITE);
   }
   getch();
   closegraph();
}

【问题讨论】:

  • 除非您在嵌入式系统上工作,否则void main() 是错误的,错误的,错误的。 int main (void),看在上帝的份上!
  • 能否请您具体说明错误和行号。
  • 我在编译或运行时没有收到这样的错误消息。只有当我输入第一个坐标的值时,程序会突然终止......
  • 使用Alt + F5查看是否生成了任何错误消息,但由于控制台窗口关闭,您无法看到它。

标签: c vector-graphics turbo-c++ bresenham dosbox


【解决方案1】:

OP 应该发布使用过的输入。

发布的示例代码不起作用是x1 > x2 也不是y1 > y2。这是一组会突然停止例程的输入。要解决此问题,dxdy 应基于绝对值,而增量 xy 步骤需要独立 +1 -1。 p>

输入3,4 而不是3 4(逗号与空格)也会打乱例程。

在while循环中,推荐if(p &lt;= 0)

OP 的“...代码程序在获得 2 个坐标后终止。”不够详细,因为当然代码应该在获得 2 个坐标后的某个时间终止。但 OP 并没有详细说明它在哪里过早终止。

【讨论】:

  • 我检查了它适用于 3、4、7 和 8 八分圆但不适用于其他 4 八分圆的代码,只是造成了一些混乱。
【解决方案2】:

这是启动调试器并逐步检查代码、观察任何变量的典型完美点。如果调试器不可用,则 printf 调试到控制台是备用选择。

第一个提示是检查这些行是否不会产生错误/异常:

  detectgraph(&gd,&gm);
  initgraph(&gd,&gm,"e:\\tc\\bgi");
  putpixel(x,y,WHITE);

【讨论】:

  • 我在我的问题中添加了屏幕截图。我还需要进行您提到的更改吗??
【解决方案3】:

不错的节目。但是,您还没有初始化任何循环,并且在 while-loop 中编码的行部分不正确。这是我的尝试:-

i = 1; // loop initialization
do {
    putpixel(x, y, 15);
    while(p >= 0) {
        y = y + 1;
        p = p - (2 * dx);
    }
    x = x + 1;
    p = p + (2 * dy);
    i = i + 1;
}
while(i <= dx);

【讨论】:

    【解决方案4】:

    解决问题的方法是根据屏幕截图中提到的地址更改 initgraph 函数中的路径。

    detectgraph(&gd,&gm);
    initgraph(&gd,&gm,"C:\\TURBOC3\\bgi");
    putpixel(x,y,WHITE);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多