永发信息网

怎样用C语言绘制直线

答案:2  悬赏:40  手机版
解决时间 2021-08-18 17:15
怎样用C语言绘制直线
最佳答案

【C语言的用MoveTo()和LineTo()】
#include<graphics.h>
#include<math.h>

void myline1(int x1,int y1,int x2,int y2,int color)
{

int iTx;
int iTy;
int iDx;
int iDy;
int iFt;
int iSt;
int iXt;
int iYt;



if(y2<y1)
{
iTx=x1;
x1=x2;
x2=iTx;
iTy=y1;
y1=y2;
y2=iTy;
}
iTx=x2-x1;
iTy=y2-y1;
iDx=1;
iDy=1;
iFt=0;
iSt=iTx+iTy;
if(iTx<0)iSt=-1*iTx+iTy;;
iXt=0;
iYt=0;


while(iSt>0)
{
putpixel(x1+iXt,y1+iYt,color);
if(iTx>=0)
{
if(iFt<0)
{
iYt+=iDy;
iFt+=iTx;
}
else
{
iXt+=iDx;
iFt-=iTy;
}
}
else
{
if(iFt<0)
{
iXt-=iDx;
iFt+=iTy;
}
else
{
iYt+=iDy;
iFt+=iTx;
}
}
iSt--;
}
}

int myline2(int x1,int y1,int x2,int y2,int color)
{
int iX;
int iY;
int iTx;
int iTy;
float fDx;
float fDy;
float fMinf;
float fMaxF;
float fS;
fMinf=0.5;
iX=x1;
iY=y1;
putpixel(x1,y1,color);
if(x1==x2&&y1==y2)
{
return(1);
}
iTx=1;
iTy=1;
fDx=(float)(x2-x1);
fDy=(float)(y2-y1);
fMaxF=fDy/fDx>0?fDy/fDx:(-fDy/fDx);
if(fDx<0)iTx=-1;
if(fDy<0)iTy=-1;
fS=fDx>0?fDx:(-fDx);
if(fMaxF==1)
{
iX=x1;
iY=y1;
while(fS>0)
{
iX+=iTx;
iY+=iTy;
putpixel(iX,iY,color);
fS--;
}
}
else if(fMaxF>1)
{
fS+=fDy>0?fDy:(-fDy);
while(fS>0)
{
iY+=iTy;
putpixel(iX,iY,color);
fMinf+=1/fMaxF;
fS--;
if(fMinf>=1)
{
iX+=iTx;
fMinf--;
putpixel(iX,iY,color);
fS--;
}
}
}
else
{
fS+=fDy>0?fDy:(-fDy);
while(fS>0)
{
iX+=iTx;
putpixel(iX,iY,color);
fMinf+=fMaxF;
fS--;
if(fMinf>=1)
{
iY+=iTy;
fMinf--;
putpixel(iX,iY,color);
fS--;
}
}
}
}


【能够画出任意斜率的直线算法程序】
int dx,dy,incrE,incrNE,d,x,y;


 if ((point[1].x-point[0].x)==0){    //垂直的直线
    x=point[0].x;
    for(y=point[0].y;y<point[1].y;y++)
    pDC->SetPixel(x,y,50);
    }
 else  if(abs((point[1].y-point[0].y)/(point[1].x-point[0].x))<=1){    //斜率 -1到 1 之间
 dx=point[1].x-point[0].x;
 dy=point[0].y-point[1].y;
 d=dx-2*dy;


 incrE=-2*dy;
 incrNE=2*(dx-dy);
 x=point[0].x,y=point[0].y;
 pDC->SetPixel(x,y,50);
  if(point[0].y>point[1].y){    
 while(x<point[1].x)
 {
  if(d>=0){
   d+=incrE;
   x++;
  }
  else
  {d+=incrNE;
  x++;
  y--;
  }
  pDC->SetPixel(x,y,50);
 }
 }
 else if(point[0].y<=point[1].y){
  dy=point[1].y-point[0].y;
  incrE=-2*dy;
 incrNE=2*(dx-dy);
 x=point[0].x,y=point[0].y;
 pDC->SetPixel(x,y,50);
 while(x<point[1].x)
 {
  if(d>=0){
   d+=incrE;
   x++;
  }
  else
  {d+=incrNE;
  x++;
  y++;
  }
  pDC->SetPixel(x,y,50);
 }
 }
 }
 else  {    //斜率 <-1 和  >1的直线
  if(point[1].x>=point[0].x){
  dx=point[1].x-point[0].x;
    dy=point[1].y-point[0].y;
  d=2*dx-dy;
  incrE=2*dx;
    incrNE=2*(dx-dy);
    x=point[0].x,y=point[0].y;
    pDC->SetPixel(x,y,50);
  while(x<point[1].x)
  {
  if(d<0){
   d+=incrE;
 
   y++;
    
  }
  else
  {d+=incrNE;
  pDC->SetPixel(x,y,50);
  x++;
  y++;
  }
 pDC->SetPixel(x,y,50);
  }
 }
  else if((point[1].y-point[0].y)/(point[1].x-point[0].x)<-1){
   dx=point[1].x-point[0].x;
    dy=point[0].y-point[1].y;
  d=2*dx-dy;
  incrE=2*dx;
    incrNE=2*(dx-dy);
    x=point[0].x,y=point[0].y;
    pDC->SetPixel(x,y,50);
  while(y<point[1].y)
  {
  if(d>0){
   d+=incrE;
   y++;
    
  }
  else
  {d+=incrNE;
   x--;
  y++;
  }
 pDC->SetPixel(x,y,50);
  }


  }
 }

全部回答
LZ这个我可以建议你去个网站上看看, http://www.shangxueba.com希望能够找到你满意的答案。。。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
霍儿怎么更换啊
下描写夏至的优美句子,有什么描写夏至的好词
谁能帮忙提供茶叶的基本知识包括它的各种品类
为什么我的QQ抢车位每次上线都停了不车啊
白居易世称什么,白居易被后人称为什么?
QQ黄钻叠加开通问题?
喜欢她,她做不了主、有什么办法??
谁能帮我设计一下店名的?
诺基亚计时器按不出来怎么回事
如何让空间里的花长的更快
这样怎么了,担心是不是怀孕了。
用手机开通10圆会员能创建群不能?怎么用手机
呼兰区哈尔滨鑫鹏包子铺(学院路店)在什么地方
空气净化器销售方案,空气净化器有那些销售方
鬼泣4光盘安装后无法运行游戏??
推荐资讯
--------left before the meeting,it doesn’
西安区牡丹江御质贡茶这个地址在什么地方,我
孝南区孝感食趣石代石锅饭(银泰城)地址在哪里
小孩子1岁的时候应该长几颗牙
房子户型是进门口后两间卧室是向阳的中间是客
向量与三角形的题目
谁帮我找好看的QQ头像,情侣的,闪不闪都可以
林口县牡丹江朗口饮吧地址在哪,我要去那里
QQ对战平台的cs1.6怎么成了这样???
年轻人买摩托车四千至四千五买什么牌子好那款
我蛋痛怎么回事
跪求:贵州铜仁玉屏县丙溪乡有个老寨村芭蕉坪
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?