这个直线方程,必须是起点比终点小(左往右画)才能显示,反过来不行,为什么
本帖最后由 nabasasun 于 2013-03-27 12:06:31 编辑 这应该是这个算法的BUG吧,GDI画线是可以从上下左右画的,请问怎么修改
下面是C#的算法
Point t1=new Point(0-p1.X,0-p1.Y);
Point t2=new Point(0-p2.X,0-p2.Y);
double x1,x2,y1,y2;
x1=t1.X;
x2=t2.X;
y1=t1.Y;
y2=t2.Y;
double a,b;
a = (y2 - y1) / (x2 - x1);
b = y1 - a * x1;
// 循环画出直线
for (double i = x1; i >= x2; i-=1)
{
double tx, ty;
ty = a * i + b;
//这里如果是GDI的话,就是循环画pixel的点
drawPoint(new Point((int)Math.Abs(i), (int)Math.Abs(ty)));
}
//两点 x=20 y=20 ,x=50 y=50
drawLine(new Point(20, 20), new Point(50, 50));
[解决办法]
for (double i = x1; i >= x2; i-=1)
这就限定了方向了
可以考虑先判断2个点的位置,反了就交换一下
[解决办法]
#include "stdio.h"
#include "stdlib.h"
#include "conio.h"
#include "graphics.h"
void DDA_line0(int x0,int y0,int y1,int color) {//画线函数 斜率k=无穷大
int y;
for (y=y0;y<=y1;y++) putpixel(x0,y,color);
}
void DDA_line1(int x0,int y0,int x1,int color,float k) {//画线函数 斜率
[解决办法]
k
[解决办法]
<=1
int x;
float y;
y=y0;
for (x=x0;x<=x1;x++) {
putpixel(x,(int)(y+0.5),color);
y=y+k;
}
}
void DDA_line2(int x0,int y0,int y1,int color,float k) {//画线函数 斜率
[解决办法]
k
[解决办法]
>1
int y;
float x,k1;
x=x0;
k1=1.0/k;
for (y=y0;y<=y1;y++) {
putpixel((int)(x+0.5),y,color);
x=x+k1;
}
}
void main() {
int x0=0,y0=0,x1=0,y1=0;//起点(x0,y0) 终点(x1,y1)
int gd=DETECT,gm,color=EGA_MAGENTA,errorcode,maxx,maxy;
float k=0,temp_x,temp_y;
initgraph(&gd,&gm,"D:\\BC\\BGI");
errorcode = graphresult();
if (errorcode != grOk) {
printf("Graphics error: %s\n", grapherrormsg(errorcode));
printf("Press any key to exit");
getch();
exit(1);
}
maxx=getmaxx();
maxy=getmaxy();
printf("Input x0 y0 x1 y1 (Note:0<=x0<x1<=%d,0<=y0<y1<=%d):",maxx,maxy);
scanf("%d %d %d %d",&x0,&y0,&x1,&y1);
if (0<=x0 && x0<=maxx
&& 0<=x1 && x1<=maxx
&& x0<x1
&& 0<=y0 && y0<=maxy
&& 0<=y1 && y1<=maxy
&& y0<y1) {
if (x0==x1) DDA_line0(x0,x1,y1,color);
else {
temp_y=y1-y0;
temp_x=x1-x0;
k=temp_y/temp_x;
if (-1<=k && k<=1) DDA_line1(x0,y0,x1,color,k);
else DDA_line2(x0,y0,y1,color,k);
}
} else {
printf("Input x0,y0,x1,y1=%d,%d,%d,%d is invalid. (Note:0<=x0<x1<=%d,0<=y0<y1<=%d)\n",x0,y0,x1,y1,maxx,maxy);
}
getch();
closegraph();
}