計算機圖形學考試-繪製一條任意線型和線寬的直線。
阿新 • • 發佈:2019-01-08
程式設計繪製一條任意線型和線寬的直線。(線型、線寬可由使用者指定)
首先我們得了解一下線型和線寬的意思。
線型包括實線、虛線和點線等。線型的顯示在掃描轉換演算法中可通過畫素段的方法實現,即對各種虛線和點線,畫執行緒序沿線路徑輸出一些實線段(劃線),在每兩個劃線之間有一個空白段,劃線和空白段的長度(畫素數目)可用畫素模板指定,畫素模板是由數字0和1組成的串,它指出沿線路徑哪些位置要置為前景色,哪些位置不變。例如模板11110000用來顯示劃線長度為4個畫素、空白段為4個畫素的虛線。
線寬選擇的實現取決於輸出裝置的能力。常用的是線刷子和方刷子兩種。線刷子的實現比較簡單。假設直線斜率在【-1,1】之間,這時可以把刷子置成與x軸垂直的方向,刷子的中點對準直線一端點,然後讓刷子中心往直線的另一端移動,即可刷出具有一定寬度的線。
下面是原始碼
#include <stdio.h> #include <conio.h> #include <graphics.h> char xing[8]; void DDALine(int x0,int y0,int x1,int y1,int color,char* xing,int kuan) { int dx,dy,epsl,k,i,p=0; float xIncre,yIncre,x,y; dx = x1 - x0; dy = y1 - y0; x = x0; y = y0; if(abs(dx) > abs(dy)) epsl = abs(dx); else epsl = abs(dy); xIncre = (float)dx / (float)(epsl); yIncre = (float)dy / (float)(epsl); for(k = 0; k < epsl; k++) { if(xing[p] == '0') { p++; if(p == 8) p = 0; x += xIncre; y += yIncre; continue; } p++; if(p == 8) p = 0; if(y0 - y1 <= 0) for(i = 0; i < kuan; i++) { putpixel((int)(x + 0.5),(int)(y + 0.5 + i / 2),color); putpixel((int)(x + 0.5),(int)(y + 0.5 + i / 2),color); } else for(i = 0; i < kuan; i++) { putpixel((int)(x + 0.5 + i / 2),(int)(y + 0.5),color); putpixel((int)(x + 0.5 + i / 2),(int)(y + 0.5),color); } x += xIncre; y += yIncre; } } int main() { int gdriver,gmode; int q,w,e,r; int kuan; printf("E31414042 殷俊\n"); printf("請輸入線寬和線型\n"); scanf("%d %s",&kuan,xing); printf("請輸入端點座標\n"); scanf("%d %d %d %d",&q,&w,&e,&r); gdriver = DETECT; initgraph(&gdriver,&gmode,""); DDALine(q,w,e,r,RED,xing,kuan); getch(); closegraph(); return 0; }