我试着用Bresenham的连算法做垂直线。但是当我为一条垂直线放置坐标时,它只是打印一个点,而不是显示一条垂直线。
#include <graphics.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
int main( )
{
int x1,y1,x2,y2,dx,dy,ds,dt,d,x,y;
/* request auto detection */
int gdriver = DETECT, gmode, errorcode;
/* initialize graphics and local variables */
initgraph(&gdriver, &gmode, "c:\\tc\\bgi");
x1=200;
x2=200;
y1=200;
y2=300;
x=x1;
y=y1;
dx=x2-x1;
dy=y2-y1;
dt=2*(dy-dx);
ds=2*dy;
d=2*dy-dx;
printf("Using Bresenham's Line Algorithm");
putpixel(x,y,7);
while(x<=x2)
{
x=x+1;
if(d<0)
d=d+ds;
else
{
y=y+1;
d=d+dt;
}
putpixel(x,y,7);
}
getch();
closegraph();
return 0;
}
当我把x1=200,x2=200,它给了我一个错误。我为什么要犯这个错误?但是在正常的直线函数中,我得到了正确的结果,但是当输入Bresenham时,我得到了错误的结果。
发布于 2022-05-23 08:10:57
像您实现的那样,Bresenham只能绘制斜率在0°到45°之间的直线,因为每个循环都会增加x 1,并且有条件地增加y 1。
你要做的是首先检查这条线是否从左到右。如果不是,您必须切换端点。
接下来,如果直线向下倾斜而不是向上倾斜,则必须减少y,而不是增加y。您可以将1
或-1
存储在临时变量中,这取决于行是向上还是向下倾斜,并在需要时将其添加到y
中。
如果y的变化大于x的变化,你必须交换算法中的坐标,递增y,每个循环和x。为此,您实际上必须复制整个循环。
https://stackoverflow.com/questions/72350465
复制相似问题