
C语言中 使用putpixel()绘制直线问题
当斜率大于1时绘制正常,但是斜率在0到1之间的时候画出的是一根平行于x轴的直线。代码如下:/*drawline*/#include<stdio.h>#include<gr...
当斜率大于1时绘制正常,但是斜率在0到1之间的时候画出的是一根平行于x轴的直线。
代码如下:
/* draw line */
#include <stdio.h>
#include <graphics.h>
int main()
{
int graphdriver = DETECT ;
int graphmode ;
float dx,dy;
int x0 = 100 , y0 = 100 , x1 = 500 , y1 = 400;
int x = x0 , y = y0 ;
float k ;//斜率
initgraph( &graphdriver , &graphmode , "" );
cleardevice();
dx = (float)(x1 - x0) ;
dy = (float)(y1 - y0) ;
k = dy/dx;
if( abs(k) < 1 )
{
for( ; x <= x1 ; x++ )
{
putpixel( x+1 , (int)(y+0.5) , 1 );
y = y + k ;
}
}
if( abs(k) >= 1 )
{
for( ; y <= y1 ; y++ )
{
putpixel( (int)(x+0.5) , y , 1 );
x = x + 1/k ;
}
}
getch();
closegraph();
return 0;
}
希望高人解答我出现的问题。为什么k<1是不正常? 展开
代码如下:
/* draw line */
#include <stdio.h>
#include <graphics.h>
int main()
{
int graphdriver = DETECT ;
int graphmode ;
float dx,dy;
int x0 = 100 , y0 = 100 , x1 = 500 , y1 = 400;
int x = x0 , y = y0 ;
float k ;//斜率
initgraph( &graphdriver , &graphmode , "" );
cleardevice();
dx = (float)(x1 - x0) ;
dy = (float)(y1 - y0) ;
k = dy/dx;
if( abs(k) < 1 )
{
for( ; x <= x1 ; x++ )
{
putpixel( x+1 , (int)(y+0.5) , 1 );
y = y + k ;
}
}
if( abs(k) >= 1 )
{
for( ; y <= y1 ; y++ )
{
putpixel( (int)(x+0.5) , y , 1 );
x = x + 1/k ;
}
}
getch();
closegraph();
return 0;
}
希望高人解答我出现的问题。为什么k<1是不正常? 展开
2个回答
展开全部
这是因为C编译器对数据类型强制转化引起的:
对y = y + k来说 , 其中y为int型,k为float型,编译器会将右值强制转换为int型,相当于y=(int)(y+k),那么,在0<k<1的情况下执行y=(int)(y+k)后y值不改变,所以所画为一条平行于x轴的直线;当然,-1<k<0时,执行y=(int)(y+k)后y值减1,此时,画线正常。
建议将y=y+k改为y = y0 + (x-x0)*k.
对y = y + k来说 , 其中y为int型,k为float型,编译器会将右值强制转换为int型,相当于y=(int)(y+k),那么,在0<k<1的情况下执行y=(int)(y+k)后y值不改变,所以所画为一条平行于x轴的直线;当然,-1<k<0时,执行y=(int)(y+k)后y值减1,此时,画线正常。
建议将y=y+k改为y = y0 + (x-x0)*k.
追问
的确是强制转换的问题。
我还有一点疑问是,当k>1时,直线为什么不是连续的,而是间隔着的啊?
呵呵,知道原因了,是abs()用错了,浮点数应该用fabs()
展开全部
这是因为C编译器对数据类型强制转化引起的:
对y
=
y
+
k来说
,
其中y为int型,k为float型,编译器会将右值强制转换为int型,相当于y=(int)(y+k),那么,在0<k<1的情况下执行y=(int)(y+k)后y值不改变,所以所画为一条平行于x轴的直线;当然,-1<k<0时,执行y=(int)(y+k)后y值减1,此时,画线正常。
建议将y=y+k改为y
=
y0
+
(x-x0)*k.
对y
=
y
+
k来说
,
其中y为int型,k为float型,编译器会将右值强制转换为int型,相当于y=(int)(y+k),那么,在0<k<1的情况下执行y=(int)(y+k)后y值不改变,所以所画为一条平行于x轴的直线;当然,-1<k<0时,执行y=(int)(y+k)后y值减1,此时,画线正常。
建议将y=y+k改为y
=
y0
+
(x-x0)*k.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询