点斜式算法
点斜式算法是计算机图形学中一种基于直线的点斜式方程来生成直线的方法
算法思想
直线的点斜式方程y-y1=k(x-x1);
设直线通过P1(x1,y1),Pn(xn,yn),则斜率k=Δy/Δx=(yn-y1)/(xn-x1)。
如果已知第 i 点的坐标,可用步长 stepx和stepy得到i+1点坐标
xi+1=xi+stepx
yi+1=yi+stepy或yi+1=yi+k*stepx
如果stepx=1,stepy=k。
算法具体实现:在0≤k≤1的情况下,我们x每次增加1,相应的y每次增加k,如果y1+k>y1+0.5,则y2=y1+1,否则y2=y1;将y1再增加k,如果y1+2*k>y2+0.5,则y3=y2+1,否则y3=y2;如此反复比较直到终点yn。由于都是比较运算,为了方便计算,我们可以将k扩大2*Δx倍,进行比较运算。
算法描述
#include "stdafx.h"
#include "iostream"
#include "graphics.h"
#include "stdlib.h"
#include "stdio.h"
#include "conio.h"
#include "dos.h"
using namespace std;
void line(int x1,int y1,int xn,int yn,int color)
{
int x,y,dx,dy,t;
dx=xn-x1;
dy=yn-y1;
if(abs(dx)>=abs(dy))
if(dy>0) //0≤k≤1下情况
for(x=x1,y=y1,t=1;x<=xn;x++,t++)
{
if(2*dx*y1+2*t*dy>2*dx*y+dx)
y=y+1;
putpixel(x,y,color);
}
else //-1≤k≤0下情况
for(x=x1,y=y1,t=1;x<=xn;x++,t++)
{
if(2*dx*y1+2*t*dy<2*dx*y-dx)
y=y-1;
putpixel(x,y,color);
}
else if(dx>0) //k>1下情况
for(x=x1,y=y1,t=1;y<=yn;y++,t++)
{
if(2*dy*x1+2*t*dx>2*dy*x+dy)
x=x+1;
putpixel(x,y,color);
}
else //k<-1下情况
for(x=x1,y=y1,t=1;y<=yn;y++,t++)
{
if(2*dy*x1+2*t*dx<2*dy*x-dy)
x=x-1;
putpixel(x,y,color);
}
}
int main()
{
initgraph(1024,768); //启动图形库
line(0,0,480,480,BLUE); //画直线
getchar();
closegraph(); //关闭图形库
return 0;
}
在VS2012编译下通过执行,效果如下: