根据两点画出直线,c++ windows编程 函数。帮忙实现

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了根据两点画出直线,c++ windows编程 函数。帮忙实现相关的知识,希望对你有一定的参考价值。

void drawLine(HDC hdc, const POINT ps, const POINT pe)

float xlen = fabs((float)ps.x - pe.x);
float ylen = fabs((float)ps.y - pe.y);
float e = ylen == 0? 0:xlen / ylen;

float len = xlen > ylen ? xlen : ylen;
for (float i = 0; i < len; i++)

int dx = ps.x > pe.x ? -i : i;
int dy = ps.y > pe.y ? -i : i;

if (xlen == 0)

SetPixel(hdc,ps.x ,ps.y+dy,0);

else

SetPixel(hdc,ps.x+dx,ps.y+dy*e,0);




我写的,能画出一部分线,但比如0,0 10,200 这样X,Y差值偏差大的点就画不出来了,没想除解决办法,请帮忙修改下(顺便解说下,拜托了!)

CDC类不是有现成的函数么?
CDC *pdc = CDC::FromHandle(hdc);
pdc->MoveTo(ps);
pdc->LineTo(pe);

以下是引用:
直线段的扫描转换算法
1 数值微分(DDA)法
我的理解就是以一个坐标轴为步长值(增量为1),另一个坐标根据直线的斜率(K)为
增量,然后四舍五入进行计算机,确定每一个点的坐标。
具体算法(我用OPENGL模拟)
void setPixel(GLint xCoord,GLint yCoord)

glBegin(GL_POINTS);
glVertex2i(xCoord,yCoord);
glEnd();

inline int round(const float a)

return int(a+0.5);

void lineDDA(int x0,int y0,int xEnd,int yEnd)

int dx = xEnd - x0,dy = yEnd - y0,steps,k;
float xIncrement,yIncrement,x = x0,y=y0;
if(abs(dx)>abs(dy))

steps = abs(dx);

else

steps = abs(dy);

xIncrement = float(dx)/float(steps);
yIncrement = float(dy)/float(steps);
setPixel(round(x),round(y));
for(k = 0;k<steps;k++)

x+=xIncrement;
y+=yIncrement;
setPixel(round(x),round(y));


2中点画线法
同样我理解的算法就是,以一个增量为多的坐标轴为步长值(为1),而另一个坐标
值是加1,还是不变取决于这两个坐标值中点是在这条直线的上方,还是下方。
具体算法如下:
void lineMiddle(int x0,int y0,int xEnd,int yEnd)

int a,b,c,d1,d2,d;
a = y0-yEnd;
b = xEnd-x0;
d = 2*a+b;//判别试(2a+b为初始值)
d1 = 2*a;//中点在直线下方增量值
d2 = 2*a+b;//中点在真线上方的增量值
int x,y;
x = x0;y=y0;
setPixel(x,y);
while(x<xEnd)

if(d<0)//中点在直线下方

x++;
y++;
d+=d2;

else//中点在直线上方

x++;
d+=d1;

setPixel(x,y);


3.Bresenham画线算法程序:
用一个坐标轴来当步长值(即+1),另一个坐标轴是否加1则跟据斜率(k)来确定,K
如果大于0.5,那么也加+1,如果小于0.5那么即不变。为了方便计算,如果d大于1
,那么就减一,归0。可设e,e=d-0.5,于是就有e>0时,加1,e<0时不变,这样便
于硬件实现。
算法实现如下:
void lineBresenham(int x0,int y0,int x1,int y1)

int x,y,dx,dy;
float k,e;
dx = x1 - x0;
dy = y1 - y0;;
k = (float)dy/dx;
e = -0.5;
x = x0;
y = y0;
setPixel(x,y);
for(int i =0;i<dx;i++)

x = x+1;
e = e+k;
if(e>=0)

y++;
e = e-1;

setPixel(x,y);

参考资料:http://mygraphicsworld.spaces.live.com/Blog/cns!A898DA3B7393BFC9!116.entry

参考技术A for (float i = 0; i < len; i++)

int dx = ps.x > pe.x ? -i : i;
int dy = ps.y > pe.y ? -i : i;

moveto
lineto
简单才是好的

编程求取直线一般式表达式,两直线交点

背景介绍

??最近在水面无人艇(USV)模拟仿真中,用到了一些点和线的关系求解,本文主要讲述一下两点确认直线,点到直线距离,两条直线的交点等问题的解决方法,并给出python程序。部分内容非原创,文中给出链接,需要者可以参考。

两点确定直线

表达式定义

??空间直线的表达式有多种,比如一般式Ax+By+C=0、点斜式y-y0=k(x-x0)、截距式x/a+y/b=1、两点式:(y-y1)/(y1-y2)=(x-x1)/(x1-x2)等,它们具有彼此的约束条件,如下所示。
技术分享图片
??由上可以看出来,一般式的适用范围最广,不需要单独做处理和判断,所以在计算机领域处理二维图像数据中一般式用的最多。
??已知直线上的两点P1(X1,Y1)和P2(X2,Y2),P1和P2两点不重合,对于AX+BY+C=0,则有:

  • A=Y2-Y1
  • B=X1-X2
  • C=X2*Y1-X1*Y2

??推导两点求直线的一般式方程的链接

python源代码

def GeneralEquation(first_x,first_y,second_x,second_y):
    # 一般式 Ax+By+C=0
    A=second_y-first_y
    B=first_x-second_x
    C=second_x*first_y-first_x*second_y
    return A,B,C

点到直线距离

表达式定义

??设直线L的方程为Ax+By+C=0,点P的坐标为(x0,y0),则点P到直线L的距离为:

d=\frac{\left | A\times x0+B\times y0+C \right |}{\sqrt{A^{2}+B^{2}}}

两条直线的交点

表达式定义

技术分享图片
??在已知直线两点的情况下,利用上面的直线一般式可以求得直线的参数A、B和C,那么两条直线的一般式表达可以列成二元一次方程组,其解即为两条直线的交点坐标。注意处理两条直线平行的特殊情况。

技术分享图片

??根据二元一次方程的解,假设两条直线的参数分别为A1,B1,C1和A2,B2,C2,那么两条直线的交点可以表示为:

x=\frac{C2\times B1-C1\times B2}{A1\times B2-A2\times B1}

y=\frac{C1\times A2-C2\times A1}{A1\times B2-A2\times B1}

python源代码

def GetIntersectPointofLines(x1,y1,x2,y2,x3,y3,x4,y4):
    A1,B1,C1=GeneralEquation(x1,y1,x2,y2)
    A2, B2, C2 = GeneralEquation(x3,y3,x4,y4)
    m=A1*B2-A2*B1
    if m==0:
        print("无交点")
    else:
        x=(C2*B1-C1*B2)/m
        y=(C1*A2-C2*A1)/m
    return x,y

??程序运行结果:两直线交点为x=32.857142857142854,y=65.71428571428571,符合数学计算。部分内容参考自两条线段是否相交,计算交点公式







以上是关于根据两点画出直线,c++ windows编程 函数。帮忙实现的主要内容,如果未能解决你的问题,请参考以下文章

vc MFC中,知道一个起点,一条直线方程y=kx+b,怎么在界面上画出这条直线?

matlab中画直线用啥函数

matlab 三维直线怎么画

有关matlab画直线

编程求取直线一般式表达式,两直线交点

已知直线终点与起点坐标 怎么两点距离