dda算法c语言,C语言实现的DDA和Bresenham直线算法

#include

#include

#include

#include

/* she ru */

int Round(float a)

{

return (int)(a + 0.5);

}

/* DDA */

void LineWithDDA(int xStart,int yStart,int xEnd,int yEnd)

{

int dx =xEnd - xStart,dy =yEnd - yStart,steps,k;

float xIn, yIn, x = xStart, y = yStart;

if(fabs(dx) > fabs(dy))

{

steps = fabs(dx);

}

else

{

steps = fabs(dy);

}

xIn = (float)dx / (float)steps;

yIn = (float)dy / (float)steps;

putpixel(Round(x),Round(y),2);

for(k=0;k

{

x+=xIn;

y+=yIn;

putpixel(Round(x),Round(y),2);

}

getch();

}

/* |k|<1 */

void LineWithBresenham_One(int xStart,int yStart,int xEnd,int yEnd)

{

int dx = fabs(xEnd -xStart), dy = fabs(yEnd - yStart);

int currentP = 2 * dy - dx;

int twoDy = 2 * dy, twoDySubTwoDx = 2 * (dy - dx);

int x, y;

if(xStart == xEnd)

{

line(xStart,yStart,xEnd,yEnd);

return ;

}

if(yStart == yEnd)

{

line(xStart,yStart,xEnd,yEnd);

return;

}

if(xStart > xEnd)

{

x = xEnd;

y = yEnd;

xEnd = xStart;

}

else

{

x = xStart;

y = yStart;

}

putpixel(x,y,2);

while(x < xEnd)

{

x++;

if(currentP < 0)

{

currentP += twoDy;

}

else

{

y++;

currentP += twoDySubTwoDx;

}

putpixel(x,y,2);

}

getch();

}

/* |k|>1 */

void LineWithBresenham_Two(int xStart,int yStart,int xEnd,int yEnd)

{

int dx = fabs(xEnd -xStart), dy = fabs(yEnd - yStart);

int currentP = 2 * dy - dx;

int twoDx = 2 * dx, twoDxSubTwoDy = 2 * (dx - dy);

int x, y;

if(xStart == xEnd)

{

line(xStart,yStart,xEnd,yEnd);

return ;

}

if(yStart == yEnd)

{

line(xStart,yStart,xEnd,yEnd);

return;

}

if(yStart > yEnd)

{

x = xEnd;

y = yEnd;

yEnd = yStart;

}

else

{

x = xStart;

y = yStart;

}

putpixel(x,y,2);

while(y < yEnd)

{

y++;

if(currentP < 0)

{

currentP += twoDx;

}

else

{

x++;

currentP += twoDxSubTwoDy;

}

putpixel(x,y,2);

}

getch();

}

void InitScreen()

{

clrscr();

printf("\n\n\n\n\n             ***********************************************************\n");

printf("             *                                                         *\n");

printf("             *  This is a graphics system,you can use it to graphics.  *\n");

printf("             *                                                         *\n");

printf("             ***********************************************************\n");

printf("\n\n\n\n                1  Line a line with Bresenham while |k|<1. \n\n");

printf("                2  Line a line with Bresenham while |k|>1. \n\n");

printf("                3  Line a Line with DDA including x>y and x

printf("                0  Exit system.\n\n\n");

printf("                Please select a number:");

}

int main()

{

/* request autodetection */

int gdriver = DETECT, gmode, errorcode;

int xStart, yStart, xEnd, yEnd;

int number;

InitScreen();

flag:scanf("%d",&number);

if(number == 1)

{

printf("                Please input four numbers:");

scanf("%d%d%d%d",&xStart,&yStart,&xEnd,&yEnd);

/* initialize graphics and local  variables */

initgraph(&gdriver, &gmode, "");

/* read result of initialization */

errorcode = graphresult();

if (errorcode != grOk)

{

printf("Graphics error: %s\n", grapherrormsg(errorcode));

printf("Press any key to halt:");

getch();

exit(1); /* terminate with an error code */

}

LineWithBresenham_One(fabs(xStart),fabs(yStart),fabs(xEnd),fabs(yEnd)) ;

closegraph();

InitScreen();

goto flag;

}

else if(number == 2)

{

printf("                Please input four numbers:");

scanf("%d%d%d%d",&xStart,&yStart,&xEnd,&yEnd);

initgraph(&gdriver, &gmode, "");

/* read result of initialization */

errorcode = graphresult();

if (errorcode != grOk)

{

printf("Graphics error: %s\n", grapherrormsg(errorcode));

printf("Press any key to halt:");

getch();

exit(1); /* terminate with an error code */

}

LineWithBresenham_Two(fabs(xStart),fabs(yStart),fabs(xEnd),fabs(yEnd)) ;

closegraph();

InitScreen();

goto flag;

}

else if(number == 3)

{

printf("                Please input four numbers:");

scanf("%d%d%d%d",&xStart,&yStart,&xEnd,&yEnd);

initgraph(&gdriver, &gmode, "");

/* read result of initialization */

errorcode = graphresult();

if (errorcode != grOk)

{

printf("Graphics error: %s\n", grapherrormsg(errorcode));

printf("Press any key to halt:");

getch();

exit(1); /* terminate with an error code */

}

LineWithDDA(fabs(xStart),fabs(yStart),fabs(xEnd),fabs(yEnd)) ;

closegraph();

InitScreen();

goto flag;

}

else if(number == 0)

{

/* abort(); */

exit(0);

}

/* clean up */

/*   getch();

closegraph();

return 0;     */

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值