1. 程式人生 > >計算機圖形學考試-繪製一條任意線型和線寬的直線。

計算機圖形學考試-繪製一條任意線型和線寬的直線。

程式設計繪製一條任意線型和線寬的直線。(線型、線寬可由使用者指定)

首先我們得了解一下線型和線寬的意思。

線型包括實線、虛線和點線等。線型的顯示在掃描轉換演算法中可通過畫素段的方法實現,即對各種虛線和點線,畫執行緒序沿線路徑輸出一些實線段(劃線),在每兩個劃線之間有一個空白段,劃線和空白段的長度(畫素數目)可用畫素模板指定,畫素模板是由數字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;
}