求中点画线算法的c++代码...

如题所述

直线方程:a*x+b*y+c=0, p1(x1,y1), p2(x2,y2)==> a=y1-y2;b=x2-x1.

点到直线的距离:distance=|a*x0-b*y0+c|/sqrt(a*a + b*b)
设directionX,directionY分别为从(x1,y1)==>(x2,y2)的单位变化量(+/-1)

当直线偏向X轴时,当前象素为(xk, yk),下一个象素可能为:(xk+directionX, yk)或者(xk+directionX,yk+directionY)这两点到直线的距离分别为:

d1=|a*xk+b*yk+c+a*directionX|/sqrt(a*a + b*b);
d2=|a*xk+b*yk+c+a*directionX+b*directonY|/sqrt(a*a + b*b);
便于运算,定义:f(xk,yk)= d2 * d2 - d1 * d1 (将d1和d2的分母去掉了的)
= b*b + 2*b*directonY*(a*xk+b*yk+c+a*directionX) ;
当f(xk,yk)<0的时候,下一个点为(xk+directionX,yk+directionY):
f(xk+directionX,yk+directionY)=f(xk,yk) +2*b*b+2*a*b*directionX*directionY ;
当f(xk,yk)>=0的时候,下一个点为(xk+directionX, yk) :
f(xk+directionX, yk) = f(xk,yk) + 2*a*b*directionX*directionY ;

当直线偏向Y轴时,当前象素为(xk, yk),下一个象素可能为:(xk, yk+directionY)或者(xk+directionX,yk+directionY)这两点到直线的距离分别为:

d1=|a*xk+b*yk+c+b*directionY|/sqrt(a*a + b*b);
d2=|a*xk+b*yk+c+b*directionY+a*directonX|/sqrt(a*a + b*b);
便于运算,定义:f(xk,yk)= d2 * d2 - d1 * d1 (将d1和d2的分母去掉了的)
= a*a + 2*a*directonX*(a*xk+b*yk+c+b*directionY) ;
当f(xk,yk)<0的时候,下一个点为(xk+directionX,yk+directionY):
f(xk+directionX,yk+directionY)=f(xk,yk) +2*a*a+2*a*b*directionX*directionY ;
当f(xk,yk)>=0的时候,下一个点为(xk+directionX, yk) :
f(xk+directionX, yk) = f(xk,yk) + 2*a*b*directionX*directionY ;

/*
* 中点画线算法
*/
void LineMLDA(HDC& hdc, POINT ptSrc, POINT ptDec, COLORREF cr)
{
int a, b ;

a = ptSrc.y - ptDec.y ;
b = ptDec.x - ptSrc.x ;

int iDirectionX, iDirectionY ;

iDirectionX = iDirectionY = 1 ;
if(b<0)
iDirectionX = -1 ;
if(a>0)
iDirectionY = -1 ;

int iDistance,
iDeltaSmall, iDeltaBig ,
iCurrX, iCurrY ;

int iStep ;

iDeltaSmall = 2*a*b*iDirectionX*iDirectionY ;

iCurrX = ptSrc.x ;
iCurrY = ptSrc.y ;

if(abs(b) > abs(a))
{
iDeltaBig = 2*b*b + iDeltaSmall ;
iDistance = b*b + iDeltaSmall ;

iStep = abs(b) ;

while (iStep-- > 0)
{
SetPixel(hdc, iCurrX, iCurrY, cr) ;

iCurrX += iDirectionX ;
if(iDistance < 0)
{
iCurrY += iDirectionY ;

iDistance += iDeltaBig ;
}
else
{
iDistance += iDeltaSmall ;
}
}
}
else
{
iDeltaBig = 2*a*a + iDeltaSmall ;
iDistance = a*a + iDeltaSmall ;

iStep = abs(a) ;

while (iStep-- > 0)
{
SetPixel(hdc, iCurrX, iCurrY, cr) ;

iCurrY += iDirectionY ;
if(iDistance < 0)
{
iCurrX += iDirectionX ;

iDistance += iDeltaBig ;
}
else
{
iDistance += iDeltaSmall ;
}
}
}

SetPixel(hdc, ptDec.x, ptDec.y, cr) ;
}
温馨提示:内容为网友见解,仅供参考
无其他回答

求中点画线算法的c++代码...
直线方程:a*x+b*y+c=0, p1(x1,y1), p2(x2,y2)==> a=y1-y2;b=x2-x1.点到直线的距离:distance=|a*x0-b*y0+c|\/sqrt(a*a + b*b)设directionX,directionY分别为从(x1,y1)==>(x2,y2)的单位变化量(+\/-1)当直线偏向X轴时,当前象素为(xk, yk),下一个象素可能为...

根据两点画出直线,c++ windows编程 函数。帮忙实现
} 2中点画线法 同样我理解的算法就是,以一个增量为多的坐标轴为步长值(为1),而另一个坐标 值是加1,还是不变取决于这两个坐标值中点是在这条直线的上方,还是下方。具体算法如下:void lineMiddle(int x0,int y0,int xEnd,int yEnd){ int a,b,c,d1,d2,d;a = y0-yEnd;b = xEn...

用c++程序输出图形,求高手写一个~
这个参考下,还有点问题。画直线有个算法,我这个可能写错了.亲,觉得好就给我好评吧!include<stdio.h> include<math.h> char temp[128][128];void DrawDot(int x,int y) \/\/画点 { temp[x][y]='*';} void DrawLine(int x1,int y1,int x2,int y2)\/\/画线 { int x,y,ix,iy,...

c++ 编写line函数 求解
Point a(2, 4), b(12, 24);\/\/从a画线到b drawLine(a, b);return 0;}

用C++如何实现bresenham画线算法?计算机图形学上面有个drawpixel的函数...
在MFC中可以这样实现:\/\/Bresenham算法画直线 void CMyView::OnDrawLineByBresenham(){ \/\/ TODO: Add your command handler code here CDC* pDC = GetDC();CPoint PtBegin(80,130);\/\/起始点 CPoint PtEnd(320,370);\/\/终止点 int s1,s2,interchange;double X = PtBegin.x;double Y = Pt...

求一用C语言画直线的程序
C语言的话画直线用MoveTo()和LineTo()很简单啊。帮你复制一份我学习时老师给的画线两例:include<graphics.h> include<math.h> \/ 功 能:本函数的作用是用逐点比较法来画一条直线 格 式:void myline1(int x1,int y1,int x2,int y2,int color)参数说明:x1,y1是起始点坐标,x2,y2是...

易语言画线算法
易语言画线算法:用鼠标穿透。四个画板作为1234象限,然后自己定义个X,Y变量,取一个范围内的X,Y值画点。最后用画线连点,个人推荐画板宽度300,4个画板就是600的大小,只取函数在-3,3的位置的点,这样就能画出小数点后两位的点。支持库:易语言支持库实际上是DLL文件。通过使用其它编程语言为易...

Bresenham画线算法
基本上Bresenham画线算法的思路如下:\/\/ 假设该线段位于第一象限内且斜率大于0小于1,设起点为(x1,y1),终点为(x2,y2).\/\/ 根据对称性,可推导至全象限内的线段.1.画起点(x1,y1).2.准备画下个点。x坐标增1,判断如果达到终点,则完成。否则,由图中可知,下个要画的点要么为当前点的右邻接点,...

如何在vc++中用cdc绘图
CPen笔,画线 CBrush刷子,填充 CFont字体,控制文字输出的字体 CBitmap位图 CPalette调色板 CRgn区域,指定一块区域可以用于做特殊处理。 CFile文件。最重要的不外是Open(打开),Read(读入),Write(写) CString字符串。封装了C中的字符数组,非常实用。 CPoint点,就是(x,y)对 CRect矩形,就是(left,top,right,...

C\/C++如何拟合样条线
73.Caxa中圆弧拟合样条曲线命令怎么使用?

相似回答