首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

这个直线方程,务必是起点比终点小(左往右画)才能显示,反过来不行,为什么

2013-04-02 
这个直线方程,必须是起点比终点小(左往右画)才能显示,反过来不行,为什么本帖最后由 nabasasun 于 2013-03-

这个直线方程,必须是起点比终点小(左往右画)才能显示,反过来不行,为什么
本帖最后由 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();
}

热点排行