已閱讀5頁,還剩49頁未讀, 繼續(xù)免費閱讀
版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1 鄭州航空工業(yè)管理學院 畢 業(yè) 論 文(設 計) 2013 屆 機械制造與自動化 專業(yè) 1022012 班級 題 目 凹多邊形相似度大小的判別與實現(xiàn) 姓 名 張旺 學號 10221240 指導教師 陳志遠 職稱 副教授 二 一 三 年 5 月 20 日 2 內(nèi) 容 摘 要 凹多邊形作為簡單凸多邊形和復雜多邊形的過度 橋梁,其相似度的判別準則和識別算法的合理性,能有效地解決圖形智能識別的關鍵問題,不但對矢量圖形,而且也可將光柵圖形轉(zhuǎn)化為矢量圖形后, 為基于光柵圖形的矢量化識別與比較提供高效的算法。 本文利用可視化的面向?qū)ο箝_發(fā)工具 Visual C+6.0 和基于 AutoCAD 平臺的 Object ARX 軟件飽滿的支持而開發(fā)的應用程序,借助 Visual C+語言能方便高效地開發(fā)典型 Windows風格的 CAD應用程序,采用參數(shù)化設計的思想,把設計過程中重復出現(xiàn)的步驟全部由程序來完成,這樣大大提高了繪圖速度,同時方便了編輯和操作本 文結合圖文中多邊形的化簡過程與其化簡規(guī)則,提出了多邊形相似性描述的因子,并結合這些因子給出了一個計算相似度的公式,從而提出了一個新的思路,實驗結果表明,該方法簡單有效。 關鍵詞 相似度 ; 多邊形 ; ObjectARX 與 Visual C+;凹多邊形 3 Similarity discriminant concave polygon size and Implementation Author Zhangwang Tutor Chen zhiyuan lecturer Abstract Content Abstract Concave polygon as a simple convex polygons and complex polygons over the bridge, and its similarity criterion of rationality and recognition algorithms, can effectively solve the graphical identification of key issues, not only for vector graphics, but can also be converted to raster graphics after vector graphics, raster graphics to vector-based identification and comparison provides efficient algorithms. In this paper, visual object-oriented development tools, Visual C + +6.0 and AutoCAD platform-based Object ARX software with full support for the development of applications using Visual C + + language can be easily and efficiently develop a typical Windows-style CAD application, the use of parametric design ideas on the design process all the steps are repeated by the program to complete, thereby greatly enhancing the drawing speed, while convenient 4 for graphic editing and manipulation of polygons in this paper, the simplification process and its simplification rules, proposed similar polygons description of the factors, and these factors combined gives a formula for calculating similarity thus proposed a new idea, experimental results show that the method is simple and effective. Keyword Similarity; polygon; ObjectARX and Visual C + +; concave polygon 5 目 錄 1. 緒論 . 7 1.1 相似度的應用背景 . 7 1.2 開發(fā)工具 . 8 2.工具的介紹 . 11 2.1 ObjectARX 功能說明 . 11 2.3 ObjectARX 類庫 . 12 2.3.1 AcDb 庫 . 13 2.4 ObjectARX 數(shù)據(jù) 庫 . 13 2.5 ObjectARX 實體對象 . 14 3. 多邊形 . 16 3.1 凸多邊形定義 . 16 3.2 凸多邊形判別方 法 . 16 3.3 凹多邊形的定義 . 17 3.4 凹多邊形的判別方法 . 17 3.5 簡單多邊形凸凹頂點的識別 . 18 3.6 簡單多邊形方向性的識別方法 . 20 3.7 利用極點順序的多邊形頂點凹凸性判別算法 . 22 4.凹多邊形相似度的分析 . 23 4.1 三角形的相似度 . 23 4.2 多邊形的相似度 . 26 6 4.2.1 凸多邊形相似度 . 27 4.2.2 凹多邊形相似度 . 28 4.3 向量相似度 . 29 5. 程序設計 . 35 6. 結束語 . 38 7. 源程序(見附錄) . 39 7 凹多邊形相似度大小的判別與實現(xiàn) 102201240 張旺 指導教師 陳志遠 講師 1.緒論 1.1 相似度的應用背景 相似性是最常用的、但又不確定的概念之一就人的感知而言,物體的所有可視特征都是識別物 體的依據(jù)但對機器視覺而言,大多數(shù)情況下,僅物體的幾何形狀被利用。因此,對多邊形的研究具有普遍意義 圖像在多邊形近似后,對它的表示和描述是決定其特征是否易于利用的重要方面,它與識別的關系密不可分對多邊形的描述可以采用通用的傅里葉算子、鏈碼、局部曲率值等方法,也可以為特定的用途采用其他方法多邊形的識別已有多種不同的方法提出,主要算法是從模板圖形和對比圖形中分別抽取一系列的特征值構成特征矢量,然后依據(jù)最小均方誤差準則判別它們是否相近。 兩個輪廓的相似度量有基于輪廓上的點的相似度量 和基于角和邊的相 似度量。本文提出了多邊形的三角形劃分、三角形弱劃分、保角劃分的概念和基于這些劃分的多邊形相似度量的新方法。 圖像識別 ,是利用 計算機 對圖像進行處理、分析和理解,以識別各種不同模式的目標和對像的技術。地理學中指將遙感圖像進行分類的技 8 術。 圖形刺激作用于 感覺器官 ,人們辨認出它是經(jīng)驗過的某一圖形的過程 ,也叫 圖像 再認。在圖像識別中 ,既要有當時進入感官的信息 ,也要有記憶中存儲的信息。只有通過存儲的信息與當前的信息進行比較的加工過程,才能實現(xiàn)對圖像的再認。 人的圖像識別能力是很強的。圖像距離的改變或圖像在感覺器官上作用位置的改變,都會造成圖像在 視網(wǎng)膜 上的大小和形狀的改變。即使在這種情況下,人們?nèi)匀豢梢哉J出他們過去知 覺過的圖像。甚至圖像識別可以不受感覺通道的限制。例如,人可以用眼看字,當別人在他背上寫字時,他也可認出這個字來。 矢量化, 計算機中顯示的圖形一般可以分為兩大類 矢量圖 和 位圖 。 矢量圖 使用直線和曲 線來描述圖形,這些圖形的元素是一些點、線、矩形、多邊形、圓和弧線等等,它們都是通過數(shù)學公式計算獲得的。例如一幅花的 矢量圖形 實際上是由線段形成外框輪廓,由外框的顏色以及外框所封閉的顏色決定花顯示出的顏色。由于 矢量圖形 可通過公式計算獲得,所以 矢量圖形文件 體積一般較小。 矢量圖形 最大的優(yōu)點是無論放大、縮小或旋轉(zhuǎn)等不會失真;最大的缺點是難以表現(xiàn)色彩層次豐富的逼真圖像效果。 Adobe公司的 Illustrator、 Corel公司的 CorelDRAW是眾多矢量圖形 設計軟件中的佼佼者。大名鼎鼎的 FlashMX制作 的動畫也是 矢量圖形 動畫。 1.2 開發(fā)工具 關于 AutoCAD應用廣泛重要性 9 CAD,即 Computer Aided Design,是指以計算機為輔助手段完成整個產(chǎn)品設計過程。 AutoCAD是美國 Autodesk公司開發(fā)的通用計算機輔助繪圖、設計系統(tǒng),引起強大的功能,使用上的便利以及良好的開放性,是世界上最為流行的通用 CAD平臺。在國內(nèi)應用非常廣泛,影響深遠,尤其是在建筑和機械行業(yè),擁有強大的應 用和開發(fā)隊伍,幾乎家喻戶曉,堪稱我國的CAD平臺。從 1982年推出的 AutoCAD R1.0到 1997年 7月推出的 AutoCAD R14 for Windows 95/NT,其界面和風格都經(jīng)歷了很大的變化,其中二次開發(fā)技術的不斷更新更是令人注目。 關于開發(fā)工具 ObjectARX ObjectARX 是一個以 C+語言為基礎的面向?qū)ο蟮拈_發(fā)環(huán)境和應用程序接口,開發(fā)人員可以利用這個接口使用、修改和擴展 AutoCAD。用VC+語言編寫的程序經(jīng)過編譯、鏈接,最后生成 ObjectARX應用程序。ObjectARX應 用程序是一個分享 AutoCAD的地址空間,并可以對 AutoCAD直接調(diào)用的動態(tài)鏈接庫。采用可擴展性思想實處的 ObjectARX庫,庫中包含了用于定義新類的宏,提供了對已存在庫中的類進行實施添加新功能的能力。此外,為了使開發(fā)者能根據(jù)自己的需要和能力選擇開發(fā)工具,ObjectARX庫提供了與 ADS、 AutoLISP應用程序相鏈接的接口。 ObjectARX庫中有各種各樣的系列工具,開發(fā)人員可通過 AutoCAD的開放結構,直接對 AutoCAD的數(shù)據(jù)結構,圖形系統(tǒng)和內(nèi)部命令進行操作。 Vc開發(fā)工具 C+這個詞在 中國大陸 的 程序員 圈子中通常被讀做“ C 加加”,而西 10 方的程序員通常讀做“ C plus plus”,“ CPP”。 它是一種使用非常廣泛的 計算機編程語言 。 C+是一種靜態(tài) 數(shù)據(jù)類型 檢查的、支持多重編程范式的通用 程序設計 語言。它支持過程化 程序設計 、 數(shù)據(jù)抽象 、 面向?qū)ο蟪绦蛟O計 、 泛型 程序設計等多種 程序設計風格 。 我們使用 Visual C+6.0軟件作為三維透視圖的開發(fā)工具。 Visual C+語言是一種面向?qū)ο蟮某绦蛟O計語言,同時也是對 C 語言的擴展,它繼承了 C語言功能豐富、表達能力強、使用靈活、目標 程序高效率高、可移植性好等的特性,同時融合了面向?qū)ο蟮哪芰ΓС置嫦驅(qū)ο蟮某绦蛟O計。 Visual C+代表了基于 Windows 的 C+語言產(chǎn)品,它集成了傳統(tǒng)的編程工具,也集成了 Windows中的特殊工具箱,如 MFC(微軟基本類庫 )。 MFC類庫為我們提供了豐富的類資源,特別是 MFC類庫中繪圖類提供了幾乎所有的繪圖函數(shù),功能非常全,為我們進行圖形設計提供了豐富的手段。由于 Visual C+突出的優(yōu)點,使得它在計算機繪圖領域得到了廣泛使用。用 Visual C+語言進行繪圖程序設計具有明顯的優(yōu)越性。一般圖形都 有層次結構,任何復雜的圖形均可用簡單圖素描述。而 C+語言具有指針、結構等的豐富的數(shù)據(jù)類型,同時它的面向?qū)ο蟪绦蛟O計方法使圖素模塊之間的關系變得更加清晰,便于對圖形進行修改、刪除、插入等操作。 下圖 1-2是 Visual C+軟件的開發(fā)環(huán)境。 11 圖 1-2 Visual C+ 6.0的開發(fā)環(huán)境 2.工具的介紹 2.1 ObjectARX 功能說明 ObjectARX 開發(fā)環(huán)境提供了一個面向?qū)ο蟮?C+應用程序接口,開發(fā)人員可以利用接 口使用,修改和擴展 AutoCAD。用 VC+語言編寫的程序經(jīng)過翻譯、鏈接,最后生成 ObjectARX 應用程序。 ObjectARX 應用程序是一個分享 AutoCAD 的地址空間、并可對 AutoCAD 直接調(diào)用的動態(tài)鏈接庫。采用可擴展性思想設計出的 ObjectARX 庫,庫中包含了用于定義新類的宏,提供了對已存在庫中的類進行實時添加新功能的能力。此外,為了使開發(fā)者能根據(jù)自己的需要和能力選擇開發(fā)工具, ObjectARX 庫提供了與 ADS、 AutoLISP應用程序相鏈接的接口。 ObjectARX 庫中有各種各樣 的系列工具,開發(fā)人員可以通過 AutoCAD 的數(shù)據(jù)結構、圖形系統(tǒng)和內(nèi)部命令進行操作。 2.2 ObjectARX 與 Visual C+ ObjectARX 是 Visual C+ 的子集, ObjectARX 并不是獨立的開發(fā) 12 平臺,而是運行于 Visual C+ 平臺之上。在前面的簡介當中已經(jīng)涉及了 ObjectARX 與 Visual C+ 的關系。 ObjectARX 是一個以 C+語言為基礎的面向?qū)ο蟮拈_發(fā)環(huán)境和應用程序接口。 ObjectARX 程序本質(zhì)上為 Windows動態(tài)鏈接庫( DLL) 。 ObjectARX 作為 Visual C+的動態(tài)鏈接庫與其他的動態(tài)鏈接庫有著很大的區(qū)別。 Visual C+當中的其他動態(tài)鏈接庫都是嚴格以 C+語言為基礎,作為 Visual C+ 的一個模塊程序。而ObjectARX 程序在 C+語言的基礎上規(guī)定了自己的語法,它是專門用來對 AutoCAD 進行二次開發(fā)的工具。因此說 ObjectARX 是 Visual C+ 的一個子集。 2.3 ObjectARX 類庫 通常, ObjectARX 提供如下一些庫 ( 1) AcRx 庫,該 庫用于連編應用程序及運行時類注冊和標識的類。 ( 2) AcEd 庫,該庫用于注冊本地命令及系統(tǒng)事件通知的類。 ( 3) AcDb 庫,該庫用于 AutoCAD 數(shù)據(jù)庫類(存放所有的實體及其他類型)。 ( 4) AcGi 庫,該庫用于渲染 AutoCAD 實體的圖形接口。 ( 5) AcGe 庫,該庫用于普通線性代數(shù)和幾何實體通用庫。 ( 6) ADSRX 庫,該庫用于創(chuàng)建 AutoCAD 應用程序的 C 語言庫, ObjectARX 應用程序用這個來實現(xiàn)實體選擇、選擇操作和獲取數(shù)據(jù)。 13 2.3.1 AcDb 庫 AcDb 庫的內(nèi)容較多,它包 含了所有的符號表,如線性、層、文本樣式、尺寸樣式等。每一個 AutoCAD 數(shù)據(jù)庫都有一個有名對象字典AcDbDictionary ,可以用來存放圖形文件中的用戶數(shù)據(jù)。有名對象字典是該庫的一部分, AutoCAD 各實體也是這樣。正如前面所見,它可以對 AutoCAD 編輯器做出響應,也可以響應發(fā)生在 AutoCAD 數(shù)據(jù)庫中對象之間的事件。該庫提供的主要類有: AcDbObject 類負責打開和關閉對象及向 AutoCAD 數(shù)據(jù)庫添加對象。 AcDbDictionary 類允許向數(shù)據(jù)文件中添加用戶數(shù)據(jù),在數(shù)據(jù)字典中幾個 重要的條目是 AutoCAD 的“ groups”和“ mline”樣式。 符號表從其名稱就可以知道他們所包含的內(nèi)容,最主要的大概要算 AcDbBlockTable 了。所有的 AutoCAD 實體都是存放在這個表中的。AcDbBlockTable 中 最 主 要 的 兩 條 記 錄 是 *MODEL_SPACE 記錄和*PAPER_SPACE記錄。 AutoCAD 數(shù)據(jù)庫中所有的實體都屬于這些記錄中的一條。塊的定義也存放在 AcDbBlockTable 中。 最后, AutoCAD中的每一個實體都是從 AdDbEntity中 派生出來的,用戶也可以從 AdDbEntity中派生出自己的實體。 2.4 ObjectARX 數(shù)據(jù)庫 一個 AutoCAD 圖形是儲存于一個數(shù)據(jù)庫中對象的集合。一些基本的數(shù)據(jù)庫對象是實體、符號表和字典,如圖 2-4 AutoCAD 數(shù)據(jù)庫關鍵組件 所示。在數(shù)據(jù)庫中的每個對象均有一個句柄,這個句柄對于特定圖 14 形的上下文之間是惟一的識別標志。在一個 AutoCAD 圖形中,實體是一種特別的數(shù)據(jù)庫對象,它具有圖形表示,例如直線、圓、文本、三維實體、面域、樣條曲線和橢圓。用戶可以在屏幕上看見一個實體并可以操作它。 圖 2-4 AutoCAD數(shù)據(jù)庫關鍵組件 符號表和字典是用來保存數(shù)據(jù)庫對象的容器,兩個容器對象映射一個數(shù)據(jù)庫對象的一個符號名,該符號名為一個文本字符串。一個 AutoCAD 數(shù)據(jù)庫包括一個固定的符號表集,每個符號表均包含一個特定的符號表記錄類的實例。用戶不能向數(shù)據(jù)庫添加一個新的符號表。符號表實例是層表( AcDbLayerTable)和塊表( AcDbBlockTable)的結合,層表中包含有層表記錄,塊表中包含有塊表記錄。所有的 AutoCAD 實 體均為塊表記錄所有。 2.5 ObjectARX 實體對象 一個實體是一個具有圖形表示的數(shù)據(jù)庫對象。實體包括直線、圓、圓弧、文本、面域、三維實體、樣條曲線和橢圓等。 AcDbEntity類是由圖形數(shù)據(jù)庫 塊表 層表 其他符號 命名字典 塊表記錄 層表記錄 符號記錄表 對象 實體 15 ObjectARX類派生而來的。 除了少數(shù)例外,實體一般包括所有必要的幾何信息,少數(shù)實體還包括其他具有幾何信息或?qū)傩缘膶ο?。圖 2-5 顯示了數(shù)據(jù)庫實體的所有關系。 圖 2-5 顯示了數(shù)據(jù)庫實體的所有關系。 AcDbDatabase AcDbBlockTable AcDbBlockTableRecord AcDbBlockBegin AcDbEntity AcDbBlockEnd AcDbxxx Vertex or AcDbFaceRecord or AcDbAttribute AcDbSequenceEnd 16 3.多邊形 由三條或三條以上的線段首位順 次連接所組成的 封閉圖形 叫做多邊形。按照不同的標準,多邊形可以分為正多邊形和非正多邊形、 凸多邊形 及凹多邊形等 。 3.1 凸多邊形定義 凸多邊形又可稱為平面多邊形,是 多邊形 中的一種,與 凹多邊形 相對,一般在中學階段對多邊形的學習只涉及凸多邊形。 所謂凸多邊形,就是把一個多邊形任意一邊向兩方無限延長成為一條 直線 ,如果多邊形的其他各邊均在此直線的同旁,那么這個多邊形就叫做凸多邊形,也可以理解為通過凸多邊形的任意一條邊作平面,并與此多邊形所在的平面相異,那么凸多邊形的其他所有部分都在所作平面的同一側。如圖所示,多邊形 ABCDEF,把線段 AF 向兩方無限延長,此多邊形的其他各邊 AB、 BC、 CD、 DE、 EF 均在此直線的同旁,所以多邊形 ABCDEF是凸多邊形。凸多邊形包含 三角形 和平面四邊形。 3.2 凸多邊形判別方法 1凸多邊形的 內(nèi)角 均小于 180,邊數(shù)為 n( n 為整數(shù)且 n 大于 2)的凸多邊形內(nèi)角 和為( n 2) 180,但任意凸多邊形 外角和 均為360,并可通過反證法證明凸多邊形內(nèi)角中銳角的個數(shù)不能多于 3個。 2凸多邊形所有 對角線 都在內(nèi)部,邊數(shù)為 n的凸多邊形對角線條數(shù)為 n( n 3) /2,其中通過任一頂點可與其余 n 3個頂點連對角線。(如 17 下圖 3-2所示。) 圖 3-2 3.3 凹多 邊形的定義 凹多邊形 (Concave Polygon):至少有一個優(yōu)角 (Reflexive Angle)的多邊形。 把一個各邊不自交的多邊形任意一邊向兩方無限延長成為一直線,如果多邊形的所有邊中只要有一條邊向兩方無限延長成為一直線時,其他各邊不在此直線的同旁,那么這個多邊形就叫做凹多邊形。凹多邊形有一個或多個內(nèi)角大于 180度。 3.4 凹多邊形的判別方法 凹多邊形的內(nèi)角和的解,其實我們可以通過( n-2) 180來計算。實 18 際上是把大于 平角 的角劃分為兩個角(如下圖 3-3所示) 任意一個凸(或凹) N多邊形,都可分畫為 N-2個三角形,因此凹多邊形的內(nèi)角和,也適用 ( N-2) 180這個公式 理由是: ( 1)先把凹多邊形畫分成 N-2個三角形 ( 2)每個三角形的內(nèi)角和為 180度 圖 3-3 3.5 簡單多邊形凸凹頂點的識別 對由拓撲映射關系確定多邊形頂點凸凹性的算法進行深入研究,對多邊形的方向進行預處理,使其按逆時針方向排列,徹底擺脫了先假設 19 多邊形方向后判斷的重復判斷思路,使得算法原理簡單明了,實現(xiàn) 過程容易。本算法采用 C+語言、 Visual Basic 語言混合編程、 Visual Basic 6 O 演示輸出結果。實際運行表明,該算法快捷,運行穩(wěn)定。對由拓撲映射關系確定多邊形頂點凸凹性的算法進行深入研究,對多邊形的方向進行預處理,使其按逆時針方向排列,徹底擺脫了先假設多邊形方向后判斷的重復判斷思路,使得算法原理簡單明了,實現(xiàn)過程容易。本算法采用 C+語言、 Visual Basic語言混合編程、 Visual Basic6.0演示輸出結果。 對由拓撲映射關系確定多邊形頂點凸凹性的算法進行深入研究, 對多邊形的方向進行預處理,使其按逆時針方向排列,徹底擺脫了先假設多邊形方向后判斷的重復判斷思路,使得算法原理簡單明了,實現(xiàn)過程容易。本算法采用 C+語言、 Visual Basic語言混合煽程、 Visual Basic 6 O演示輸出結果。實際運行表明,該算法快捷,運行穩(wěn)定。 為了預測材料內(nèi)含有裂紋時的性能 M. Kacha-nov 等人用細觀力學理論建立了一系列的力學模型,使得當材料中含有圓型、橢圓型、環(huán)形等規(guī)則形狀裂紋時材料的性能預測成為可能。事實上,材料中的裂紋在通常情況下其形狀是相當不規(guī)則的。 CSforecast是針對材料內(nèi)含有不規(guī)則形狀裂紋時,為預測其性能而升發(fā)的軟件。它所依據(jù)的是 M Kachanov的含不規(guī)則形狀裂紋的彈性柔度估算理論。在對不規(guī)則形狀裂紋的處理過程中,由于要對裂紋形狀進行一系列的分形處理,如對由裂紋構成的多邊形的凸凹性及頂點的凸凹性進行頻繁的判斷,因而,研究快速、實 20 用的算法非常必要。國內(nèi)外學者對此進行了大量的研究,歸結起來其判別方法主要有角度法、凸包法以及位置關系法等。角度法是通過逐個計算多邊形各頂點的內(nèi)角,比較內(nèi)角與的大小來判別頂點的凸凹性。由于求取每一個頂點的角度需要計算三角函數(shù),從 而使得計算速度較慢,效率低下且易出現(xiàn)奇異值,實用性較差。凸包法采用分層求凸包的方法交替地篩選出凸點和凹點,該算法的基礎為復雜的凸包計算。位置關系法實質(zhì)上是計算矢量叉積來確定多邊形頂點的凸凹性,這種算法雖然實現(xiàn)簡單,但計算行列式要涉及若干次乘法運算,計算量較大。 通過拓撲映射,把識別頂點凹凸性的問題轉(zhuǎn)換為判斷映射點在映射線上的位置關系問題,為多邊形頂點的凹凸性判斷開拓了一種新的思路。但由于文獻 (51采用了先假設后檢驗的方式,各個頂點要進行二次檢驗,存在著大量的重復計算,使得算法的實現(xiàn)效卒有所降低。本文充分考慮 了簡單多邊形的方向性與頂點凹凸性的聯(lián)系,根據(jù)極值頂點的性質(zhì)預先確定多邊形的方向,對多邊形的走向首先進行預處理,用“多邊形方向性的判別規(guī)則”判斷多邊形的方向,經(jīng)判斷如其為順時針方向則按逆序排列頂點數(shù)據(jù),使多邊形的方向始終為逆時針方向再通過多邊形頂點的坐標確定其拓撲映射點的具體位置。結合以上兩方面對頂點的凹凸性作出判斷,從而避免了大量的重復計算經(jīng)過驗證,其實現(xiàn)過程簡單、效率明顯提高、運行穩(wěn)定可靠。 3.6 簡單多邊形方向性的識別方法 給定一個簡單多邊形,其頂為 Pl一(砥, y;), l-I, 2, 3, n, 21 P。 + - Pl,它的方向是逆時針的還是順時針的,對于判別頂點的凸、凹性起決定性的作用。因而要確定頂點的凸、凹性,首先必須要判別它的方向。具體做法是:先求出給定多邊形的四個極值頂點(由定理知極值頂點為凸硬點),使該多邊形落人由極值頂點構成的矩形區(qū)域內(nèi),然后跟據(jù)該多邊形在每個極值點處與相鄰兩頂點的位置關系來確定該多邊形的方向。 多邊形每個頂點凹凸性的判別,是在多邊形方向已確定的基礎上進行。對于簡單多邊形 P1, P2, Pn,判斷頂點 Pi(1 f n)凹凸性的方法是,取其前后相鄰兩頂點 Pi-1 Pi+與其構 成一個三角形Pi-iPPi+i (PO=Pn, Pn+l=P1),如果該三角形的方向與簡單多邊形的方向一致,則頂點 Pi為凸項點,若相反則頂點 Pi為凹項點。 對于三角形方向的確定可以采用和多邊形方向確定類似的方法,找出其 4個極點 最左點 Pa,最右點 Pb,最下點 Pe,最上點 Pd。此時口、 6、 c、 d的 4個值有以下兩種情況。 (1)口、 6、 c、 d其中有且僅有兩個值相等此時可按照表所列規(guī)別對三角形方向進行判別。 (2)口、 6、 c、 d其中有兩對值相等( a-c, b=d或者口 =Z 6=c) 在此種情況下,將最左或最右極點( 不妨取最左點)變換為邊 PaPb的中點 M, M點的 x, y坐標分別為 Pa和 Pb相應坐標和的一半,用 M點替換最左點顯然也不會改變?nèi)切蔚姆较?,進而對新三角形進行方向判 22 別,如圖 3-6所示。 圖 3-6 3.7 利用極點順序的多邊形頂點凹凸性判別算法 提出一種根據(jù)多邊形各個極點在頂點序列中的先后順序確定多邊形方向的算法。對于多邊形頂點凹凸性的判別,提出通過確定某個頂點與其相鄰兩頂點構成三角形的方向,進而利用多邊形方向與該三角形方向是否相同而確定該頂點凹凸性的方法。該算法包括了點包含的判別。試驗表明,該算法不合乘法運 算,使運算高效穩(wěn)定。 筒單多邊形的方向、頂點凹凸性及點包含的判別,是計算機圖形學中的一個基本問題,由于在模式識別、圖像處理和地理信息等眾多領域都有廣泛的應用,所以判別方法的效率和穩(wěn)定性具有重要的研究價值。對此不少學者做了許多研究,提出了多種判別方法??偟膩碚f對簡單多邊形方向的確定主要有有向面積法和叉積法,但都要進行 3階行列式的計算,缺點是計算量較大。對頂點凹凸性的判別方法較多,有角度法、 23 有向面積法、叉積法、拓撲映射法以及基于邊向量斜率比較的方法等,但這些方法也都要進行耗時較多的乘法運算。對點包含的判別方法主 要有射線法和標號法。作者提出一種基于極點順序?qū)Χ噙呅雾旤c凹凸性進行判別的新算法,可以在沒有乘法運算的情況下,僅通過判斷運算就可確定多邊形方向,進而可判斷出頂點的凹凸性以及點與多邊形的包含關系。如圖 3-7所示。 圖 3-7 4.凹多邊形相似度的分析 4.1 三角形的相似度 對應角相等,對應邊成比例的兩個三角形叫做相似三角形。( similar triangles)互為相似形的三角形叫做相似三角形。例如下圖 4中,若BC/BC,那么角 B=角 B,角 BAC=角 CAB,是對頂角,那么我們就說 ABC ABC 24 圖 4-1 取論域 U = (A, B, C)|A+B+C= , A、 B、 C是三角形的三內(nèi)角。把等腰三角形、直角三角形、等邊三角形分別記作 I( ABC)、 R( ABC)、 E( ABC)簡記 J, R、 E。首先討論一個給定三角形與特殊三角形 J、 R、E的相似度量問題,然后給出兩個任意三 角形的相似度量。 近似等腰三角形、近似直角三角形及近似等邊三角形分別是論域 U上的一個模糊子集,分別記作 I( ABC)、 R( ABC)、 E( ABC);簡記 I、R、 E。 I, R, E中的元素對 I , R, E的相似度量記作 I( ABC)、 R( ABC)和 E( ABC),它們的相似度量規(guī)定為 I( ABC)=1一 (3 )min|A B|, |B C|, |C A|); ABC I, R( ABC)=1一 (2 )min|A 一 , 2|, |B 一 , 2|, |C一 2| ABC R E( ABC)= 1一 (1 )max|A B|, |B C|, |C A|; ABC 25 E 給定任意兩個三角形 x, y,其中: x的三個內(nèi)角為 A 、 B、 C; y的三個內(nèi)角為 A 、 B 、 C , X 和 y的相似度量為 ( x, y )=max P 1一 ( 1 )max|A 一 A| , |B 一 B |,|C C |或 ( x, y)=maxP21一 (02 )max|A 一 A |+|B 一 B |+|C C |其中, P ,是待定常數(shù)。 Pi一 6,即有 6種可能: X = A , Y= B , Z=C 或 X =A , Y=C , Z=B 或 X=B , Y= A , Z=C 或 X = B , Y= c, Z= A 或 X =C , Y=B , Z=A 或 X = C , Y= A , Z=B 。 對于任意兩個三角形,如果 A B c, A B c 那么 ( x, y )=1一 ( 1 )max|A 一 A |, |B 一 B |, |C C |或 ( x, y )= 1 一 ( 2 )max|A 一 A |+|B 一 B |+|C C |因為對于任意兩個三角形的三個內(nèi)角,如果 A B C, A” B” C” 那么 max|A A |, |B B |, |C C |=2 3 max|A A | |B 一 B |C C |=4 3 所以為使 0 1 1, 0 2 1令 1=3 2, 2=3 4 這樣得到任意兩個三角形 (A B C, A” B” C” )的相似度量為 I( x, y )=1一 (3 2 )max|A A |+|B B |+|C C |) 或 ( x, y )=1一 (3 4 )max|A A |+ |B B |+ |C C | 26 4.2 多邊形的相似度 由三角形的相似我們不難看出,如果兩個多邊形的 對應角相等,對應邊成比例,那么這兩個或多個多邊形叫相似多邊形也稱為多邊形的相似度準則。 設 B一 x|x是多邊形 ; C一 y|y是正多邊形 ; D 一 z|z是某一多邊形 i 的頂點 ; E 一 e|e 是對應多邊形完全圖的邊 ;關系“ 是按順時針排列,“”是按逆時針排列。 定義 l 設 a B,則 y-對關系 ”是一個偏序集, V y-。我們把頂點 叫問隔頂點對,三個頂點形成的三角形記作 x。 定義 2 設 a B, e E,使得 e與問隔頂點對相關連,進而得到一個三角形集合 P= x1, x2 xi xm如果滿足下列三個條件: (1)V x, y P, i j,有: x y= ( 2) 的每條邊是 x中的一條邊; (3)U x , =a一 a , a, a B且不包含口的邊,則集合 P= x1, x2 xi xm對“ 構成一個偏序集,叫多邊形的三角形劃分 定義 3 定義 2中,如果不滿足條件 (2), (3)且 有一條邊是中的邊,則稱這樣的 P叫多邊形的弱劃分;記作 Pr。 定義 4 設 a B,把 a看成一個圖,加入使得 a的每一個 頂點的度為 4的邊,把以每頂點形成的三角形集合記作 PA= x1, x2 xi xm, PA對“ 形成的偏序集稱 a的保角劃分。 由定義 2和定義 4得知 P和 PA存在一定關系,后面再加以說明。 27 圖 4-2 定義 1、 2、 3、 4的圖解見圖 4-2。其中: a1a3, a2a4是兩個間隔頂點對。 P= a1a2a3 , a3a4a5, a5a6a1是圖 4-2(a)多邊形的一個劃分。 P = a1a2a3 , a3a4a5是圖 4-2(b)正多邊形的一個弱劃分。PA = a1a2a3 , a2a3a4, a3a4a5, a4a5a6, a5a6a7, a6a7a1, a7a1a2是圖 4-2(c)多邊形的一個保角劃分。 劃分的概念是針對邊為偶數(shù)的多邊形,弱劃分是針對邊為奇數(shù)的正多邊形,而保角劃分是針對邊為任意的多邊形。 在定義 2、 3、 4中 P、 P 、 PA是多邊形的正解;若使 P、 P 、 PA對“ ”形成偏序集,則得到多邊形的鏡像解 (所謂鏡像解就是從反方向看一物體所形成的像 )。 4.2.1 凸多邊形相似度 對于兩個凸多邊形,假如我們稱它們是相似的,如果滿足以下條件: 角對應相等 28 邊對應成比例 全等凸多邊形 就是對應邊相等且角對應相等的特殊相似凸多邊形。當然只要滿足上述其中任何一個,那么該種凸多邊形也相似。如下圖 4-2-1所示。 圖 4-2-1 4.2.2 凹多邊形相似度 對于兩個凹多邊形,當對應邊成比例時,如下圖 4-2-2所示,它們并不相似,甚至區(qū)別很大,所以說對于凹多邊形,不僅需要對應邊成比例 而且還得對應角相等。也就是說 邊長 角度 =K 這一變量取決于該凹多邊形是否相似。 圖 4-2-2 29 4.3 向量相似度 凹多邊形相似度,可以完全轉(zhuǎn)化為兩個向量之間的相似度。而向量的相似度通??梢杂寐D距離或者余弦距離來計算。 事實上,這種表示方法壓縮了字符串,用每個字符出現(xiàn)的次數(shù)代替了字符串本身,損失了字符出現(xiàn)的位置信息。因此,對 于同一個消息,如果只調(diào)換了字符順序的話,通過這種方式計算出的消息指紋不變。但實際情況中,這種情況往往出現(xiàn)較少。 (一個極端的例子 。是“喜歡”和“歡喜”) 3.3.2 最短編輯距離 最短編輯距離是一個經(jīng)典的概念。對一個字符串進行添加一個字符、刪除一個字符或修改一個字符定義為進行一次操作。兩個字符串的最短編輯距離是指把一個字符串變?yōu)榱硗庖粋€字符串需要的最少操作次數(shù)。 求解最小編輯距離是一個可以用動態(tài)規(guī)劃方法解決的經(jīng)典問題 。 基于距離的計算方法 1. 歐氏距離 (Euclidean Distance) 歐氏距離是最易于理解的一種距離計算方法,源自歐氏空間中兩點間的距離公式。 (1)二維平面上兩點 a(x1,y1)與 b(x2,y2)間的歐氏距離: (2)三維空間兩點 a(x1,y1,z1)與 b(x2,y2,z2)間的歐氏距離: 30 (3)兩個 n維向量 a(x11,x12, ,x1n)與 b(x21,x22, ,x2n)間的歐氏距離: 也可以用表示成向量運算的形式: (4)Matlab計算歐氏距離 Matlab 計算距離主要使用 pdist 函數(shù)。若 X 是一個 M N 的矩陣,則 pdist(X)將 X矩陣 M行的每一行作為一個 N維向量,然后計算這 M個向量兩兩間的距離。 例子:計算向量 (0,0)、 (1,0)、 (0,2)兩兩間的歐式距離 X = 0 0 ; 1 0 ; 0 2 D = pdist(X,euclidean) 結果: 31 D = 1.0000 2.0000 2.2361 2. 曼哈頓距離 (Manhattan Distance) 從名字就可以猜出這種距離的計算方法了。想象你在曼哈頓要從一個十字路口開車到另外一個十字路口,駕駛距離是兩點間的直線距離嗎?顯然不是,除非你能穿越大樓。實際駕駛距離就是這個“曼哈頓距離”。而這也是曼哈頓距離名稱的來源, 曼哈頓距離也稱為城市街區(qū)距離 (City Block distance)。 (1)二維平面兩點 a(x1,y1)與 b(x2,y2)間的曼哈頓距離 (2)兩個 n維向量 a(x11,x12, ,x1n)與 b(x21,x22, ,x2n)間的曼哈頓距離 (3) Matlab計算曼哈頓距離 例子:計算向量 (0,0)、 (1,0)、 (0,2)兩兩間的曼哈頓距離 32 X = 0 0 ; 1 0 ; 0 2 D = pdist(X, cityblock) 結果: D = 1 2 3 5. 標準化歐氏距離 (Standardized Euclidean distance ) (1)標準歐氏距離的定義 標準化歐氏距離是針對簡單歐氏距離的缺點而作的一種改進方案。標準歐 氏距離的思路:既然數(shù)據(jù)各維分量的分布不一樣,好吧!那我先將各個分量都“標準化”到均值、方差相等吧。均值和方差標準化到多少呢?這里先復習點統(tǒng)計學知識吧,假設樣本集 X的均值 (mean)為 m,標準差 (standard deviation)為 s,那么 X 的“標準化變量”表示為: 而且標準化變量的數(shù)學期望為 0,方差為 1。因此樣本集的標準化過程 (standardization)用公式描述就是: 標準化后的值 = ( 標準化前的值 分量的均值 ) /分量的標準差 33 經(jīng)過簡單的推導就可以得到兩個 n 維向量 a(x11,x12, ,x1n)與 b(x21,x22, ,x2n)間的標準化歐氏距離的公式: 如果將方差的倒數(shù)看成是一個權重,這個公式可以看成是一種加權歐氏距離 (Weighted Euclidean distance)。 (2)Matlab計算標準化歐氏距離 例子:計算向量 (0,0)、 (1,0)、 (0,2)兩兩間的標準化歐氏距離 (假設兩個分量的標準差分別為 0.5和 1) X = 0 0 ; 1 0 ; 0 2 D = pdist(X, seuclidean,0.5,1) 結果: D = 2.0000 2.0000 2.8284 7. 夾角余弦 (Cosine) 有沒有搞錯,又不是學幾何,怎么扯到夾角余弦了?各位看官稍安勿躁。幾何中夾角余弦可用來衡量兩個向量方向的差異,機器學習中借用這一概念來衡量樣本向量之間的差異。 34 (1)在二維空間中向量 A(x1,y1)與向量 B(x2,y2)的夾角余弦公式: (2) 兩個 n 維 樣本點 a(x11,x12, ,x1n)和 b(x21,x22, ,x2n)的夾角余弦 類似的,對于兩個 n 維樣本點 a(x11,x12, ,x1n)和 b(x21,x22, ,x2n),可以使用類似于夾角余弦的概念來衡量它們間的相似程度。 即: 夾角余弦取值范圍為 -1,1。夾角余弦越大表示兩個向量的夾角越小,夾角余弦越小表示兩向量的夾角越大。當兩個向量的方向重合時夾角余弦取最大值 1,當兩個向量的方向完全相反夾角余弦取最小值 -1。 夾角余弦的具體應用可以參閱參考文獻 1。 (3)Matlab計算夾角余弦 例子:計算 (1,0)、 ( 1,1.732)、 ( -1,0)兩兩間的夾角余弦 35 X = 1 0 ; 1 1.732 ; -1 0 D = 1- pdist(X, cosine) % Matlab中的 pdist(X, cosine)得到的是 1減夾角余弦的值 結果: D = 0.5000 -1.0000 -0.5000 5. 程序設計 該部分為圖形范圍 pt11X=0; pt11Y=0.0; pt11Z=0.0; pt12X=2000; pt12Y=2000; pt12Z=0.0; ads_name First; 36 選定窗口范圍 acedSSGet(W,pt11,pt12,NULL,First); int flag1=FirstAdsLength/2; 分別選取原始圖形和待比較圖形 for(int i=0;iFirstAdsLength;i+) 選取該集合的直線 ID 號 SearchedIdArray.append(eId); 選取該子集合的直線 ID,搜索順序分別從順時針和逆時針方向進行比較 SearchedIdArray1.append(eId); 計算邊長 LineLength=sqrt(pow(SourcelineendPoint.x-SourcelinestartPoint 計算角度 computerAngleArray(SearchedIdArray); 計算邊長 角度 double jVale=doubleArray.at(j)/AngledoubleArray.at(j); 計算相似度 computerSimilary(); 原圖方向記號 if(wiseFlag=1|wiseFlagCompared=1)/clock wise computer line angle 逆時針方向 if(wiseFlag=0|wiseFlagCompared=0)/counter 37 如下圖所示 38 6. 結束語 本文利用可視化的面向?qū)ο箝_發(fā)工具 Visual C+6.0和基于AutoCAD 平臺的 Object ARX 軟件飽滿的支持而開發(fā)的應用程序,借助Visual C+語言能方便高效地開發(fā)典型 Windows風格的 CAD應用程序,采用參數(shù)化設計的思想,把設計過程中重復出現(xiàn)的步驟全部由程序來完成,這樣大大提高了繪圖速度,同 時方便了編輯和操作。 致 謝 本論文是在陳志遠老師的精心指導下完成的。在課題的選擇,方案制定、課題研究、及論文的撰寫過程中都得到了陳志遠教老師的指導和幫助,陳志遠老師平易近人的風格,淵博開闊的知識,科學謹慎的研究方法,嚴謹求實的治學態(tài)度,敏銳活躍的學術將使我終生受益。在論文完成之際,謹向辛勤培養(yǎng)自己多年的老師致以崇高的敬意和衷心的感謝 ! 感謝在學習過程中給予我極大幫助和支持的同學。衷心感謝我的家人在我求學期間給予我毫無 保留的支持和無微不至的關懷,使我能夠全身心地投入到學習去。我所取得的每一分成績都離不開家人的關心和鼓勵。最后,再一次向支持幫助我完成學業(yè)的所有人表示感謝。 39 參考文獻 1 李長勛 .AutoCAD ObjectARX 程序開發(fā)技術:國防工業(yè)出版社 .2005 2 崔鳳奎 .AutoCAD 基礎及開發(fā)教程:國防工業(yè)出版社 .2001 3 (愛爾蘭) Charles MCAuley, AutoCAD2000 ObjectARX 編程指南:機械工業(yè)出版社 .2000.4 4 楊國清 . 用 ObjectARX 開發(fā) AutoCAD2000應用程序:人民郵電出版社 .2000 5 趙衛(wèi)東,柳先輝,衛(wèi)剛 .CAD 軟件二次開發(fā)平臺實現(xiàn)技術 .計算機輔助設計與圖形學學 報 .2003.4 6 郭朝勇等 .AutoCAD 2002定制與開發(fā) .清華大學出版社 .2002.3 7 余承飛,方勇編 .AutoCAD 2000二次開發(fā)技術 .北京 :人民郵電出版社 .1999.12 8 王福軍,張志民,張師偉 .AUIOCAD 2000環(huán)境下 CIVisual C+應用程序開發(fā)教程 . 北京希望電子出版社 .2000.6 7. 源程序(見附錄) / / ObjectARX defined commands, created by 2013-2-16, , #include StdAfx.h #include StdArx.h #includemath.h #includedbents.h #includemigrtion.h #includegevec3d.h #includegemat3d.h #define PI 3.1415926 40 AcGePoint3dArray intPoints; AcDbObjectIdArray SearchedIdArray; AcDbObjectIdArray SearchedIdArray1; AcDbObjectIdArray FirstIdArray; AcDbObjectIdArray BorderIdArray; AcDbObjectIdArray FirstBordertempIdArray; int CircleFlag=0; int index=-1; int IndexFlag=-1; int wiseFlag=-1; int wiseFlagCompared=-1; int CirNum=-1; AcDbIntArray MinBorderFlagShuzhu; AcGeDoubleArray doubleArray;/line length AcGeDoubleArray AngledoubleArray;/line angle AcGeDoubleArray doubleArray1;/line length AcGeDoubleArray AngledoubleArray1;/line angle AcGeDoubleArray sourceLineAngleArray;/first AcGeDoubleArray comparedLineAngleArray;/others AcGeDoubleArray InOrderDx; int flagcomputeAng=0; /- / This is command SIM, by 2013-2-16, , void CZYsim() #ifdef OARXWIZDEBUG acutPrintf (nOARXWIZDEBUG - CZYsim() called.); #endif / OARXWIZDEBUG / TODO: Implement the command wiseFlagCompared=-1; int minIndex=-1; ads_point pt11,pt12; 41 pt11X=0; pt11Y=0.0; pt11Z=0.0; pt12X=2000; pt12Y=2000; pt12Z=0.0; ads_name First; acedSSGet(W,pt11,pt12,NULL,First); long FirstAdsLength; acedSSLength(First,&FirstAdsLength); acutPrintf(nFirstAdsLength=%d:,FirstAdsLength); acutPrintf(nPlease select a closed drawings in order!); int flag1=FirstAdsLength/2; for(int i=0;iFirstAdsLength;i+) AcDbObjectId eId; ads_name en; ads_point pt; if(iflag1) acedEntSel(nSelect an entity in source drawing:,en,pt); acdbGetObjectId(eId,en); SearchedIdArray.append(eId); else acedEntSel(nSelect an entity in object drawing:,en,pt); acdbGetObjectId(eId,en); SearchedIdArray1.append(eId); acedSSFree(First); acutPrintf(nSearchedIdArray.logicalLength()=%d:,SearchedIdArray.logicalLength(); acutPrintf(nSearchedIdArray1.logicalLength()=%d:,SearchedIdArray1.logicalLength(); for(int i2=0;i2isKindOf(AcDbLine:desc()&(pSourceDrawingObj1-isKindOf(AcDbLine:desc() AcGePoint3d SourcelinestartPoint(0,0,0); AcGePoint3d SourcelineendPoint(0,0,0); AcDbLine*pSourceEntity=AcDbLine:cast(pSourceDrawingObj); SourcelinestartPoint=pSourceEntity-startPoint();/get source line startPoint 1 SourcelineendPoint=pSourceEntity-endPoint();/get source line endPoint double LineLength=sqrt(pow(SourcelineendPoint.x-SourcelinestartPoint.x,2)+pow(SourcelineendPoint.y-SourcelinestartPoint.y,2); doubleArray.insertAt(i2,LineLength);/compute line length 111 AcGePoint3d SourcelinestartPoint1(0,0,0); AcGePoint3d SourcelineendPoint1(0,0,0); AcDbLine*pSourceEntity1=AcDbLine:cast(pSourceDrawingObj1); SourcelinestartPoint1=pSourceEntity1-startPoint();/get source line startPoint 1 SourcelineendPoint1=pSourceEntity1-endPoint();/get source line endPoint double LineLength1=sqrt(pow(SourcelineendPoint1.x-SourcelinestartPoint1.x,2)+pow(SourcelineendPoint1.y-SourcelinestartPoint1.y,2); doubleArray1.insertAt(i2,LineLength1);/compute line length 111 acutPrintf(nLineLength=:%fn,LineLength); acutPrintf(nLineLength1=:%fn,LineLength1); pSourceDrawingObj-close(); pSourceDrawingObj1-close(); 43 acutPrintf(nflagcomputeAng=:%dn,flagcomputeAng); computerAngleArray(SearchedIdArray); for(int j=0;jSearchedIdArray.logicalLength();j+) double jVale=doubleArray.at(j)/AngledoubleArray.at(j); sourceLineAngleArray.insertAt(j,jVale); flagcomputeAng+; acutPrintf(nflagcomputeAng=:%dn,flagcomputeAng); computerAngleArray(SearchedIdArray1); for(int j1=0;j1SearchedIdArray1.logicalLength();j1+) double jVale1=doubleArray1.at(j1)/AngledoubleArray1.at(j1); comparedLineAngleArray.insertAt(j1,jVale1); acutPrintf(ncomparedLineAngleArray.at(j1)=:%fn,comparedLineAngleArray.at(j1); computerSimilary(); AngledoubleArray.setLogicalLength(0); doubleArray.setLogicalLength(0); comparedLineAngleArray.setLogicalLength(0); FirstIdArray.setLogicalLength(0); SearchedIdArray.setLogicalLength(0); BorderIdArray.setLogicalLength(0); FirstBordertempIdArray.setLogicalLength(0); MinBorderFlagShuzhu.setLogicalLength(0); intPoints.setLogicalLength(0); CircleFlag=0; index=-1; IndexFlag=-1; flagcomputeAng=0; 44 void computerAngleArray(AcDbObjectIdArray PassedInSearchedIdArray) for(int i=0;istartPoint(); e1=pLine1-endPoint(); s2=pLine2-startPoint(); e2=pLine2-endPoint(); AcDbLine*pWise1=new AcDbLine(); AcDbLine*pWise2=new AcDbLine(); if(s1=s2) pWise1-setStartPoint(s1); pWise1-setEndPoint(e1); pWise2-setStartPoint(s2); pWise2-setEndPoint(e2); if(s1=e2) pWise1-setStartPoint(s1); pWise1-setEndPoint(e1); pWise2-setStartPoint(e2); pWise2-setEndPoint(s2); if(e1=s2) pWise1-setStartPoint(e1); pWise1-setEndPoint(s1); 45 pWise2-setStartPoint(s2); pWise2-setEndPoint(e2); if(e1=e2) pWise1-setStartPoint(e1); pWise1-setEndPoint(s1); pWise2-setStartPoint(e2); pWise2-setEndPoint(s2); AcGePoint3d p1s=pWise1-startPoint(); double s1x=p1s.x; double s1y=p1s.y; AcGeMatrix3d mat3d;/move AcGeVector3d vec(-s1x,-s1y,0.0); mat3d=mat3d.translation(vec); pWise1-transformBy(mat3d); pWise2-transformBy(mat3d); AcGePoint3d p1e; p1e=pWise1-endPoint(); double edx=p1e.x; double edy=p1e.y; double fabsx=fabs(p1e.x); double fabsy=fabs(p1e.y); double baseAng=0.0; double RotAng; if(edx0&edy0) baseAng=0.0; RotAng=baseAng-atan2(fabsy,fabsx); else if(edx0&edy0) RotAng=-0.5*PI; else if(edx=0&edy0) RotAng=-1.5*PI; else if(edx0) baseAng=PI; RotAng=-(baseAng-atan2(fabsy,fabsx); else if(edx0&edy0) RotAng=0; else if(edy=0&edxtransformBy(mat3dRot); pWise2-transformBy(mat3dRot); / acutPrintf(nRotAng=%f:,RotAng);/computer first line rotated angle AcGePoint3d p2e; p2e=pWise2-endPoint(); 47 double edx2=p2e.x; double edy2=p2e.y; double fabsx2=fabs(p2e.x); double fabsy2=fabs(p2e.y); double baseAng2=0.0; double RotAng2; / if(wiseFlag=1|wiseFlagCompared=1)/clock wise computer line angle / if(edx20&edy20) baseAng2=0.0; RotAng2=atan2(fabsy2,fabsx2)*180/PI; else if(edx20&edy20) RotAng2=0.5*PI; else if(edx2=0&edy20) RotAng2=1.5*PI; else if(edx20) baseAng2=PI; RotAng2=(baseAng2-atan2(fabsy2,fabsx2)*180/PI; else if(edx20&edy20&edy20) baseAng2=2*PI; RotAng2=(baseAng2-atan2(fabsy2,fabsx2)*180/PI; else if(edx20&edy20) R
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 給水設施定期檢修計劃
- 2026年重慶電力高等專科學校單招綜合素質(zhì)考試模擬測試卷及答案1套
- 電廠崗位安全培訓內(nèi)容課件
- 滿族創(chuàng)意介紹
- 鐵路安全知識培訓教育課件
- 2025年安徽省 人事考試及答案
- 2025年萊蕪市事業(yè)編考試試題及答案
- 電廠安全教育培訓臺賬課件
- 滑移裝載機培訓課件總結
- 電廠安全培訓材料課件
- (2025年)四川省自貢市紀委監(jiān)委公開遴選公務員筆試試題及答案解析
- 2026屆江蘇省常州市高一上數(shù)學期末聯(lián)考模擬試題含解析
- 2026年及未來5年市場數(shù)據(jù)中國水質(zhì)監(jiān)測系統(tǒng)市場全面調(diào)研及行業(yè)投資潛力預測報告
- 2026安徽省農(nóng)村信用社聯(lián)合社面向社會招聘農(nóng)商銀行高級管理人員參考考試試題及答案解析
- 強夯地基施工質(zhì)量控制方案
- 藝考機構協(xié)議書
- 2025年12月27日四川省公安廳遴選面試真題及解析
- 2025-2030中國海洋工程裝備制造業(yè)市場供需關系研究及投資策略規(guī)劃分析報告
- 《生態(tài)環(huán)境重大事故隱患判定標準》解析
- 2025年度吉林省公安機關考試錄用特殊職位公務員(人民警察)備考筆試試題及答案解析
- 巖板采購合同范本
評論
0/150
提交評論