1. 程式人生 > >圖形學_多邊形掃描轉換_邊界標誌演算法

圖形學_多邊形掃描轉換_邊界標誌演算法

  1 #include "easyx.h"
  2 #include "math.h"
  3 #include "windows.h"
  4 #include "stdio.h"
  5 #include "stdlib.h"
  6 #include "conio.h"
  7 #include "graphics.h"
  8 
  9 int maxx,maxy,minx,miny;   //圖形的邊界
 10 
 11 void dda(int x1,int y1,int x2,int y2)
 12 {
 13     int steps;
 14     double xin,yin,dx,dy,x,y;
15 dx = x2 - x1; 16 dy = y2 - y1; 17 18 19 if(fabs(dx) > fabs(dy)) 20 steps = fabs(dx); 21 else 22 steps = fabs(dy); 23 xin = (double)(dx/steps); 24 yin = (double)(dy/steps); 25 x = x1; 26 y = y1; 27 28 int xfom,yfom; //儲存之前一個的座標
29 putpixel(x,y,RGB(0,0,255)); 30 COLORREF k = RGB(0,0,255); 31 for(int i = 0;i <= steps;i ++) 32 { 33 34 xfom = x; 35 yfom = y; 36 x = x + xin; 37 y = y + yin; 38 39 if(yfom != (int)y) 40 putpixel(x,y,k);
41 42 if((y == maxy) || (y == miny)) 43 putpixel(x,y,RGB(255,255,255)); //處理極值奇點,塗成背景色 44 } 45 46 47 } 48 49 //填充多邊形 50 void filling() 51 { 52 putpixel(maxx,maxy,RGB(255,255,255)); //處理極值奇點,塗成背景色 53 putpixel(minx,miny,RGB(255,255,255)); //處理極值奇點,塗成背景色 54 55 double x1, y1; 56 int in_flag; //指示當前點的狀態是否在邊界內部 57 for(y1 = miny-1 ; y1 <maxy;y1++) 58 { 59 in_flag = 0;//多邊形內部標誌變數 60 for( x1 = minx-1;x1<maxx;x1++) 61 { 62 COLORREF l,m; 63 l = getpixel(x1,y1); 64 m = RGB(0,0,255);//多邊形邊界顏色 65 if (l == m) { 66 if (in_flag == 0) in_flag = 1; 67 else in_flag = 0; 68 } 69 if (in_flag) 70 putpixel(x1,y1,RGB(0,0,255)); 71 //在多邊形內部填充色藍色 72 else 73 putpixel(x1,y1,RGB(255,255,255)); 74 //在多邊形外部填充色白色 75 } 76 } 77 78 } 79 80 81 82 83 84 85 86 int main() 87 { 88 //硬體測試,將gd裝入圖形驅動器,gm置入最大圖形模式。 89 int gd=DETECT,gm; 90 int x[100],y[100]; 91 int n; //代表邊的個數 92 printf("請輸入多邊形邊的個數: "); 93 scanf("%d",&n); 94 printf("\n請依次輸入多邊形每一個點的座標:\n"); 95 scanf("%d%d",&x[0],&y[0]); 96 maxx = x[0]; 97 minx = x[0]; 98 maxy = y[0]; 99 miny = y[0]; 100 for(int i = 1;i < n;i ++) 101 { 102 scanf("%d%d",&x[i],&y[i]); 103 if(maxx < x[i]) //圖形的邊界 104 maxx = x[i]; 105 if(minx > x[i]) 106 minx = x[i]; 107 if(maxy < y[i]) 108 maxy = y[i]; 109 if(miny > y[i]) 110 miny = y[i]; 111 } 112 113 //圖形初始化 114 initgraph(&gd,&gm,"c:\\tc"); 115 //設定蘭背景。 116 setbkcolor(WHITE); 117 cleardevice(); 118 119 for(int j = 1;j < n;j ++) 120 dda(x[j - 1],y[j - 1],x[j],y[j]); 121 dda(x[0],y[0],x[n-1],y[n-1]); 122 123 filling(); //填充多邊形 124 125 getch(); 126 closegraph(); 127 return 0; 128 }