|
源代码网推荐
用C语言来实现的DDA和BRESENHAM直线算法代码。
#include <graphics.h> #include <stdio.h> #include <math.h> #include <process.h> /* 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<steps;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); [Page] 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"); 源代码网供稿. |