实验平台:
codeblocks+opencv1.0
划线算法:
划线时考虑三种情况:
1. 当用户输入的起点坐标和终点坐标的x相同时,随着纵坐标增加1,横坐标保持不变,画出一条竖直的线
if(x0==x1&&y0!=y1){
x=x0;y=y0;
for(;y<=y1;x++)
{
imagdraw(x0,y);
y+=1;
}
}
测试结果:
2. 当用户输入的起点坐标和终点坐标的y相同时,随着像素点横坐标增加1,纵坐标保持不变,画出一条水平的线
if(y0==y1&&x0!=x1){
x=x0;y=y0;
for(;x<=x1;x++)
{
imagdraw(x,y0);
x+=1;
}
}
测试结果:
3. 当用户输入的起点坐标和终点坐标的x和y不相同时(即所画直线有斜率),设直线通过点P1(x1,y1)
P2(x2,y2),则直线方程可表示为:K=(y2-y1)/(x2-x1)
,当随着x增加一,将y取近,在y轴方向取离得近的那个像素点。
测试结果:
k = dy/dx;
if(abs(k)>=1)
{
if(y0<=y1)
{
x=x0;
y=y0;
for(;y<=y1;y++)
{
imagdraw(int(x+0.5),y);
x += 1/k;
}
}
else
{
x=x1;y=y1;
for(;y<=y0;y++)
{
imagdraw(int(x+0.5),y);
x += 1/k;
}
}
}
if(abs(k)<1)
{
if(x0<=x1)
{
x=x0;y=y0;
for(;x<=x1;x++)
{
imagdraw(x,int(y+0.5));
y+=k;
}
}
else
{
x=x1;y=y1;
for(;x<=x0;x++)
{
imagdraw(x,int(y+0.5));
y+=k;
}
}
}
}
测试结果: