第一篇:二維幾何變換課程設計
二維幾何變化
一:實驗目的
(1)掌握二維平移、比例、旋轉(zhuǎn)幾何變換矩陣(2)掌握矩陣乘法的編程實現(xiàn)
(3)掌握相對于任一參考點的比例變換和旋轉(zhuǎn)變換 二:二維幾何變化基本理論 1.二維平移變換 一般情況:
2.二維比例變換
關于原點的比例變換:
如果想關于某點進行比例變換,可以先平移到這個點,進行比例變換,再平移回來。
3.二維旋轉(zhuǎn)變換 關于原點的旋轉(zhuǎn):
如果想關于某點進行旋轉(zhuǎn)變換,可以先平移到這個點,進行旋轉(zhuǎn)變換,再平移回來。
二:實驗要求
(1)設計包含齊次坐標的二維點類CP2(2)設計二維幾何變換類
(3)設計雙緩沖技術,先在MemDC中繪制,然后用BitBlt將圖形復制到PDC,同時禁止背景刷新
(4)生成多邊形頂點(5)繪制幾何變換圖形(6)使用定時器動態(tài)更新圖形 三:實驗步驟
(1)設計包含齊次坐標的二維點類CP2(2)設計二維幾何變換類
a:二維變換矩陣
b:復合變換矩陣
c:定義二維變換類CtransForm(3)設計雙緩沖(4)讀入圖形頂點(5)繪制圖形(6)定時器函數(shù)(7)禁止背景刷新函數(shù)
四:程序代碼
CTestView::CTestView(){
// TODO: add construction code here directionX=1;directionY=1;directionS=1;R = 30;
translateX=1;translateY=1;
rotate = 1;
scale = 1;} CTestView::~CTestView(){ }
void CTestView::DoubleBuffer(){
int flag=0;CDC * pDC = GetDC();CRect rect;if(scale>2)if(scale<-2)
directionS=-1;);
directionS=1;GetClientRect(&rect);pDC->SetMapMode(MM_ANISOTROPIC);pDC->SetWindowExt(rect.Width(),rect.Height());pDC->SetViewportExt(rect.Width(),-rect.Height());pDC->SetViewportOrg(rect.Width()/2,rect.Height()/2);CDC MemDC;CBitmap NewBitmap,*pOldBitmap;MemDC.CreateCompatibleDC(pDC);NewBitmap.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height()pOldBitmap=MemDC.SelectObject(&NewBitmap);MemDC.SetMapMode(MM_ANISOTROPIC);MemDC.SetWindowExt(rect.Width(), rect.Height());MemDC.SetViewportExt(rect.Width(),-rect.Height());MemDC.SetViewportOrg(rect.Width()/2,rect.Height()/2);ReadPoint();tran.Translate(translateX,translateY);tran.Rotate(rotate,CP2(translateX,translateY));tran.Scale(scale,scale,CP2(translateX,translateY));DrawObject(&MemDC);pDC->BitBlt(-rect.Width()/2,-rect.Height()/2,rect.Width(),rect.HeightMemDC.SelectObject(pOldBitmap);NewBitmap.DeleteObject();MemDC.DeleteDC();ReleaseDC(pDC);
BorderCheck();(),&MemDC,-rect.Width()/2,-rect.Height()/2,SRCCOPY);
} if(P!=NULL){
} delete []P;P=NULL;void CTestView::ReadPoint(){
}
void CTestView::DrawObject(CDC * pDC){
// CLine *line=new CLine;CPen pen(PS_SOLID,1,RGB(255,0,0));pDC->SelectObject(&pen);for(int i=0;i } P[degree].x = 0;P[degree].y = 0;tran.SetMat(P,degree+1);P[i].x=R*cos(i*Dtheta);P[i].y=R*sin(i*Dtheta);// static int y = 0; } { pDC->MoveTo(ROUND(P[degree].x),ROUND(P[degree].y));pDC->LineTo(ROUND(P[i].x),ROUND(P[i].y));pDC->LineTo(ROUND(P[(i+1)%degree].x),ROUND(P[(i+1)%degre} pen.DeleteObject();// delete line;e].y)); void CTestView::OnDraw(CDC* pDC){ } BOOL CTestView::OnPreparePrinting(CPrintInfo* pInfo){ } void CTestView::OnTimer(UINT nIDEvent){ // TODO: Add your message handler code here and/or call default degree = 8;translateX += 1*directionX;translateY += 2*directionY;// default preparation return DoPreparePrinting(pInfo);CTestDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data here SetTimer(1,100,NULL); } rotate += 2;DoubleBuffer();CView::OnTimer(nIDEvent); scale+=0.5*directionS;void CTestView::BorderCheck(){ if(P[degree].x>50) } 五:運行結果 { directionX=-1; } { directionX=1; directionY=1;} directionY=-1; if(P[degree].x<-50) 六:實驗總結 (1)因為首先進行的是平移變換,所以對于比例變換和旋轉(zhuǎn)變換,需要進行相當于右窗格屏幕中的二維幾何變換。 (2)本實驗的“動畫”菜單項的播放按鈕的消息映射是在CMainFrame類中完成的。 二維動畫課程設計: “公益動畫短片” 要求: 1.給Flash動畫配上聲音、音效、音樂,片長時間為1分30秒左右。2.具體劇本內(nèi)容可自己擬定。(備注:延續(xù)動畫概論課程的第二次“畫分鏡頭劇本”的作業(yè),把靜態(tài)分鏡頭畫面完善成動態(tài)的動畫短片)。3.充分運用課程知識,體現(xiàn)運動規(guī)律的合理性,動畫的夸張性; 4.運用分鏡頭畫面的知識來設計鏡頭,使用Flash軟件完成動態(tài)畫面。 5.完成課程設計相關說明,內(nèi)容包括:操作步驟、制作過程中的圖片、制作體會,參考文獻等等,并說明使用的軟件版本。 課程設計說明的格式要求: 第一章 公益動畫短片的設計方案 (參考傳統(tǒng)二維動畫制作流程,完成前期設計階段的描述,要求附上文字劇本、分鏡頭畫面劇本,分鏡頭格式按照之前要求規(guī)范化書寫)第二章 制作步驟 2.1 角色造型與場景造型的設定 2.2 按分鏡頭畫面完成鏡頭的運動與組接,以及場景的轉(zhuǎn)換 2.3 每一個鏡頭中的動畫部分 2.4 聲音、音效、音樂的加入 第三章 總結(心得體會) 6.應交文件:一個光盤【動畫源文件(.fla)、發(fā)布文件(.swf)、課程設計說明文檔電子版】; 一份打印稿紙質(zhì)的文檔; 備注:要自己獨立完成;文件要齊全,裝入課程設計袋中。 第17周星期五(12月28日)交 課 程 設 計(說 明) 題 目 姓 名 學 號 所在學院 專業(yè)班級 指導教師 日 期 年 月 日 計算機圖形學 實驗報告 課程名稱 : 計算機圖形學 實驗名稱 : 圖形繪制與變換 學 院 : 電子信息工程學院 專 業(yè) : 計算機科學與技術 班 級 : 11計科本 01班 學 號 : 111102020103 姓 名 : 張慧 指導教師 : 王征風 二零一四年 目錄 一、引言----------------3 二、設計需求---------3 2.1 設計目標--3 2.2 設計環(huán)境--3 2.2.1 VC++6.0------------------------3 2.2.2 MFC------------------------------4 2.3 設計題目及要求----------------------4 2.4 總體流程圖----------------------------4 三、課程設計原理---5 3.1 實現(xiàn)的算法------------------------------5 3.1.2 Bresenham算法畫直線------5 3.1.3 中心點算法畫圓和橢圓------5 3.2 圖形變換的基本原理------------------7 3.2.1平移變換------------------------7 3.2.2 旋轉(zhuǎn)變換----------------------8 3.2.3 比例變換----------------------8 四、總體設計與功能實現(xiàn)-------------------------8 4.1 主要界面設計---------------------------8 4.2 設置顏色界面---------------------------8 4.2.1 界面設置代碼------------------8 4.2.2 運行結果------------------------9 4.3 二維線畫圖元實現(xiàn)---------------------9 4.4 畫多邊形功能的實現(xiàn)--------------13 4.5 畫Bezier曲線功能的實現(xiàn)-------14 4.6 二維圖形變換的實現(xiàn)--------------16 4.7 三維圖形的變換--------------------17 五、實驗心得體會 一、引言 計算機圖形學(Computer Graphics,簡稱CG)是一種使用數(shù)學算法將二維或三維圖形轉(zhuǎn)化為計算機顯示器的柵格形式的科學。簡單地說,計算機圖形學的主要研究內(nèi)容就是研究如何在計算機中表示圖形、以及利用計算機進行圖形的計算、處理和顯示的相關原理與算法。是計算機科學的一個分支領域,主要關注數(shù)字合成與操作視覺的圖形內(nèi)容。計算機圖形學研究的是應用計算機產(chǎn)生圖像的所有工作,不管圖像是靜態(tài)的還是動態(tài)的,可交互的還是固定的,等等。圖形API是允許程序員開發(fā)包含交互式計算機圖形操作的應用而不需要關注圖形操作細節(jié)或任務系統(tǒng)細節(jié)的工具集。計算機圖形學有著廣泛的應用領域,包括物理、航天、電影、電視、游戲、藝術、廣告、通信、天氣預報等幾乎所有領域都用到了計算機圖形學的知識,這些領域通過計算機圖形學將幾何模型生成圖像,將問題可視化從而為各領域更好的服務。 計算機圖形學利用計算機產(chǎn)生讓人賞心悅目的視覺效果,必須建立描述圖形的幾何模型還有光照模型,再加上視角、顏色、紋理等屬性,再經(jīng)過模型變換、視圖變換、投影操作等,這些步驟從而實現(xiàn)一個完整的OpenGL程序效果。OpenGL是一個開放的三維圖形軟件包,它獨立于窗口系統(tǒng)和操作系統(tǒng),以它為基礎開發(fā)的應用程序可以十分方便地在各種平臺間移植。計算機圖形學通過應用OpenGL的功能,使得生成的圖形效果具有高度真實感。學習計算機圖形學的重點是掌握OpenGL在圖形學程序中的使用方法。事實上,圖形學也把可以表示幾何場景的曲線曲面造型技術和實體造型技術作為其主要的研究內(nèi)容。同時,真實感圖形計算的結果是以數(shù)字圖像的方式提供的,計算機圖形學也就和圖像處理有著密切的關系。 通過21世紀是信息的時代,在日新月異的科技更新中相信計算機會發(fā)揮越來越重要的作用,計算機圖形學也會在更多的領域所應用,雖然我國在這方面還比較薄弱,但相信會有越來越好的時候的。 二、設計需求 2.1 設計目標 以圖形學算法為目標,深入研究。繼而策劃、設計并實現(xiàn)一個能夠表現(xiàn)計算機圖形學算法原理的或完整過程的演示系統(tǒng),并能從某些方面作出評價和改進意見。通過完成一個完整程序,經(jīng)歷策劃、設計、開發(fā)、測試、總結和驗收各階段,達到:鞏固和實踐計算機圖形學課程中的理論和算法;學習表現(xiàn)計算機圖形學算法的技巧;培養(yǎng)認真學習、積極探索的精神。 2.2 設計環(huán)境 2.2.1 VC++6.0 VC++6.0是 Microsoft 公司推出的一個基于 Windows 系統(tǒng)平臺、可視化的 集成開發(fā)環(huán)境,它的源程序按 C++語言的要求編寫,并加入了微軟提供的功能 強大的 MFC(Microsoft Foundation Class)類庫。MFC 中封裝了大部分 Windows API 函數(shù)和 Windows 控件,它包含的功能涉及到整個 Windows 操作系統(tǒng)。MFC 不僅給用戶提供了 Windows 圖形環(huán)境下應用程序的框架,而且還提供了創(chuàng)建應 用程序的組件,這樣,開發(fā)人員不必從頭設計創(chuàng)建和管理一個標準 Windows 應 用程序所需的程序,而是從一個比較高的起點編程,故節(jié)省了大量的時間。另 外,它提供了大量的代碼,指導用戶編程時實現(xiàn)某些技術和功能。因此,使用VC++提供的 高度可視化的應用程序開發(fā)工具和 MFC 類庫,可使應用程序開發(fā)變 得簡單。2.2.2 MFC MFC(Microsoft Foundation Classes),是 一 個 微 軟 公 司 提 供 的 類 庫(class libraries)以 C++類的形式封裝了 Windows 的 API,它包含了窗口等許多類的定義。各種類的集合構成了一個應運程序的框架結構,以減少應用程序開發(fā)人員的工作 量。其中包含的類包含大量 Windows 句柄封裝類和很多 Windows 的內(nèi)建控件和組 件的封裝類。MFC 6.0 版本封裝了大約 200 個類,其中的一些可以被用戶直接使用。例如CWnd 類封裝了窗口的功能,包括打印文本、繪制圖形及跟蹤鼠標指針的移動等;CsplitterWnd 類是從 CWnd 類派生出來的,繼承了基類或稱父類 CWnd 類的所 有特 性,但增加了自己的功能,實現(xiàn)拆分窗口,使窗口至少可被拆分成兩個窗口,用戶 可以移動兩個窗口之間的邊框來改變窗口的大小;CtoolBar 類可以定義工具欄等。MFC 命名的慣例是類的名字通常是由“C”打頭;成員變量使用前綴“m_”,接著使用一個字母來指明數(shù)據(jù)類型,然后是變量的名稱;所有的單詞用大寫字母開頭。 2.3 設計題目及要求 (1)題目:實現(xiàn)多邊形和曲線的繪制和變換 (2)要求:學會使用VC++編寫實現(xiàn)圖形的繪制變換,需包括直線、曲線、多邊形的繪制和變換,及三維立體圖形的相應變換.2.4 總體流程圖 三、課程設計原理 3.1 實現(xiàn)的算法 3.1.1 DDA算法畫直線 DDA是數(shù)字微分分析式(Digital Differential Analyzer)的縮寫。 已知直線兩端點(x1,y1)、(x2,y2)則斜率m為:m =(y2-y1)/(x2-x1)= Dx/Dy;直線中的每一點坐標都可以由前一點坐標變化一個增量(Dx, Dy)而得到,即表示為遞歸式: xi+1=xi+Dx yi+1=yi+Dy。 遞歸式的初值為直線的起點(x1, y1),這樣,就可以用加法來生成一條直線。具體算法是: 該算法適合所有象限,其中用了用了兩個函數(shù)如:Integer(-8.5)=-9;Integer(8.5)=8;Sign(i),根據(jù)i的正負,分別得到-1,0,+1; 相應代碼: //DDA DrawLine {if(abs(x2-x1)> abs(y2-y1)) length = abs(x2-x1); else length = abs(y2-y1); Dx =(x2-x1)/length; Dy =(y2-y1)/length; x = x1+0.5*Sign(Dx); y = x2 + 0.5*Sign(Dy); i = 1; while(i <= lenght) { setpixel(Integer(x),Integer(y),color); x= x + Dx; y= y + Dy; i+=1;} } 3.1.2 Bresenham算法畫直線 思路如下: // 假設該線段位于第一象限內(nèi)且斜率大于0小于1,設起點為(x1,y1),終點為(x2,y2).// 根據(jù)對稱性,可推導至全象限內(nèi)的線段.1.畫起點(x1,y1).2.準備畫下個點。x坐標增1,判斷如果達到終點,則完成。否則,由圖中可知,下個要畫的點要么為當前點的右鄰接點,要么是當前點的右上鄰接點.如果線段ax+by+c=0與x=x1+1的交點的y坐標大于M點的y坐標的話,下個點為U(x1+1,y1+1),否則,下個點為B(x1+1,y1),3.畫點(U或者B).4.跳回第2步.5.結束.3.1.3中心點算法畫圓和橢圓 (1)中心點算法畫圓 在一個方向上取單位間隔,在另一個方向的取值由兩種可能取值的中點離圓的遠近而定。實際處理中,用決策變量的符號來確定象素點的選擇,因此算法效率較高。生成圓弧的中點算 法和上面講到的生成直線段的中點算法類似。 考慮第一象限內(nèi)x?[0,R/2]的八分之一圓弧段。經(jīng)過計算,得出判別式的遞推公式為: di?1?di?2xi?3???di?2(xi?yi)?5d?0d?0 (xi, M SE yi,r)E 這兩個遞推公式的初值條件為: ??(x0,y0,r)?(0,R)?d0?5/4?R 編寫成員函數(shù)如下: void CMy2_9View::MidPointEllipse(CDC *pDC, double a, double b, int color){ double x,y,d,xP,yP,squarea,squareb; squarea=a*a; squareb=b*b; xP=(int)(0.5+(double)squarea/sqrt((double)(squarea+squareb))); yP=(int)(0.5+(double)squareb/sqrt((double)(squarea+squareb))); x=0; y=b; d=4*(squareb-squarea*b)+squarea; pDC->SetPixel(x,y,color); while(x<=xP) {if(d<=0)d+=4*squareb*(2*x+3); else {d+=4*squareb*(2*x+3)-8*squarea*(y-1); y--;} x++; pDC->SetPixel(x,y,color);} x=a; y=0; d=4*(squarea-a*squareb)+squareb; pDC->SetPixel(x,y,color); while(y { if(d<=0)d+=4*squarea*(2*y+3); else {d+=4*squarea*(2*y+3)-8*squareb*(x-1); x--;} y++; pDC->SetPixel(x,y,color);}} 編寫OnDraw函數(shù)如下: void CMy2_9View::OnDraw(CDC* pDC){CMy2_9Doc* pDoc = GetDocument();ASSERT_VALID(pDoc);MidPointEllipse(pDC,500,300,RGB(0,0,0));}(2)中心點算法畫橢圓 我們先考慮圓心在原點的橢圓的生成,對于中心不是原點的橢圓,可以通過坐標的平移變換獲得相應位置的橢圓。中心在原點。焦點在坐標軸上的標準橢圓具有X軸對稱、Y軸對稱和原點對稱特性,已知橢圓上第一象限的P點坐標是(x, y),則橢圓在另外三個象限的對稱點分別是(x,-y)、(-x, y)和(-x,-y)。因此,只要畫出第一象限的四分之一橢圓,就可以利用這三個對稱性得到整個橢圓。 相應代碼: void MP_Ellipse(int xc , int yc , int a, int b){ double sqa = a * a;double sqb = b * b;double d = sqb + sqa *(-b + 0.25);int x = 0;int y = b;EllipsePlot(xc, yc, x, y);while(sqb *(x + 1)< sqa *(y1))* 2-(a * b)* 2;while(y > 0){if(d < 0){ d += sqb *(2 * x + 2)+ sqa *(-2 * y + 3);x++;} else {d += sqa *(-2 * y + 3);} y--;EllipsePlot(xc, yc, x, y);}} 3.2 圖形變換的基本原理 3.2.1平移變換 平移變換函數(shù)如下: void glTranslate{fd}(TYPE x, TYPE y, TYPE z); 三個函數(shù)參數(shù)就是目標分別沿三個軸向平移的偏移量。這個函數(shù)表示用于這三個偏移量生成的矩陣乘以當前矩陣。當參數(shù)是(0.0,0.0,0.0)時,表示對函數(shù)glTranslate*()的操作是單位矩陣,也就是對物體沒有影響。 3.2.2 旋轉(zhuǎn)變換 旋轉(zhuǎn)變換函數(shù)如下: Void glRota{fd}TYPE angle, TYPE x, TYPE y, TYPE z); 函數(shù)中第一個參數(shù)是表示目標沿從點(x,y,z)到原點方向逆時針旋轉(zhuǎn)的角度,后三個參數(shù)是旋轉(zhuǎn)的方向點坐標。這個函數(shù)表示用這四個參數(shù)生成的矩陣乘以當前矩陣。當角度參數(shù)是0.0時,表示對物體沒有影響。3.2.3 比例變換 比例變換函數(shù)如下: Void glScale{fd}(TYPE x, TYPE y, TYPE z); 單個函數(shù)參數(shù)值就是目標分別沿三個軸方向縮放的比例因子。這個函數(shù)表示用這三個比例因子生成的矩陣乘以當前矩陣。這個函數(shù)能完成沿相應的軸對目標進行拉伸、壓縮和反射三項功能。以參數(shù)x為例,若當x大于1.0時,表示沿x方向拉伸目標;若x小于1.0,表示沿x軸方向收縮目標;若x=-1.0表示沿x軸反射目標。其中參數(shù)為負值時表示對目標進行相應軸的反射變換。 四、總體設計與功能實現(xiàn) 4.1 主要界面設計 4.2 設置顏色界面 4.2.1 界面設置代碼: void CGraphicsView::OnClock(){ WHAT_TO_DO=ID_CLOCK; clean();int xx = 450, yy = 300, r = 150,d = 5;int i, white = RGB(255,255,255);mile(xx, yy, r, COLOR);Matrix m(xx, 240), s(xx, 200);Matrix t1(xx, yy, true), t2(-xx,-yy, true), mr(PI/1800), sr(PI/30);mile(m.getx(), m.gety(), d+1, COLOR);mile(s.getx(), s.gety(), d, COLOR);dne(m.getx(), m.gety(), xx, yy, COLOR);dne(s.getx(), s.gety(), xx, yy, COLOR); for(i=0;i<120;i++){ ::Sleep(80); mile(m.getx(), m.gety(), d+1, white);mile(s.getx(), s.gety(), d, white);dne(m.getx(), m.gety(), xx, yy, white);dne(s.getx(), s.gety(), xx, yy, white);m = t1*mr*t2*m;s = t1*sr*t2*s;mile(m.getx(), m.gety(), d+1, COLOR);mile(s.getx(), s.gety(),d, COLOR);dne(m.getx(), m.gety(), xx, yy, COLOR);dne(s.getx(), s.gety(), xx, yy, COLOR);}} 4.2.2 點擊“設置--顏色”后,運行結果如下: 4.3 二維線畫圖元實現(xiàn) 4.3.1 實現(xiàn)代碼: void CGraphicsView::MidCir(CDC *pdc, int x0, int y0, int x1, int y1, int color){ int r,x,y,deltax,deltay,d;r=sqrt(((double)x1-(double)x0)*((double)x1-(double)x0)+((double)y1-(double)y0)*((double)y1-(double)y0));x=0;y=r;deltax=3;deltay=2-r-r;d=1-r;while(x<=y){ ::Sleep(time); pdc->SetPixel(x+x0,y+y0,color); ::Sleep(time); pdc->SetPixel(-x+x0,y+y0,color); ::Sleep(time); pdc->SetPixel(x+x0,-y+y0,color); ::Sleep(time); pdc->SetPixel(-x+x0,-y+y0,color); ::Sleep(time); pdc->SetPixel(y+x0,x+y0,color); ::Sleep(time); pdc->SetPixel(-y+x0,x+y0,color); ::Sleep(time); pdc->SetPixel(y+x0,-x+y0,color); ::Sleep(time); pdc->SetPixel(-y+x0,-x+y0,color); if(d<0) { d+=deltax; deltax+=2; x++;} else { d+=deltax+deltay; deltax+=2; deltay+=2; x++; y--;}}} void CGraphicsView::midellispse(int xx, int yy, int r1, int r2, int color){ } void CGraphicsView::Ellipse(CDC *pdc, int x1, int y1, int x2, int y2, int color){ xx0=(x2+x1)/2;yy0=(y2+y1)/2;rra=abs(x2-x1)/2;rrb=abs(y2-y1)/2;if(rra==0 && rrb==0)return;Ellipse0(pdc,xx0,yy0,rra,rrb,color);} void CGraphicsView::Ellipse0(CDC *pdc, int x0, int y0, int a, int b, int color){ int i,yy;int x,y,deltax,deltay;int aa,aa2,aa3,bb,bb2,bb3;double d1,d2;aa=a*a;aa2=aa*2;aa3=aa*3;bb=b*b;bb2=bb*2;bb3=bb*3;x=0;y=b;d1=bb+aa*(-b+0.25);deltax=bb3;deltay=-aa2*b+aa2;pdc->SetPixelV(x+x0,y+y0,color);pdc->SetPixelV(x+x0,-y+y0,color);while(bb*(x+1) yy=y; if(d1<0) { d1+=deltax; deltax+=bb2; x++;} else { d1+=deltax+deltay; deltax+=bb2; deltay+=aa2; x++; y--;} ::Sleep(time); pdc->SetPixelV(x+x0,y+y0,color); ::Sleep(time); pdc->SetPixelV(-x+x0,y+y0,color); ::Sleep(time); pdc->SetPixelV(x+x0,-y+y0,color); ::Sleep(time); pdc->SetPixelV(-x+x0,-y+y0,color);} d2=bb*(x+0.5)*(x+0.5)+aa*(y-1)*(y-1)-aa*bb;deltax-=bb;deltay+=aa;while(y>0){ if(d2<0) { d2+=deltax+deltay; deltax+=bb2; deltay+=aa2; x++; y--;} else { d2+=deltay; deltay+=aa2; y--;} ::Sleep(time); pdc->SetPixelV(x+x0,y+y0,color); ::Sleep(time); pdc->SetPixelV(-x+x0,y+y0,color); ::Sleep(time); pdc->SetPixelV(x+x0,-y+y0,color); ::Sleep(time); pdc->SetPixelV(-x+x0,-y+y0,color);}} void CGraphicsView::DDALine(CDC *pdc, int x0, int y0, int x1, int y1, int color){ int xx,yy,s,s1,s2,di;float dx,dy,k,x,y;dx=x1-x0;if(dx>=0) s1=1;else s1=-1;dy=y1-y0;if(dy>=0) s2=1;else s2=-1;dx=abs(dx);dy=abs(dy);if(dx>=dy){ s=0; di=(int)dx; k=dy/dx*s2;} else { s=1; di=(int)dy; k=dx/dy*s1;} x=x0;y=y0;for(int i=0;i<=di;i++){if(s==0) { xx=(int)x; yy=(int)(y+0.5); ::Sleep(time); pdc->SetPixel(xx,yy,color); x+=s1; y+=k;} else{ xx=(int)(x+0.5); yy=(int)y; ::Sleep(time); pdc->SetPixel(xx,yy,color); y+=s2; x+=k;}}} 4.3.2 點擊二維線畫圖元,課相應畫出直線、圓和橢圓,結果如下: 4.4 畫多邊形功能的實現(xiàn) 4.4.1 部分實現(xiàn)代碼: void CGraphicsView::OnDrawDuoBX(){ Vertex_Count dlg;if(dlg.DoModal()==IDOK){ if(dlg.m_vertex_count>MAX) { MessageBox(“輸入頂點數(shù)過大”); return;} VertexTotal=dlg.m_vertex_count; CDC *pDC=GetDC(); CPen pen(PS_SOLID,2,RGB(255,255,255)); CPen *pOldpen=pDC->SelectObject(&pen); pDC->MoveTo((int)(inVertexArray[0].x+0.5),(int)(inVertexArray[0].y+0.5)); int i; for(i=1;i pDC->LineTo((int)(inVertexArray[i].x+0.5),(int)(inVertexArray[i].y+0.5)); pDC->LineTo((int)(inVertexArray[0].x+0.5),(int)(inVertexArray[0].y+0.5)); pDC->SelectObject(pOldpen); ReleaseDC(pDC); inLength=0; outLength=0; WHAT_TO_DO=ID_DrawDuoBX;}} 4.4.2 點擊多邊形,輸入定點個數(shù),可繪制出相應的多邊形,結果如下: 4.5 畫Bezier曲線功能的實現(xiàn) 4.5.1 部分實現(xiàn)代碼: void CGraphicsView::OnBezier(){ // TODO: Add your command handler code here WHAT_TO_DO=ID_BEZIER;CDC *p=GetDC(); p->TextOut(10, 20, “PS:鼠標左鍵添加曲線,鼠標右鍵修改曲線.”); ReleaseDC(p);} void CGraphicsView::OnBezierClear(){ n =-1;RedrawWindow();} void CGraphicsView::DrawBezier(DPOINT *p){ if(n <= 0)return;if((p[n].x < p[0].x+1)&&(p[n].x > p[0].x-1)&&(p[n].y < p[0].y+1)&&(p[n].y > p[0].y-1)){ pDC->SetPixel(p[0].x, p[0].y, COLOR); return;} DPOINT *p1;p1 = new DPOINT[n+1];int i, j;p1[0] = p[0];for(i=1;i<=n;i++){ for(j=0;j<=n-i;j++) { p[j].x =(p[j].x + p[j+1].x)/2; p[j].y =(p[j].y + p[j+1].y)/2;} p1[i] = p[0];} DrawBezier(p);DrawBezier(p1);delete p1;} void CGraphicsView::OnBezierAdd(){ AddorMove = 1;} void CGraphicsView::OnBezierMove(){ AddorMove =-1;} void CGraphicsView::OnMouseMove(UINT nFlags, CPoint point){ switch(WHAT_TO_DO){ case ID_BEZIER: { if(current >= 0){ points[current].x = point.x; points[current].y = point.y; RedrawWindow();} if(current2 >= 0) { points[current2].x = point.x; points[current2].y = point.y; RedrawWindow();} break;} default:break;} CView::OnMouseMove(nFlags, point);} 4.5.2 點擊曲線--Beizer曲線,可實現(xiàn)Beizer曲線的繪制功能,繪制結果如下圖: 圖 1 圖 2 4.5.3 點擊曲線--Beizer曲線,可實現(xiàn)Beizer曲線的移動,鼠標點擊其中的任一點,可實現(xiàn)曲線的移動,繪制結果如下圖: 上圖1移動后的曲線 上圖2移動后的曲線 4.6 二維圖形變換的實現(xiàn) 可以實現(xiàn)一橢圓在界面上的隨機移動,一圓在界面上饒某一點的旋轉(zhuǎn)和一正方形由大變小在變大的變化,部分實現(xiàn)代碼如下: void CGraphicsView::OnXuanzhuan(){ WHAT_TO_DO=ID_XUANZHUAN; time=0; OnClear(); CClientDC dc(this);CDC* pDC=&dc; int i, white=RGB(255,255,255), point [2][2]={{300,200},{300,250}}; Matrix a(point[0][0],point[0][1]), b(point[1][0],point[1][1]); int midx=(point[0][0]+point[1][0])/2,midy=(point[0][1]+point[1][1])/2; Matrix t1(midx, midy,true), t2(-midx,-midy,true); Matrix r(PI/50); Matrix temp(midx, midy,true); temp = t1*r*t2; for(i=0;i<200;i++){ ::Sleep(50); MidCir(pDC, a.getx(), a.gety(), b.getx(), b.gety(), white); a = temp*a; b = temp*b; MidCir(pDC, a.getx(), a.gety(), b.getx(), b.gety(), COLOR);} for(i=0;i<200;i++){ ::Sleep(50); MidCir(pDC,a.getx(), a.gety(), b.getx(), b.gety(), white); a = temp*a; b = temp*b; MidCir(pDC, a.getx(), a.gety(), b.getx(), b.gety(), COLOR);} time=5;} void CGraphicsView::OnUpdateXuanzhuan(CCmdUI* pCmdUI){ pCmdUI->SetCheck(WHAT_TO_DO==ID_XUANZHUAN);} void CGraphicsView::OnScale(){ WHAT_TO_DO=ID_SCALE; OnClear();CClientDC dc(this);CDC* pDC=&dc; time=0;int i,white=RGB(255,255,255), point[4][2]={{300,250},{400,250},{300,300},{400,300}};float sx=0.9,sy=0.85;int midx=(point[0][0]+point[3][0])/2,midy=(point[0][1]+point[3][1])/2;Matrix s1(sx,sy),s2(1/sx,1/sy);Matrix t1(midx, midy,true), t2(-midx,-midy,true); Matrix a(point[0][0],point[0][1]), b(point[1][0],point[1][1]);Matrix c(point[2][0],point[2][1]), d(point[3][0],point[3][1]);Matrix temp(midx, midy,true);temp = t1*s1*t2;DDALine(pDC,a.getx(),a.gety(),b.getx(),b.gety(),COLOR);DDALine(pDC,a.getx(),a.gety(),c.getx(),c.gety(),COLOR);DDALine(pDC,c.getx(),c.gety(),d.getx(),d.gety(),COLOR);DDALine(pDC,d.getx(),d.gety(),b.getx(),b.gety(),COLOR);for(i=0;i<20;i++){ ::Sleep(30); DDALine(pDC,a.getx(),a.gety(),b.getx(),b.gety(),white); DDALine(pDC,a.getx(),a.gety(),c.getx(),c.gety(),white); DDALine(pDC,c.getx(),c.gety(),d.getx(),d.gety(),white); DDALine(pDC,d.getx(),d.gety(),b.getx(),b.gety(),white); a=temp*a; b=temp*b; c=temp*c; d=temp*d; DDALine(pDC,a.getx(),a.gety(),b.getx(),b.gety(),COLOR); DDALine(pDC,a.getx(),a.gety(),c.getx(),c.gety(),COLOR); DDALine(pDC,c.getx(),c.gety(),d.getx(),d.gety(),COLOR); DDALine(pDC,d.getx(),d.gety(),b.getx(),b.gety(),COLOR);} temp = t1*s2*t2;for(i=0;i<20;i++){ ::Sleep(30); DDALine(pDC,a.getx(),a.gety(),b.getx(),b.gety(),white); DDALine(pDC,a.getx(),a.gety(),c.getx(),c.gety(),white); DDALine(pDC,c.getx(),c.gety(),d.getx(),d.gety(),white); DDALine(pDC,d.getx(),d.gety(),b.getx(),b.gety(),white); a=temp*a; b=temp*b; c=temp*c; d=temp*d; DDALine(pDC,a.getx(),a.gety(),b.getx(),b.gety(),COLOR); DDALine(pDC,a.getx(),a.gety(),c.getx(),c.gety(),COLOR); DDALine(pDC,c.getx(),c.gety(),d.getx(),d.gety(),COLOR); DDALine(pDC,d.getx(),d.gety(),b.getx(),b.gety(),COLOR);} time=5;} void CGraphicsView::OnUpdateScale(CCmdUI* pCmdUI){ pCmdUI->SetCheck(WHAT_TO_DO==ID_SCALE);} 4.7 三維圖形的變換 主要實現(xiàn)三維圖形的上下左右平移,分別繞X軸Y軸Z軸的旋轉(zhuǎn),放大和縮小,以及正方體六個面的顏色變換,除此之外,還可以選擇背景顏色的改變 4.7.1 部分代碼如下: void CGraphicsView::OnAoduomianti(){ WHAT_TO_DO=ID_AODUOMIANTI;CDrawDLG dlg1;dlg1.DoModal();} void CGraphicsView::OnUpdateAoduomianti(CCmdUI* pCmdUI){ pCmdUI->SetCheck(WHAT_TO_DO==ID_AODUOMIANTI);} void CDrawDLG::OnPaint() { CPaintDC dc(this);// device context for painting CWnd *pWnd=GetDlgItem(IDC_DRAW);pWnd->UpdateWindow();// CDC *PDC=pWnd->GetDC();Draw();} void CDrawDLG::Draw(){ CWnd *pWnd=GetDlgItem(IDC_DRAW);pWnd->UpdateWindow();CDC *pDC=pWnd->GetDC();CRect rect;pWnd->GetClientRect(rect);D v[8]={ {-fs,-fs,fs},{-fs,fs,fs},{fs,fs,fs},{fs,-fs,fs},{-fs,-fs,-fs},{-fs,fs,-fs},{fs,fs,-fs},{fs,-fs,-fs} },d[8]; POINT p0[4],p1[4],p2[4],p3[4],p4[4],p5[4],w[8];int z[8]; for(int i=0;i<8;i++){ d[i].x=v[i].x; d[i].y=(int)(v[i].y*cos(a*DU)-v[i].z*sin(a*DU)); d[i].z=(int)(v[i].y*sin(a*DU)+v[i].z*cos(a*DU)); v[i].x=(int)(d[i].x*cos(b*DU)+d[i].z*sin(b*DU)); v[i].y=d[i].y; v[i].z=(int)(d[i].z*cos(b*DU)-d[i].x*sin(b*DU)); d[i].x=(int)(v[i].x*cos(c*DU)-v[i].y*sin(c*DU)); d[i].y=(int)(v[i].x*sin(c*DU)+v[i].y*cos(c*DU)); d[i].z=v[i].z; w[i].x=d[i].x+cx; w[i].y=d[i].y+cy; z[i]=d[i].z;} p0[0]=w[0];p0[1]=w[1];p0[2]=w[2];p0[3]=w[3];p1[0]=w[4];p1[1]=w[5];p1[2]=w[6];p1[3]=w[7]; p2[0]=w[0];p2[1]=w[1];p2[2]=w[5];p2[3]=w[4];p3[0]=w[1];p3[1]=w[2];p3[2]=w[6];p3[3]=w[5];p4[0]=w[2];p4[1]=w[3];p4[2]=w[7];p4[3]=w[6];p5[0]=w[0];p5[1]=w[3];p5[2]=w[7];p5[3]=w[4];switch(Maxnum(z,7)){ case 0:fill(p0,p2,p5,0,2,5);break; case 1:fill(p0,p2,p3,0,2,3);break; case 2:fill(p0,p3,p4,0,3,4);break; case 3:fill(p0,p4,p5,0,4,5);break; case 4:fill(p1,p2,p5,1,2,5);break; case 5:fill(p1,p2,p3,1,2,3);break; case 6:fill(p1,p3,p4,1,3,4);break; case 7:fill(p1,p4,p5,1,4,5);break;}} BOOL CDrawDLG::OnInitDialog(){ CDialog::OnInitDialog();m_scroll1.SetScrollRange(-180,180);m_scroll1.SetScrollPos(0);m_scroll2.SetScrollRange(-180,180);m_scroll2.SetScrollPos(0);m_scroll3.SetScrollRange(-180,180);m_scroll3.SetScrollPos(0);m_scroll4.SetScrollRange(0,350);m_scroll4.SetScrollPos(200);m_scroll5.SetScrollRange(0,300);m_scroll5.SetScrollPos(115);m_scroll6.SetScrollRange(0.00,300.00);m_scroll6.SetScrollPos(50.00);a=b=c=0;fs=50.00;SetTimer(1,100,NULL);Ctrl=0;cx=200;cy=115;COLOR1=RGB(123,234,43);COLOR2=RGB(123,123,0);COLOR3=RGB(123,24,235);COLOR4=RGB(0,123,95);COLOR5=RGB(23,234,34);COLOR6=RGB(234,124,0);COLOR7=RGB(0,43,98);return TRUE;// return TRUE unless you set the focus to a control} void CDrawDLG::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar){ int nID=pScrollBar->GetDlgCtrlID();switch(nID){ case IDC_SCROLLBAR1: a=pScrollBar->GetScrollPos(); switch(nSBCode) { case SB_LINELEFT: a--;break; case SB_LINERIGHT: a++;break; case SB_PAGELEFT: a-=10;break; case SB_PAGERIGHT: a+=10;break; case SB_THUMBTRACK: a=nPos;break;} if(a<-180)a=180; if(a>180)a=-180; pScrollBar->SetScrollPos(a); break;case IDC_SCROLLBAR2: b=pScrollBar->GetScrollPos(); switch(nSBCode) { case SB_LINELEFT: b--;break; case SB_LINERIGHT: b++;break; case SB_PAGELEFT: b-=10;break; case SB_PAGERIGHT: b+=10;break; case SB_THUMBTRACK: b=nPos;break;} if(b<-180)b=180; if(b>180)b=-180; pScrollBar->SetScrollPos(b); break;case IDC_SCROLLBAR3: c=pScrollBar->GetScrollPos(); switch(nSBCode) { case SB_LINELEFT: c--;break; case SB_LINERIGHT: c++;break; case SB_PAGELEFT: c-=10;break; case SB_PAGERIGHT: c+=10;break; case SB_THUMBTRACK: c=nPos;break;} if(c<-180)c=180; if(c>180)c=-180; pScrollBar->SetScrollPos(c); break;case IDC_SCROLLBAR4: cx=pScrollBar->GetScrollPos(); switch(nSBCode) { case SB_LINELEFT: cx--;break; case SB_LINERIGHT: cx++;break; case SB_PAGELEFT: cx-=10;break; case SB_PAGERIGHT: cx+=10;break; case SB_THUMBTRACK: cx=nPos;break;} if(cx<0)cx=200; if(cx>350)cx=200; pScrollBar->SetScrollPos(cx); break;case IDC_SCROLLBAR5: cy=pScrollBar->GetScrollPos(); switch(nSBCode) { case SB_LINELEFT: cy--;break; case SB_LINERIGHT: cy++;break; case SB_PAGELEFT: cy-=10;break; case SB_PAGERIGHT: cy+=10;break; case SB_THUMBTRACK: cy=nPos;break;} if(cy<0)cy=300; if(cy>300)cy=0; pScrollBar->SetScrollPos(cy); break; case IDC_SCROLLBAR6: fs=pScrollBar->GetScrollPos(); switch(nSBCode) { case SB_LINELEFT: fs--;break; case SB_LINERIGHT: fs++;break; case SB_PAGELEFT: fs-=0.55;break; case SB_PAGERIGHT: fs+=0.55;break; case SB_THUMBTRACK: fs=nPos;break;} if(fs<0)fs=50; if(fs>300)fs=50; pScrollBar->SetScrollPos(fs); break;// UpdateData(FALSE);} // Invalidate();Draw();CDialog::OnHScroll(nSBCode, nPos, pScrollBar);} void CDrawDLG::OnOK(){ KillTimer(1); CDialog::OnOK();} int CDrawDLG::Maxnum(int *p, int n){ int max=p[0];int x;for(int i=0;i<=n;i++){ if(max<=p[i]) { max=p[i];x=i;} } return x;} void CDrawDLG::fill(POINT *x, POINT *y, POINT *z, int i,int j,int q){ CWnd *pWnd=GetDlgItem(IDC_DRAW);pWnd->UpdateWindow();CDC *pDC=pWnd->GetDC();CRect rect;pWnd->GetClientRect(rect); CDC dcmem;dcmem.CreateCompatibleDC(pDC);CBitmap bmp,*oldbmp;bmp.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height());oldbmp=dcmem.SelectObject(&bmp);CBrush brush[6];brush[0].CreateSolidBrush(COLOR1);brush[1].CreateSolidBrush(COLOR2);brush[2].CreateSolidBrush(COLOR3);brush[3].CreateSolidBrush(COLOR4);brush[4].CreateSolidBrush(COLOR5);brush[5].CreateSolidBrush(COLOR6);CBrush *oldbrush=dcmem.SelectObject(&brush[i]);dcmem.FillSolidRect(rect,COLOR7);dcmem.Polygon(x,4);dcmem.SelectObject(&brush[j]);dcmem.Polygon(y,4);dcmem.SelectObject(&brush[q]);dcmem.Polygon(z,4);dcmem.SelectObject(oldbrush);for(int b=0;b<6;b++)brush[b].DeleteObject();pDC->BitBlt(rect.left,rect.top,rect.Width(),rect.Height(), &dcmem,0,0,SRCCOPY);dcmem.SelectObject(oldbmp);bmp.DeleteObject();dcmem.DeleteDC();} 4.7.2 運行結果如下: (1)實現(xiàn)多面體的上下左右平移(2)實現(xiàn)多面體的繞軸旋轉(zhuǎn): (3)實現(xiàn)多面體的放大縮小: (4)實現(xiàn)多面體及背景的顏色設置: (5)三維圖形變換整體圖形 五、實驗心得體會 在本次課程設計過程中,基本掌握了計算機圖形學關于圖形繪制變換的基礎知識,DDA法畫直線和中心點法畫圓及橢圓的方法,還對圖形的變換及需要用到的一系列的函數(shù)有了相應的理解,也了解的很多有關于圖形學中三維圖形的變換的知識。不過都只是皮毛而已,從中鍛煉了自己的動手做實驗的能力,但同時也讓自己看清了自己的水平,以便在以后的生活里多加強有關這方面的學習,從而提升自己在圖形學方面的知識水平。 在本次課程設計中,設計方案存在著很多的死板化的實現(xiàn)方法,也是很不人性化的一點,只提供了畫一種曲線的方法,且畫出的曲線只能移動,此為本次設計方案的不足之一;然后就是能實現(xiàn)曲面和多邊形的繪制,卻沒有對應的實現(xiàn)繪制好圖形后直接對其進行平移、選擇等變換,此為設計方案不足之二。再者就是三維圖形只能實現(xiàn)變換不能實現(xiàn)繪制,此為設計方案不足之三。鑒于個人能力真的有限,所以只能設計出此種級別的效果了。因為實驗重要的只是思想過程,效果的不美觀只能是因為學習的知識還遠遠不夠,所以不能設計出完美的全面的圖形繪制變換程序。 經(jīng)過此次設計,使我學到了很多東西,在沒有開始做程序之前,沒有任何思路,不知道該從哪里入手,可能是因為自己平時不認真聽課的緣故。后來經(jīng)過上網(wǎng)查詢資料,翻閱參考書,在別人做的程序的啟發(fā)下,才有了做此程序設計的眉目。在設計過程中遇到了很多的問題,在這里需要感謝王征風老師的幫助和指導,以及同學的幫助,最后一個個問題都被解決了,寫出了完整的程序設計。最后也發(fā)現(xiàn),其實只要努力,寫出一個設計不是很困難,重要的是自己在寫程序的過程中,要會學習,會查閱資料。這次的課程設計讓我學習到了很多,以后我會努力提高自己在圖形學方面的知識水平。 平移變換在幾何中的應用 平移變換是幾何中的一種重要變換,運用平移變換可以將分散的線段、角或圖形集中到一起,便于問題的研究和解決。這是平移變換中的常用方法,下面僅舉幾例,以作說明。 一、平移變換在幾何證明中的應用 例1.如圖,△ABC中,BD=CE,求證: 【解析】 本題涉及到證明的幾條線段雖然都交于一點,但對于證明這樣一個幾何不等式不是很方便。再有BD=CE,運用平移變換,將△AEC平移到△A’BD的位置,問題迎刃而解。 【答案】 證明:如圖2,分別過點D、B作CA、EA的平行線,G F D E 兩線相交于F點,DF于AB交于G點。 所以,在△AEC和△FBD中,又CE=BD,可證 △AEC≌△FBD,所以AC=FD,AE=FB,在△AGD中,AG+DG>AD,在△BFG中,BG+FG>FB,所以AG+DG-AD>0,BG+FG-FB>0,所以AG+DG+BG+FG-AD-FB>0,即AB+FD>AD+FB,所以 AB+AC>AD+AE .【思考】 本題還有沒有平移其他圖形的方法? 例2.如圖,梯形ABCD中,∠B+∠C=90°,點E、F分別為上下底邊的中點,求證: 【解析】 題目需要證明的幾條線段是分散的,通過平移變換可以將AB、EF、DC集中到一起。此時,其他條件也很能好好地得到應用。 【答案】 證明:分別過點E、F作EG//AB,EH//CD交BC于點G、H 所以四邊形ABGE,DEHC是平行四邊形.AE=BG,DE=CH,因為FB=FC,所以FG=FH= 所以∠EGC=∠B,∠EHB=∠C,又∠B+∠C=90°,所以∠EGC+∠EHB=90°,∠GEH=90° 所以△GEH是直角三角形.所以,EF= 二、平移變換在幾何作圖中的應用 例3.如圖,河流的河岸AB與CD平行,點A、B表示兩個村莊,現(xiàn)要在河上架橋,滿足兩個條件:(1)橋與河岸垂直;(2)A、B兩個村莊之間的線路最短,請問橋應架在何處? 【解析】 不管橋設計在何處,A、B兩個村莊之間的路程中總有一段是河岸間的距離,所以運用平移變換,將河“平移”,使村莊A或B恰好在河岸上。 【答案】 過點A作AA’垂直河岸,且使AA’長度等于河的寬度,連結交河岸于點C,過點C作CD垂直于河岸交河岸于點D,連結AD,則CD為橋的位置。 【思考】 如果A、B兩個村莊之間有兩條互相平行的小河,其他條件不變,橋的位置又該如何確定? 圖3 例4.如圖3,△ABC的三條中線分別為AD、BE、CF.在圖3中利用圖形變換畫出并指明以AD、BE、CF的長度為三邊長的一個三角形(保留畫圖痕跡); 【解析】 以三條中線為邊長的三角形,顯然要對這三條線段進行“重新組合”,手段就是平移變換。 【答案】 三、平移變換在幾何計算中的應用 例5.如圖,六邊形ABCDEF中,對角線 已知FD = cm,BD = cm.問六邊形 ABCDEF的面積是多少平方厘米? 【解析】 題目中給出了很多平行且相等的線段,這就很容易聯(lián)想到平移變換。通過平移變換,將圖形“整形”,從而求出六邊形的面積。 【答案】 如圖,將△DEF平移到△BAG的位置,將△BCD平移到△GAF的位置,則原六邊形分解組合成長方形BDFG.此長方形的邊恰是已知長度的BD與 FD.易知長方形BDFG的面積為 24×28 = 432 cm2.所以,六邊形ABCDEF的面積是432 cm2.例6.已知拋物線與x軸的兩個交點記為A,B,點M在直線上,點P在拋物線上,求當以O、A、P、M為頂點的四邊形為平行四邊形時的P點坐標。 【解析】 本題運用平移變換在平面直角坐標系中的應用,這樣求平行四邊形的頂點坐標將會簡便。因為平行四邊形可以理解為一條線段沿平面內(nèi)某一方向平移所掃過的圖形。 【答案】 ① 若OA為邊,則PM∥OA.設M(m,2m),∵OA=5,∴P(m+5,2m)或P(m-5,2m).當P(m+5,2m)時,∵P點在拋物線上,∴,解得.∴P(12,14).當P(m-5,2m)時,∵P點在拋物線上,∴,解得.∴P(-3,4)或P(20,50).②若OA為對角線,則PM為另一條對角線.[來源:Z&xx&k] ∵OA中點為(,0),設M(m,2m),∴P(5-m,-2m).∵P點在拋物線上,∴,解得.∴P(12,14).綜上,符合條件的P點共有3個,它們分別是P1(12,14)、P2(-3,4)、P3(20,50).【練習】 1.已知,如圖,△ABC中,AB=AC,D是AB上一點,E是AC延長線上一點,若BD=CE,求證:DE>BC.2. 在△HBC中,∠B=∠C,在邊HC上取點D,在邊BH上取點A,使HD=BA,連結AD.求證:AD≥ 3.在△ABC中,點P為BC的中點. (1)如圖1,求證:AP<(AB+BC); (2)延長AB到D,使得BD=AC,延長AC到E,使得CE=AB,連結DE. ①如圖2,連結BE,若∠BAC=60°,請你探究線段BE與線段AP之間的數(shù)量關系.寫出你的結論,并加以證明; ②請在圖3中證明:BC≥DE. 六、語言表達(題型注釋) 1.把下面長句變成三個短句,不改變原意。(4分) 為期三天的從議題設置到活動安排處處體現(xiàn)“立足亞洲、放眼全球”特色以及充分展現(xiàn)作為東道主的中國在與各國分享發(fā)展機遇、促進亞洲共同發(fā)展、求解世界發(fā)展難題等方面的擔當?shù)牟梺喼拚搲?013年年會4月6日拉開帷幕。 2.提取下列材料的要點,整合成一個單句,為“黑洞”下定義。(5分)①黑洞是一種暗天體。 ②它的前身是質(zhì)量比太陽大40倍以上的恒星。 ③這種恒星在超新星爆炸中留下了一個致密的恒星核。④黑洞就是這個致密星核在自身重力下坍縮而成的。 3.將下面的長句改寫為四個短句,可以調(diào)整語序、增刪個別詞語,但不能改變原意。(5分)日前某一科學家和他的團隊歷時多年在青海湖的裸鯉身上找到迄今為止世界上唯一的一種靈敏度高、成本低廉、培養(yǎng)速度快、保存簡單、使用方便并已經(jīng)在上海蘇州河治理、汶川水質(zhì)安全快速檢測中得到驗證的水質(zhì)檢測好材料——非致病的淡水型發(fā)光細菌。答: 4.請根據(jù)下列語句,給“博客”下定義。要求:必須為單句,語序合理,不得丟掉語句中的信息。(可增刪詞語)(4分) ①博客是一種簡便的網(wǎng)站內(nèi)容管理系統(tǒng)。 ②博客的內(nèi)容按時間順序排列,并且在不斷更新。③博客能通過評論等形式實現(xiàn)作者與讀者的交流。④博客能提供符合通用標準的內(nèi)容提要。 5.把下面的長句改寫成幾個短句,可以改變語序或適當增刪詞語,不得改變原意。(5分) 史詩是民間敘事體長詩中一部用詩的語言記敘各民族在特定時期的有關天地形成、人類起源的傳說,以及關于民族遷徙、民族戰(zhàn)爭和民族英雄光輝業(yè)績等重大事件且規(guī)模宏大的形象化的歷史。 6.把下列三個句子,組合成一個單句。(不得改變原意,可以調(diào)換語序,增刪一些詞語)(6分)①敘永縣教育系統(tǒng)在教育局主會場召開主題教育動員大會。 ②此次教育活動的主題為“實現(xiàn)偉大中國夢、建設美麗繁榮和諧四川”。③教育局全體機關職工、城區(qū)中小學校校長和黨務工作者參加了此次會議。 7.將下面一個長句變成四個短句,可增刪詞語,但不得改變原意。(4分) 由推進艙、返回艙、軌道艙和附加段組成的中國 參考答案 1.為期三天的博鰲亞洲論壇2013年年會6日拉開帷幕。本屆年會從議題設置到活動安排,處處體現(xiàn)了立足亞洲、放眼全球的特色。這充分展現(xiàn)出作為東道主的中國在與各國分享發(fā)展機遇、促進亞洲共同發(fā)展、求解世界發(fā)展難題等方面的擔當。(注:一句1分,符合邏輯順序1分。)【解析】 試題分析:這類試題解題的關鍵在于首先找出句子的主干,然后確定各主干成分的修飾語,調(diào)整語序組成小分句,最后根據(jù)邏輯順序確定分句順序。本句主語是“博鰲亞洲論壇”,謂語是“拉開帷幕”。本句特點是主語有多項定語修飾,理順主語修飾語即可整理出答案。考點:語言表達簡明、連貫、得體、準確、鮮明、生動。能力層級為表達運用E 2.黑洞是質(zhì)量比太陽大40倍以上的恒星在超新星爆炸中留下的致密恒星核在自身重力下坍縮而成的暗天體。【解析】 試題分析:本題是一個傳統(tǒng)題型——短句變長句。為“黑洞”下定義,實際是把幾個短句組合為一個長句。可以先選擇其中一個句子(①句)作為主干句,然后把其他幾個句子按照語意邏輯順序去排列,使其共同作為“暗天體”這一賓語的修飾定語即可。考點:選用、仿用、變換句式。能力層級為表達運用E。 3.答案示例:日前某一科學家和他的團隊歷時多年在青海湖的裸鯉身上首次發(fā)現(xiàn)一種非致病的的淡水型發(fā)光細菌。這種細菌是一種水質(zhì)檢測好材料。它靈敏度高、成本低廉、培養(yǎng)速度快、保存簡單、使用方便。已經(jīng)在上海蘇州河治理、汶川水質(zhì)安全快速檢測中得到驗證。【解析】 試題分析:本題是將長句變換成短句,解答這種題首先要找出句子的主語、謂語、賓語、定語、狀語。再將句子的主干組成一個短句,將句子的定語或狀語組成若干個短句。 考點:選用、仿用、變換句式。能力層級為表達運用E。 4.博客是一種內(nèi)容按照時間順序排列,并且不斷更新,可通過評論等形式實現(xiàn)作者與讀者的交流的,能提供符合通用標準的內(nèi)容提要的網(wǎng)站內(nèi)容管理系統(tǒng)。【解析】 試題分析:此題考查句式的變換,把幾個句子組合在一起變成單句。這就要注意單句的結構:??是??。可增刪個別詞語,但不能改變句意。本題包含四個信息:網(wǎng)站內(nèi)容管理系統(tǒng);按照時間順序排列,并且不斷更新;通過評論等形式實現(xiàn)作者與讀者的交流;能提供符合通用標準的內(nèi)容提要。四個信息缺一不可,并且語句要符合邏輯。考點:選用、仿用、變換句式。能力層級為表達運用E 5.①史詩是民間敘事詩中一部規(guī)模宏大的歷史。②它用詩的語言記敘各民族有關天地形成、人類起源的傳說,以及關于民族遷徙、民族戰(zhàn)爭和民族英雄光輝業(yè)績等重大事件。③它是各民族在特定時期的一部形象化的歷史。(①③合并為一句,答案共兩句的,給4分。沒提出主干句的,不給分。句子結構混亂的,不給分。)【解析】 試題分析:解答長句變短句的題目,應先將長句的主干分析出來,之后可將主干列為一句,枝葉列為其他幾句。本題中,材料所給的句子的主語是“史詩”,謂語部分是個比較復雜的、有較長定語的偏正短語,其中心詞是“歷史”,于是,第一個短句即可得出:“史詩是歷史。”以后再對那個較長定于進行分解,化成若干短句。(當然還可有別的劃分法)考點:選用、仿用、變換句式。能力層級為表達運用E。 6.敘永縣教育系統(tǒng)在教育局主會場召開了由教育局全體機關職工、城區(qū)中小學校校長和黨務工作者參加的“實現(xiàn)偉大中國夢、建設美麗繁榮和諧四川”主題教育動員大會。 答案第1頁,總5頁 【解析】 試題分析:這是一道復句變單句題目,此類題目一般先確立句子的主干句,即第①句“緊急避險是一種行為”,然后再把其它幾句,即②③兩句,作為狀語或定語,合理刪減排序后放在賓語之前即可。 考點:選用、仿用、變換句式。能力層級為表達運用E。 7.神舟十號是中國第五艘搭載太空人的飛船,由推進艙、返回艙、軌道艙和附加段組成,它由 長征二號F改進型運載火箭“神箭”發(fā)射升空,將在軌飛行15天。(正確拆分出四個單句2分,語序組織合理2分。)【解析】 試題分析:本題是一個傳統(tǒng)題型——長句變短句。學生可以采用主干分析法:先抽出句子主干“神舟十號飛船將在軌飛行15天”獨立成句,再將附加成分“由推進艙、返回艙、軌道艙和附加段組成”和“中國第五艘搭載太空人”以及“由長征二號F改進型運載火箭“神靜”發(fā)射升空”抽出來單獨成句。這樣整個句子就變換為由四個單句構成的句群。考點:考查變換句式。能力層級為表達運用E。 8.①一代代中國人為著偉大的“中國夢”艱苦奮斗、埋頭苦干。②中國目前已經(jīng)成為世界第二大經(jīng)濟體。③中國經(jīng)濟成就舉世矚目,綜合國力今非昔比。④中國人民生活水平大幅改善,國際影響力迅速攀升。【解析】 試題分析:找準原句主干,先將最核心的意思提取出來,其他成分再依次抽絲剝繭,尤其要注意句中的名詞和動詞的相互搭配。 考點:擴展語句,壓縮語段。能力層級為表達運用E。 9.英國國家檔案館繼去年公開近6000頁不明飛行物(UFO)的檔案后于3月3日再次解密了35份記錄2005年以前軍方和民眾提供的目擊UFO事件的檔案資料。(句子主干1分,狀語1分,定語1分,句意通順1分)【解析】 試題分析:解答把短句變?yōu)殚L句的題目,可先根據(jù)幾個短句的內(nèi)容確定變換后句子的主干,再將各短句內(nèi)容裝入主干中。本題中前兩個句子講的是“英國國家檔案館”的兩次接連動作,因此可考慮用“繼??之后??再次??”的句式,第③句的內(nèi)容則可作為定語嵌入句中。 考點:選用、仿用、變換句式。能力層級為表達運用E。10.《游褒禪山記》是王安石在宋仁宗至和元年34歲時,與兩位朋友和弟弟同游褒禪山后寫的一篇記游并抒發(fā)自己的感想的重要游記 【解析】 試題分析:此類題目要在快速閱讀整段文字,初步感知大體內(nèi)容的基礎上,結合具體語境,根據(jù)上下文的句子結構、邏輯順序等來分析作答。此題可以用“《游褒禪山記》是?的一篇重要游記。”中間可按照人物、時間、地點或者事件的順序來組織。 考點:語言表達簡明、連貫、得體、準確、鮮明、生動。能力層級為表達運用E 11.①我是通過一把劣質(zhì)折扇初識九華山的。 ②這把折扇是由一位到過池州的老前輩帶到鄉(xiāng)間來的。 ③折扇上印著的一幅題為“鳳凰迎客”瀏覽圖與現(xiàn)今常見的游覽圖不同。 【解析】 試題分析:長句變短的方法很多,最基本的一種就是對長附加成分進行處理,比如本句對兩個長定語“一位老前輩帶到鄉(xiāng)間來的”“上面印著一幅與現(xiàn)今常見的游覽圖不同的題目叫 答案第2頁,總5頁 做“鳳凰迎客”瀏覽圖”進行處理,把它分離出來,獨立成句;也可以利用復指的辦法,使句子主干突出,條理清楚;還可以重新組句,重新排序。 考點:語言表達簡明、連貫、得體、準確、鮮明、生動。能力層級為表達運用E。 12.①美國總統(tǒng)奧巴馬于近日簽署一項行政令。②決定解除對使用美國聯(lián)邦政府資金支持胚胎干細胞研究的限制。③這對科學發(fā)展而言是個好消息。【解析】 試題分析:本題考查考生變換句式的能力。變換句式的基本要求是不改變原意。本題是長句變短句,這種變換的基本方法是將原句主干作為一個分句,再將原句包含主謂關系的修飾語變成分句,根據(jù)題干要求,將這幾個分句連綴起來就ok啦。本題是一個復雜單句,主干是“奧巴馬簽署行政令是好消息”,主語是主謂短語“奧巴馬簽署行政令”,行政令的內(nèi)容是“決定解除限制”。把這三個主干基本保持原意地組織起來就是答案了。考點:選用、仿用、變換句式。能力層級為表達運用E。13.①開普勒采用充分利用數(shù)學對觀測結果進行理論分析的方法、建立數(shù)學模型的方法進行研究。②開普勒的研究對近代物理學發(fā)展產(chǎn)生了積極影響。③通過查閱大量資料,研究人員對這一事實有了更全面的認識。【解析】 試題分析:長句變短句方法:①抽出長句的附加成分,變成復句里的分句或單獨成句。②借助復指,把長句的附加成分變?yōu)椴⒘蟹志洌缓笥靡粋€代詞去取代它。③拆開并列的修飾成分,讓其分別同中心詞搭配,形成疊用的句式,變?yōu)閺途淅锏膸讉€分句。考點:考查變換句式。能力層級為表達運用E。 14.聯(lián)合國大會于16日通過了關于敘利亞局勢的決議,該決議與先前在安理會被否決的關于敘利亞問題的決議草案一樣,決議的目的是推動敘利亞內(nèi)部政權更替和全力支持阿拉伯聯(lián)盟的行動方案。【解析】 試題分析:本題是將長句變換成短句,解答這種題首先要找出句子的主語、謂語、賓語、定語、狀語。再將句子的主干組成一個短句,將句子的定語或狀語組成若干個短句。 考點:選用、仿用、變換句式。能力層級為表達運用E。15.組合類新材料作文是指近幾年高考中出現(xiàn)的,由兩個或兩個以上彼此相關的材料復合組成的,表達共同主題的,綜合性較強的材料作文。(每點1分,共5分)【解析】 試題分析:答題時,要以“組合類新材料作文是指??的材料作文”這種句子形式來進行增刪,把內(nèi)容重復的刪去,適當增加句子的銜接詞語,按照“組合類+新材料+作文”的順序進行組織。 考點:語言表達簡明、連貫、得體、準確、鮮明、生動。能力層級為表達運用E 16.世界博覽會是由一個國家的政府主辦的、有多個國家或國際組織參加的,以展現(xiàn)人類在社會、經(jīng)濟、文化和科技領域取得成就的舉辦時間長、展出規(guī)模大、參展國家多、影響深遠的國際性大型展示會。或:世界博覽會是以展現(xiàn)人類在社會、經(jīng)濟、文化和科技領域取得成就為目的,由一個國家的政府主辦的、有多個國家或國際組織參加的舉辦時間長、展出規(guī)模大、參展國家多、影響深遠的國際性大型展示會。【解析】 試題分析:這是一道考查壓縮語段能力的題目。答題時一要合乎書寫“定義”的要求(即用“什么是什么”的形式以一個單句表述,本題可為“世界博覽會是??展示會”的形式),二要符合題干“為‘世界博覽會’下定義”的要求,三要篩選出能體現(xiàn)“世界博覽會”的“必要的”信息,一個也不能少,也不能多。 答案第3頁,總5頁 考點:擴展語句,壓縮語段。能力層級為表達運用E。17.(道德風險指)從事經(jīng)濟活動的人在最大限度地增進自身效用的同時做出的不利于他人的行動。或:(道德風險指)簽 約的一方不完全承擔風險后果時所采取的追求自身效用最大化的自私行為。(單句1分,“道德風險”特征2分,語序恰當1分)【解析】 試題分析:概念的定義必須是一個單句,要通過分析這幾個句子的結構及內(nèi)容來確定這個單句的主干,用簡明扼要的語言進行概括。 考點:語言表達簡明、連貫、得體、準確、鮮明、生動。能力層級為表達運用E。18.(6分)(1)尼采曾把母雞下蛋的啼叫和詩人的歌唱相提并論,說都是“痛苦使然”;(2)中國傳統(tǒng)里有一個痛苦比快樂更能產(chǎn)生詩歌的意見;(3)尼采這個家常而生動的比擬恰恰符合這個意見。【解析】 試題分析:這是一道長句變短句的題目,首先要提出句子主干,然后讓定語和狀語單獨成句即可,斷句要注意先后順序。本句句子主干是“尼采的這個家常而生動的比擬恰恰符合中的意見”定語有“曾把母雞下蛋的啼叫和詩人的歌唱相提并論說都是‘痛苦使然’”“中國傳統(tǒng)里一個痛苦比快樂更能產(chǎn)生詩歌”,考點:選用、仿用、變換句式。能力層級為表達運用E。19.①科學發(fā)展觀是堅持以人為本和經(jīng)濟社會全面協(xié)調(diào)發(fā)展的一種方法論。②它的總體要求是實行統(tǒng)籌兼顧。③它的前提是適合中國國情和順應時代潮流。【解析】 試題分析:這是一道長句變短句的題目,首先要提出句子主干,然后讓定語和狀語單獨成句即可,斷句要注意先后順序。本句句子主干是“科學發(fā)展觀是一種方法論”定語有“適合中國國情和順應時代潮流的前提”“按照統(tǒng)籌兼顧的總體要求”“堅持以人為本和經(jīng)濟社會全面協(xié)調(diào)發(fā)展”,把三個定語中離中心詞最近的一個和句子主干合并。考點:選用、仿用、變換句式。能力層級為表達運用E。 20.(漫畫是)一種常以簡練的線條,通過變形夸張、比擬、象征等手法褒貶現(xiàn)實,具有幽默感和諷刺效果的繪畫。(單句 2分,其他分句轉(zhuǎn)換成定語(意義對即可)并且位置正確各1分,共6分)【解析】 試題分析:此題要從整體上對這些句子進行感知理解漫畫的大意,然后分別從這些分句中,選取有概括性代表性的詞句,按照一定的邏輯順序進行組合排列即可。如可以按照“漫畫是一種?的繪畫”為句子的形式結構,中間添加定語,注意位置符合邏輯即可。考點:擴展語句,壓縮語段。能力層級為表達運用E 21.示例: (1)收錄在魯迅短篇小說集《吶喊》中的中國第一部現(xiàn)代白話文小說《狂人日記》開創(chuàng)了中國新文學的革命現(xiàn)實主義傳統(tǒng)。(或:開創(chuàng)了中國新文學的革命現(xiàn)實主義傳統(tǒng)的中國第一部現(xiàn)代白話文小說《狂人日記》收錄在魯迅的短篇小說集《吶喊》中。) (2)魯迅是開創(chuàng)了中國新文學的革命現(xiàn)實主義傳統(tǒng)的、收錄在他的短篇小說集《吶喊》中的作品《狂人日記》的作者。(或:魯迅是收錄了開創(chuàng)中國新文學的革命現(xiàn)實主義傳統(tǒng)的中國第一部現(xiàn)代白話文小說《狂人日記》的短篇小說集《吶喊》的作者。【解析】 試題分析:先選定一個基本句子,再將其他句子的內(nèi)容作為修飾成分插進這個基本句中。注意改寫完后要檢查是否有語病,同時還要注意區(qū)分“以××為主語”和“用××作為開頭”的句子的區(qū)別。每個句子3分。信息完整,組織合理即可。該句不是長單句不得分,句意不 答案第4頁,總5頁 暢酌情扣分。 考點:變換句式。能力層級為表達運用E。22.(1)全國政協(xié)會議代表們呼吁繼續(xù)提高個稅起征點。(2)3月6日,國家稅務總局某官員表示不可能。(3)個稅起征點提高到3000元已讓納稅人的人數(shù)減少三分之二。(一句1分,不考慮三句的先后順序)【解析】 試題分析:此題考查長句變?yōu)槎叹涞哪芰Γ痤}時,應先明白全句包括所包括的內(nèi)容,再分別組成單句。題中句子包括的內(nèi)容有:國稅總局某官的表示、全國政協(xié)代表的呼吁和個稅起征點的提高所造成的結果三個方面,將此三方面內(nèi)容組成單句即可。考點:選用、仿用、變換句式。能力層級為表達運用E。 23.①2013年3月10日在巴渝文化會館展出的一組作品《巴渝十二景》備受好評。②這組作品取材于巴渝山水的十二處美景。 ③這十二處美景是乾隆年間巴縣知縣王爾鑒以一個外地人的視角總結出來的。 ④這組作品是由重慶著名書法家魏功欽和畫家郭俊根合作并用詩畫結合的方式創(chuàng)作的。【解析】 試題分析:答題時,要先瀏覽一遍長句,然后找出一些代表性的關鍵詞,進行分類。如展出、取材、視角、創(chuàng)作方式四個方面,根據(jù)這四個方面,從長句中刪減詞語組句即可。考點:擴展語句,壓縮語段。能力層級為表達運用E 答案第5頁,總5頁第二篇:二維 動畫課課程設計題目
第三篇:計算機圖形學課程設計 圖形繪制變換分解
第四篇:平移變換幾何證明與計算中的應用
第五篇:長短句變換