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是不正常?
展开
 我来答
yifanfeng93
2011-03-04 · TA获得超过147个赞
知道答主
回答量:129
采纳率:0%
帮助的人:0
展开全部
这是因为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.
追问
的确是强制转换的问题。
我还有一点疑问是,当k>1时,直线为什么不是连续的,而是间隔着的啊?

呵呵,知道原因了,是abs()用错了,浮点数应该用fabs()
创作者lUL4sRmVO0
2019-01-16 · TA获得超过3877个赞
知道大有可为答主
回答量:3120
采纳率:31%
帮助的人:179万
展开全部
这是因为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.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式