當前位置:首頁 » 操作系統 » 直線段的裁剪演算法

直線段的裁剪演算法

發布時間: 2022-06-08 09:44:39

『壹』 直線段的裁剪的c語言程序解釋

不是為了趕作業吧?
如果是自學的話,推薦你去看一下:有一本叫《計算機圖形學》的書,上面有這個程序的講解和解釋。

『貳』 計算機圖形學裁剪試驗報告怎麼寫

不知你的要求是什麼我把我報告的一部分關於裁剪的粘給你 裁剪(clipping)是裁去窗口之外物體或物體部分的一種操作。 2.1 直線的剪裁 Cohen-Sutherland演算法;2.2 多邊形的剪裁 Sutlerland_Hodgman演算法2.3 字元串的剪裁 裁剪:確定圖形中哪些部分落在顯示區之內,哪些落在顯示區之外,以便只顯示落在顯示區內的那部分圖形。這個選擇過程稱為裁剪。窗口:畫面上對應於屏幕顯示的那部分區域成為窗口。一般定義為矩形。 2.1 直線的剪裁 直線和窗口的關系可以分為如下3類(圖2.20): ⑴ 整條直線在窗口內。此時,不需剪裁,顯示整條直線。 ⑵ 整條直線在窗口外,此時,不需剪裁,不顯示整條直線。 ⑶ 部分直線在窗口內,部分直線在窗口外。此時,需要求出直線與窗框的交點,並將窗口外的直線部分剪裁掉,顯示窗口內的直線部分。 直線剪裁演算法有兩個主要步驟。首先將不需剪裁的直線挑出,即刪去在窗外的直線。然後,對其餘直線,逐條與窗框求交點,並將窗口外的 部分刪去。 Cohen-Sutherland直線剪裁演算法以區域編碼為基礎,將窗口及其周圍的8個方向以4 bit的二進制數進行編碼。各編碼分別代表窗外上下右左空間的編碼 圖2.21所示的編碼方法將窗口及其鄰域分為5個區域: ⑴ 內域:區域(0000)。 ⑵ 上域:區域(1001, 1000, 1010)。 ⑶ 下域:區域(0101, 0100, 0110)。 ⑷ 左域:區域(1001, 0001, 0101)。 ⑸ 右域:區域(1010, 0010, 0110)。 當線段的兩個端點的編碼的邏輯「與」非零時 ,線段為顯然不可見的 對某線段的兩個端點的區號進行位與運算,可知這兩個端點是否同在視區的上、下、左、右; 演算法的主要思想是,對每條直線P1P2: ⑴ 對直線兩端點P1、P2編碼分別記為C1(P1)={a1, b1, c1, d1},C2(P2)={a2, </p><p>b2, c2, d2}其中,ai、bi、ci、di取值范圍為{1, 0},i∈{1, 2}。⑵ 如果ai=bi=ci=di=0,則顯示整條直線,取出下一條直線,返步驟(1)。否則,進入步驟(3)。⑶如果|a1-a2|=1,則求直線與窗上邊(y=yw-max)的交點,並刪去交點以上部分。如果|b1-b2|=1,|c1-c2= |=1,|d1-d2|=1,作類似處理。⑷ 返步驟(1)。 Cohen-Sutherland演算法——C語言程序 #define LEFT 1 #define RIGHT 2 #define BOTTOM 4 #define TOP 8 int encode(float x,float y) { int c=0; if(x<XL) c|=LEFT; if(x>XR) c|=RIGHT; if(x<YB) c|=BOTTOM; if(x>YT) c|=TOP; retrun c; } void CS_LineClip(x1,y1,x2,y2,XL,XR,YB,YT) float x1,y1,x2,y2,XL,XR,YB,YT;//(x1,y1)(x2,y2)為線段的端點坐標,其他四個參數定義窗口的邊界 { int code1,code2,code; code1=encode(x1,y1); code2=encode(x2,y2); while(code1!=0 ||code2!=0) { if(code1&code2 !=0) return; //位於窗口外 code = code1; if(code1==0) code = code2; if(LEFT&code !=0) //求線段與窗口邊界 //的交點 { x=XL; //左 y=y1+(y2-y1)*(XL-x1)/(x2-x1); } else if(RIGHT&code !=0) { x=XR; //右 y=y1+(y2-y1)*(XR-x1)/(x2-x1); } else if(BOTTOM&code !=0) { y=YB; //下 x=x1+(x2-x1)*(YB-y1)/(y2-y1); } else if(TOP & code !=0) { y=YT; //上 x=x1+(x2-x1)*(YT-y1)/(y2-y1); } if(code ==code1) { x1=x;y1=y; code1 =encode(x,y);} else { x2=x;y2=y; code2 =encode(x,y);} } displayline(x1,y1,x2,y2); //線段位於窗口內 } 2.6.2 多邊形的剪裁 多邊形剪裁演算法的關鍵在於,通過剪裁,要保持窗口內多邊形的邊界部分,而且要將窗框的有關部分按一定次序插入多邊形的保留邊界之間,從而使剪裁後的多邊形的邊仍然保持封閉狀態,以便填色演算法得以正確實現(圖2.22(c))。 Sutherland-Hodgeman演算法—逐次多邊形裁剪演算法 基本思想:通過簡單地一次用窗口的一條邊裁剪多邊形 演算法:(1) 將多邊形表示為頂點表,即{P1,P2,… … Pn-1,Pn }, 並生成邊表P1P2, P2P3, … … Pn-1Pn, PnP1, (2) 用窗口邊裁剪原多邊形,生成中間多邊形(3) 對中間多邊形重復步驟(2), 直至被窗口所有邊裁剪完為止 關鍵:根據多邊形的邊表,逐次對每一段邊與裁剪線(窗口邊)比較,判別輸入頂點的個數和坐標,並聯結成封閉多邊形 實現方法:①設置二個表 輸入頂點表(向量)—用於存放被裁剪多邊形的頂點p1-pm。 輸出頂點表(線性鏈表)—用於存放裁剪過程中及結果的頂點 q1-qn。②輸入頂點表中各頂點要求按一定順序排列,一般可採用順時針或逆時針方向。③相對於裁剪窗口的各條邊界,按頂點表中的順序,逐邊進行裁剪。 具體操作: Pi 若位於邊界線的可見一側,則 Pi 送輸出頂點表 Pi 若位於邊界線的不可見一側,則將其舍棄。 除第一個頂點外,還要檢查每一個 Pi 和前一頂點 Pi-1是否位於窗口邊界的同一側,若不在同一側,則需計算出交點送輸出頂點表。最後一個頂點 Pn則還要與 P1 一起進行同樣的檢查。 裁剪前: 裁剪後:輸入頂點表:p1p2p3p4p5 輸入頂點表: 不變輸出頂點表:空 輸出頂點表: q1q2p3q7q8q5q6q4q3 �6�1考慮窗口的一條邊以及延長線構成的裁剪線該線把平面分成兩個部分:可見一側;不可見一側�6�1多邊形的各條邊的兩端點S、P。它們與裁剪線的位置關系只有四種 2.3 字元串的剪裁 字元串剪裁有3種可選擇的方法。 ⒈ 字元串的有或無剪裁 (all-or-none-text) ⒉ 字元的有或無剪裁 (all-or-none-character) ⒊ 字元的精密剪裁

『叄』 請問怎樣用Cohen-SutherLand演算法做個矩形直線段裁剪的vc++程序

#include <Windows.h>
#include <gl/glut.h>
//////////////////////////////////////////////////////////////////////////
//區域碼
const GLint leftBitCode=0x1;
const GLint rightBitCode=0x2;
const GLint buttonBitCode=0x4;
const GLint topBitCode=0x8;
GLint winWidth=640,winHeight=480;
class screenPT
{
public:
GLfloat x,y;
};
inline GLint inside(GLint code){return GLint(!code);} //判斷點是否在裁剪區內
inline GLint reject(GLint code1,GLint code2){return GLint(code1&code2);} //判斷能否完全排除一條線段
inline GLint accept(GLint code1,GLint code2){return GLint(!(code1 | code2));} //判斷能否完全接受一條線段
inline void swapPT(screenPT& a,screenPT& b){screenPT t=a;a=b;b=t;} //交換兩個點
inline void swapCode(GLubyte& a,GLubyte& b){GLubyte t=a;a=b;b=t;} //交換兩個區域碼
//確定一個點所在位置的區域碼
GLubyte encode(const screenPT& p,const screenPT& winMin,const screenPT& winMax)
{
GLubyte code=0x00;
if(p.x<winMin.x)
code |= leftBitCode;
if(p.x>winMax.x)
code |= rightBitCode;
if(p.y<winMin.y)
code |= buttonBitCode;
if(p.y>winMax.y)
code |= topBitCode;
return code;
}
//在屏幕上畫一條未裁剪的線,由裁剪函數調用
void drawOneLine(const screenPT& a,const screenPT& b)
{
glBegin(GL_LINES);
glVertex2f(a.x,a.y);
glVertex2f(b.x,b.y);
glEnd();
}
//裁剪函數
void lineClip(screenPT winMin,screenPT winMax,screenPT lineBegin,screenPT lineEnd)
{
GLubyte code1,code2; //保存兩個端點的區域碼
GLboolean done=false,plotLine=false; //判斷裁剪是否結束和是否要繪制直線
GLfloat k; //斜率
while(!done)
{
code1 = encode(lineBegin,winMin,winMax);
code2 = encode(lineEnd,winMin,winMax);
if(accept(code1,code2)) //當前直線能完全繪制
{
done=true;
plotLine=true;
}
else
{
if(reject(code1,code2)) //當前直線能完全排除
done = true;
else
{
if(inside(code1)) //若lineBegin端點在裁剪區內則交換兩個端點使它在裁剪區外
{
swapPT(lineBegin,lineEnd);
swapCode(code1,code2);
}
//計算斜率
if(lineBegin.x != lineEnd.x)
k = (lineEnd.y-lineBegin.y)/(lineEnd.x-lineBegin.x);
//開始裁剪,以下與運算若結果為真,
//則lineBegin在邊界外,此時將lineBegin移向直線與該邊界的交點
if(code1 & leftBitCode)
{
lineBegin.y += (winMin.x-lineBegin.x)*k;
lineBegin.x = winMin.x;
}
else if(code1 & rightBitCode)
{
lineBegin.y += (winMax.x-lineBegin.x)*k;
lineBegin.x = winMax.x;
}
else if(code1 & buttonBitCode)
{
if(lineBegin.x != lineEnd.x)
lineBegin.x += (winMin.y-lineBegin.y)/k;
lineBegin.y = winMin.y;
}
else if(code1 & topBitCode)
{
if(lineBegin.x != lineEnd.x)
lineBegin.x += (winMax.y-lineBegin.y)/k;
lineBegin.y = winMax.y;
}
}
}
}
if(plotLine)
drawOneLine(lineBegin,lineEnd); //繪制裁剪好的直線
}
//////////////////////////////////////////////////////////////////////////
void rect(screenPT winMin,screenPT winMax)
{
glBegin(GL_LINE_LOOP);
glVertex2f(winMin.x,winMin.y);
glVertex2f(winMax.x,winMin.y);
glVertex2f(winMax.x,winMax.y);
glVertex2f(winMin.x,winMax.y);
glEnd();
}
void init()
{
glViewport(0,0,winWidth,winHeight);
glClearColor(1.0,1.0,1.0,0.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0,winWidth,0,winHeight);
glMatrixMode(GL_MODELVIEW);
}
void display()
{
screenPT winMin,winMax,lineBegin,lineEnd;
winMin.x=100.0; winMin.y=50.0;
winMax.x=400.0; winMax.y=300.0;
lineBegin.x=0.0; lineBegin.y=0.0;
lineEnd.x=winWidth; lineEnd.y=winHeight;
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(0.0,0.0,0.0);
rect(winMin,winMax); //為裁剪區域繪制一個邊框
lineClip(winMin,winMax,lineBegin,lineEnd);
lineBegin.y=240.0; lineEnd.y=240.0;
lineClip(winMin,winMax,lineBegin,lineEnd);
lineBegin.x=320.0; lineBegin.y=0.0;
lineEnd.x=320.0; lineEnd.y=winHeight;
lineClip(winMin,winMax,lineBegin,lineEnd);
glFlush();
}
int main(int argc,char** argv)
{
glutInit(&argc,argv);
glutInitWindowPosition(100,100);
glutInitWindowSize(winWidth,winHeight);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutCreateWindow("my app");
init();
glutDisplayFunc(display);
glutMainLoop();
return 0;
}

『肆』 推廣裁剪直線段的Cohen-Sutherland演算法,處理裁剪窗口為正六邊形的情況.

參考:

blog.csdn.net/pleasecallmewhy/article/details/8393445


推廣區域碼:

  • 考慮:

    • 矩形窗口區域,可以認為是兩條相互垂直的條帶區域的交集。

    • 使用四位區域編碼,其中每個位用於標記該點是否位於某個條帶的某一側。

    • 符號位的判斷表達式是把端點坐標代入對應條帶邊界方程後化簡得到的。

  • 推廣:

    • 正六邊形區域,可以認為是三條互相成60度的條帶區域的交集。

    • 使用六位區域編碼,其中每個位用於標記該點是否位於某個條帶的某一側。

    • 符號位的判斷表達式同樣是把端點坐標代入對應條帶邊界方程後化簡得到。

推廣區域碼裁剪:

  1. 兩端點區域碼全為0,則在區域內,整體保留。

  2. 兩端點區域碼有為1的相同位,則在對應條帶的同一側,整體丟棄。

  3. 剩餘情況與矩形的情況類同,分側截去區域外線段。


復雜度分析:

  • 原邊界方程平行於坐標軸,計算每位區域碼僅需一次減法運算或無需運算直接比較;推廣後邊界斜率為無理數,需要一次乘法三次減法運算。

  • 原區域碼僅有4位;推廣後有6位。

  • 原區域裁剪計算截點時,x、y其中一個可直接得出,故可以使用兩點式直接推算;推廣後必須解二元一次方程組。

  • 原區域裁剪需要對四個方向分別檢測;推廣後需要對六個方向分別檢測。

『伍』 計算機圖形學中有幾種直線裁剪演算法

計算機圖形學(Computer Graphics,簡稱CG)是一種使用數學演算法將二維或三維圖形轉化為計算機顯示器的柵格形式的科學。

簡單地說,計算機圖形學的主要研究內容就是研究如何在計算機中表示圖形、以及利用計算機進行圖形的計算、處理和顯示的相關原理與演算法。圖形通常由點、線、面、體等幾何元素和灰度、色彩、線型、線寬等非幾何屬性組成。從處理技術上來看,圖形主要分為兩類,一類是基於線條信息表示的,如工程圖、等高線地圖、曲面的線框圖等,另一類是明暗圖,也就是通常所說的真實感圖形。

計算機圖形學一個主要的目的就是要利用計算機產生令人賞心悅目的真實感圖形。為此,必須建立圖形所描述的場景的幾何表示,再用某種光照模型,計算在假想的光源、紋理、材質屬性下的光照明效果。所以計算機圖形學與另一門學科計算機輔助幾何設計有著密切的關系。事實上,圖形學也把可以表示幾何場景的曲線曲面造型技術和實體造型技術作為其主要的研究內容。同時,真實感圖形計算的結果是以數字圖像的方式提供的,計算機圖形學也就和圖像處理有著密切的關系。

圖形與圖像兩個概念間的區別越來越模糊,但還是有區別的:圖像純指計算機內以點陣圖形式存在的灰度信息,而圖形含有幾何屬性,或者說更強調場景的幾何表示,是由場景的幾何模型和景物的物理屬性共同組成的。

計算機圖形學的研究內容非常廣泛,如圖形硬體、圖形標准、圖形交互技術、光柵圖形生成演算法、曲線曲面造型、實體造型、真實感圖形計算與顯示演算法、非真實感繪制,以及科學計算可視化、計算機動畫、自然景物模擬、虛擬現實等。

『陸』 使用VC++實現兩個演算法: (1) 直線段掃描的Brensenham演算法; (2) 直線段裁剪的Cohen-Sutherland演算法.

最佳答案0.0036*0.004 0.0036*400
0.4/0.002 4/0.07
小數點的,先按整數算,然後在結果前面加0,湊夠小數的位數即可
如0.0036*0.004
先按照36*4=144
共有7位小數,
所以結果為0.000144

0.0036*400
36*4=144
結果有兩位小數,
所以為1.44
0.4/0.002
除數的,可以上下同乘以10的n次方,消

『柒』 簡述梁友棟-Barsky線段裁剪演算法的基本思想

利用線段的參數表達形式直接判別落在窗口內的部分線段。
大體上有以下幾步,有些步驟依據中間的判斷結果可以省略或跳轉。
第一步:計算出Qi和Di(i=L,R,B,T)
第二步:看Qi的符號進行判斷
第三步:計算tL=max(0,ti(始邊參數)), tU=min(1,ti(終邊參數))
如果,tU>tL,則可見線段區間[tL,tU]
第四步:利用tL和tU計算端點坐標
實際上很簡單,不要想像的太難。網上有很多博客有介紹,可以看看。

『捌』 如果要用Liang-Barskey演算法實現裁剪,如何修改程序

給你一個完整的Liang-Barskey直線段裁剪演算法的C語言程序

#include "graphics.h"
#include "stdio.h"

#define LINE_COLOR 10
#define WINDOW_COLOR 4

int ClipT(float p,float q,float *u1,float *u2)
{
int flag=1;
float r;
if(p<0.0)
{
r=q/p;
if(r>*u2) flag=0;
else if(r>*u1)
*u1=r;
}
else if(p>0.0)
{
r=q/p;
if(r<*u1) flag=0;
else if(r<*u2)
*u2=r;
}
else if(q<0.0) flag=0;
return flag;
}

void Liang_Barsky(int xL,int yT,int xR,int yB,int x1,int y1,int x2,int y2)
{
float dx,dy,u1,u2;
u1=0.0;u2=1.0;
dx=x2-x1;
if(ClipT(-dx,x1-xL,&u1,&u2))
if(ClipT(dx,xR-x1,&u1,&u2))
{
dy=y2-y1;
if(ClipT(-dy,y1-yT,&u1,&u2))
if(ClipT(dy,yB-y1,&u1,&u2))
{
if(u2<1.0)
{
x2=x1+u2*dx;
y2=y1+u2*dy;
}
if(u1>0.0)
{
x1=x1+u1*dx;
y1=y1+u1*dy;
}
line(x1,y1,x2,y2);
}
}
}

void main(void)
{
int gdriver=DETECT,gmode;
int XL,XR,YB,YT;
int x0,y0,x1,y1;
do
{
registerbgidriver(EGAVGA_driver);
initgraph(&gdriver,&gmode,"");
cleardevice();
printf("\nLiang_Barsky\n");
printf("\n");
printf("Please input the line node(x0,y0,x1,y1):\n");
scanf("%d,%d,%d,%d",&x0,&y0,&x1,&y1);
printf("\n");
cleardevice();
setcolor(LINE_COLOR);
line(x0,y0,x1,y1);
getch();
printf("\nLiang_Barsky\n");
printf("\n");
printf("Please input the rectangle point(XL,YT,XR,YB):\n");
scanf("%d,%d,%d,%d",&XL,&YT,&XR,&YB);
printf("\n");
cleardevice();
line(x0,y0,x1,y1);
setcolor(WINDOW_COLOR);
rectangle(XL,YT,XR,YB);
getch();
cleardevice();
rectangle(XL,YT,XR,YB);
setcolor(LINE_COLOR);
Liang_Barsky(XL,YT,XR,YB,x0,y0,x1,y1);
getch();
printf("\n\n Continue?(y|n?)");
getchar();
}while(getchar()=='y'||getchar()=='Y');
printf("\n");
printf("press any key to end!");
getch();
closegraph();
}

『玖』 計算機圖形學直線段裁剪演算法或二維基本變換演算法,能復制運行的來啊,謝謝大俠們了 啊

#include"graphics.h"
#include"math.h"
typedef struct Point /* 點 */
{
int x;
int y;
}Point;
/* 點的平移變換 */
void PinYi(int * x,int * y,int tx,int ty)
{
*x = *x + tx;
*y = *y + ty;
}
/* 點的旋轉變換 */
void XuanZhuan(int * x,int * y,float q)
{
int m ;
int n;
float Q;
Q = (3.1415926/180)*q;
m = (*x);
n = (*y);
*x = m * cos(Q) - n * sin(Q);
*y = m * sin(Q) + n * cos(Q);
}
void XuanZhuan_RY(int m,int n,int * x,int * y,float q)/* 繞(m,n)的旋轉*/
{

PinYi(x,y,-m,-n);
XuanZhuan(x,y,q);
PinYi(x,y,m,n);
}
void line_dda(int x1,int y1,int x2,int y2 ,COLORREF color)
{
float x = 0.0;
float y = 0.0;
float x3 = ( float )x1;
float y3 = ( float )y1;
float n;
n=( float )( abs( x2-x1 ) >= abs( y2-y1 ) ? abs( x2-x1 ) : abs( y2-y1 ) );
if( n != 0.0 )
{
x=( ( float )( x2-x1 ) ) / n;
y=( ( float )( y2-y1 ) ) / n;
}
while( n >= 0 )
{
putpixel( ( int )x3 , ( int )y3 , color );
x3 += x ;y3 += y ;n -= 1.0;
}
}
void line(Point i,Point j,COLORREF color){
line_dda(i.x,i.y,j.x,j.y,color);
}
Point p[4]={-50,50,50,50,-50,-50,50,-50};
int PY[2]={0,0},XZ=0;
void main()
{
int width=600,height=480;
int zbx=200,zby=200;
COLORREF color=0x00ff00;
char ch;
initgraph(width, height);
ch=getch();
for(int o=0;o<4;o++)
PinYi(&p[o].x,&p[o].y,zbx,zby);
while(ch=getch())
{
PY[0]=0;PY[1]=0;
XZ=0;
switch(ch){
case 'q': XZ--;break;
case 'e': XZ++;break;
case 'w': PY[1]--;break;
case 's': PY[1]++;break;
case 'a': PY[0]--;break;
case 'd': PY[0]++;break;
//default :return 0;
}
for(int o=0;o<4;o++)
{
PinYi(&p[o].x,&p[o].y,PY[0],PY[1]);
PinYi(&zbx,&zby,PY[0],PY[1]);
XuanZhuan_RY(zbx,zby,&p[o].x,&p[o].y,XZ);
}
cleardevice();
line(p[0],p[1],color);
line(p[1],p[2],color);
line(p[2],p[3],color);
line(p[3],p[0],color);
}
}

有個問題是,,旋轉的時候因為π取的3.1415926七位,所以越轉越小!!!
需要改動!!就不弄了,要睡了!!

『拾』 計算機圖形學:線段剪裁中點分割演算法,要求用C++做,急求源代碼啊,謝謝! 752512212

#include <GL/glut.h>#include <stdlib.h>#include "iostream.h"int x0,y0,x1,y1;int Max(int a,int b,int c){ if(a>b) { if(a>c) return a; else return c; } else { if(b>c) return b; else return c; }}int Min(int a,int b,int c){ if(a<b) { if(a<c) return a; else return c; } else { if(b<c) return b; else return c; }}void DrawLine1(int x0,int y0,int x1,int y1){ int d,temp; temp=y0; d=2*(y1-y0)-(x1-x0); glBegin(GL_POINTS); glVertex2d(x0,y0); glEnd(); for(int k=x0+1;k<x1;k++) { if(d>=0) { glBegin(GL_POINTS); glVertex2d(k,temp+1); glEnd(); d=d+2*(y1-y0)-2*(x1-x0); temp=temp+1; } else { glBegin(GL_POINTS); glVertex2d(k,temp); glEnd(); d=d+2*(y1-y0); temp=temp; } } glBegin(GL_POINTS); glVertex2d(x1,y1); glEnd();}void DrawLine2(int x0,int y0,int x1,int y1){ int d,temp; temp=x0; d=2*(x1-x0)-(y1-y0); glBegin(GL_POINTS); glVertex2d(x0,y0); glEnd(); for(int k=y0+1;k<y1;k++) { if(d>=0) { glBegin(GL_POINTS); glVertex2d(temp+1,k); glEnd(); d=d+2*(x1-x0)-2*(y1-y0); temp=temp+1; } else { glBegin(GL_POINTS); glVertex2d(temp,k); glEnd(); d=d+2*(x1-x0); temp=temp; } } glBegin(GL_POINTS); glVertex2d(x1,y1); glEnd();}void DrawTriangle(int x0,int y0,int x1,int y1,int x2,int y2){ int xmin,xmax,ymin,ymax; float a,b,c; xmin=Min(x0,x1,x2); xmax=Max(x0,x1,x2); ymin=Min(y0,y1,y2); ymax=Max(y0,y1,y2); glColor3f(1.0f,0.0f,0.0f); glBegin(GL_POINTS); glVertex2d(x0,y0); glEnd(); glColor3f(0.0f,1.0f,0.0f); glBegin(GL_POINTS); glVertex2d(x1,y1); glEnd(); glColor3f(0.0f,0.0f,1.0f); glBegin(GL_POINTS); glVertex2d(x2,y2); glEnd(); for(float n=ymin;n<=ymax;n++) for(float m=xmin;m<xmax;m++) { a=((y1-y2)*m+(x2-x1)*n+x1*y2-x2*y1)/((y1-y2)*x0+(x2-x1)*y0+x1*y2-x2*y1); b=((y2-y0)*m+(x0-x2)*n+x2*y0-x0*y2)/((y2-y0)*x1+(x0-x2)*y1+x2*y0-x0*y2); c=((y0-y1)*m+(x1-x0)*n+x0*y1-x1*y0)/((y0-y1)*x2+(x1-x0)*y2+x0*y1-x1*y0); if(a>0 && b>0 && c>0) { float color0=a*1.0; float color1=b*1.0; float color2=c*1.0; glColor3f(color0,color1,color2); glBegin(GL_POINTS); glVertex2d(m,n); glEnd(); } } }void display(){/* clear all pixels */ glClear (GL_COLOR_BUFFER_BIT); glColor3f (1.0, 1.0, 1.0); glBegin(GL_POINTS); glVertex2d(x,y); 中間是點的坐標 glEnd(); */ /*下面的語句是畫一個白色的正方形*/ if((y1-y0)/(x1-x0)<=1) { DrawLine1(x0,y0,x1,y1); } else { DrawLine2(x0,y0,x1,y1); } DrawTriangle(35,35,135,185,235,35);/* don't wait! * start processing buffered OpenGL routines */ glFlush ();}void init (void) {/* select clearing color */ glClearColor (0.0, 0.0, 0.0, 0.0);/* initialize viewing values */ glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0, 600, 0, 600);}/* * Declare initial window size, position, and display mode * (single buffer and RGBA). Open window with "hello" * in its title bar. Call initialization routines. * Register callback function to display graphics. * Enter main loop and process events. */int main(int argc, char** argv){ cout<<"input x0,y0,x1,y1 :"<<endl; cin>>x0>>y0>>x1>>y1; glutInit(&argc, argv); glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB); //設置窗口大小,以像素為單位 glutInitWindowSize (600, 600); glutInitWindowPosition (100, 100); glutCreateWindow ("hello");
希望能夠幫助到你,望採納,謝謝!

熱點內容
cl加密狗 發布:2024-11-01 10:28:52 瀏覽:610
php建網站 發布:2024-11-01 10:07:37 瀏覽:566
利用舊電腦搭建自己的私有雲伺服器 發布:2024-11-01 10:07:24 瀏覽:608
dl388p伺服器怎麼換硬碟 發布:2024-11-01 10:02:12 瀏覽:254
雲伺服器可以打游戲嘛 發布:2024-11-01 09:49:49 瀏覽:582
編程聚會 發布:2024-11-01 09:38:51 瀏覽:898
7z壓縮密碼 發布:2024-11-01 09:38:50 瀏覽:660
sql字元串去掉空格 發布:2024-11-01 09:27:27 瀏覽:17
c語言學生通訊錄 發布:2024-11-01 09:26:22 瀏覽:286
門線告警演算法 發布:2024-11-01 09:24:58 瀏覽:522