二維幾何變換(待補)
- 平移
二維觀察流水線
C代表coordinate
建模坐標系-> 世界坐標系-> 觀察坐標系->設備坐標系
裁剪
點的裁剪
直接判斷是否在窗口內部即可
直線段的裁剪
基本思想:對每條直線段p1(x1,y1) p2(x2,y2)分三種情況處理:
(1) 直線段完全可見,“取”之。
(2) 直線段顯然不可見,“棄”之。
(3) 直線段既不滿足“取”的條件,也不滿足“棄”的條件,需要對直線段按交點進行分段,分段后重復上述處理。
編碼:對于任一端點(x,y),根據其坐標所在的區域,賦予一個4位的二進制碼D3D2D1D0。
編碼規則如下:
若x<xL,則D0=1,否則D0=0;
若x>xR,則D1=1,否則D1=0;
若y<yB,則D2=1,否則D2=0;
若y>yT,則D3=1,否則D3=0。
裁剪一條線段時,先求出端點p1和p2的編碼code1和code2:
(1)若code1 | code2 = 0,對直線段應取之
(2)若code1 & code2 != 0,對直線段可棄之
(3)若上述兩條件均不成立。則需求出直線段與窗口邊界的交點。在交點處把線段一分為二,其中必有一段完全在窗口外,可以棄之。再對另一段重復進行上述處理,直到該線段完全被舍棄或者找到位于窗口內的一段線段為止。
(1) 輸入直線段的兩端點坐標:p1(x1, y1)、p2(x2, y2),以及窗口的四條邊界坐標:yT、yB、xL和xR。
(2) 對p1、p2進行編碼:點p1的編碼為code1,點p2的編碼為code2。
(3) 若code1 | code2=0,對直線段應簡取之,轉(6);
否則,若code1 & code2 != 0,對直線段可簡棄之,轉(7);當上述兩條均不滿足時,進行步驟(4)。
(4) 確保p1在窗口外部:若p1在窗口內,則交換p1和p2的坐標值和編碼。
(5) 按左、右、上、下的順序求出直線段與窗口邊界的交點,并用該交點的坐標值替換p1的坐標值。也即在交點s處把線段一分為二,并去掉p1s這一段。考慮到p1是窗口外的一點,因此可以去掉p1s, 轉(2)
(6) 用直線掃描轉換算法繪制當前的直線段p1p2。
(7) 算法結束。
三維觀察流水線
觀察變換
變換過程:
- 原點到視點的平移變換
- 繞z1軸的旋轉變換
- 繞x2軸的旋轉變換
-
關于y3O3z3面的反射變換
投影變換
平行投影: 正投影 斜投影
正投影&&斜投影.PNG
正投影:三視圖 && 正軸測圖
透視投影透視投影.PNG
三維實體表示基礎
點:最基本的零維幾何元素 (x,y,z)
邊:一維幾何元素 一條邊由兩個端點表示 折現一般用頂點序列來表示
面:二維幾何元素
環:由有向邊順序組成的面的邊界
體:三維幾何元素,由封閉的表面圍成的空間。
幾何信息:用來描述物體的位置和大小
拓撲信息:用來描述點,棱邊及面片之間的鄰接關系,具體表現為棱邊及面片的數據結構。
一個有效的實體有如下性質
- 剛性
- 具有封閉的邊界
- 內部連通
- 占據有限的空間
- 經過集合運算后仍然是有效的實體
實體模型是最完善的模型定義,它能夠表達全部的形狀信息,如物體位置、面積、長度、體積、拓撲關聯等,同時也定義了物體的并、交、差集合運算和歐拉運算等。
三維實體表示方法
邊界表示
通過描述實體的邊界來表示實體。
判斷實體是否合法: 邊界的每條鄰邊必須要有兩個已知坐標的端點。 每條邊只能被兩個面共享。 每個頂點至少被三個面或三個邊共享。
優點:能顯式地表示形體邊界,繪制時能快速計算法向和光照效果,算法簡單。 便于局部幾何變換。 便于多個形體做并,交,差運算。 可利用歐拉公式來判斷有效正則性。
歐拉公式 V-E+F = 2 V頂點數,E邊數,F面數。(對于簡單多面體)
非簡單多面體 V-E + F- H = 2(C- G) H形體表面的孔數 G 穿透多面體的洞數 C 獨立不相連的多面體數
常用的數據結構
class Point
{
int id; //頂點編號,有時可以不要該成員
int x; //橫坐標
int y; //縱坐標
}
vector<Point> Points; //存放Point對象的動態數組
class Edge
{
int edge_id; //邊的編號,有時可以不要該成員
int BeginPoint;
//為指向Points數組中對應邊的起點的元素的索引
int EndPoint;
//為指向Points數組中對應邊的終點的元素的索引
int LeftFacet;
//為指向Facets數組中對應此邊左側鄰面的元素索引
int RightFacet;
//為指向Facets數組中對應此邊右側鄰面的元素索引
}
vector<Edge> Edges; //存放Edge對象的動態數組
class Facet
{
vector<int> vertices; //該面片邊界頂點序列數組, // 其元素值為指向Points數組的指針
vector<int> edges; //該面片各邊的數組,
// 其元素值為指向Edges數組的指針
}
vector<Facet> Facets;//存放Facet對象的動態數組
翼邊數據結構:以邊為核心,每條邊記錄中設置指向其兩個頂點,左右兩個鄰面,上下左右四條鄰邊的指針。每個頂點的記錄都指向以它作為端點的一條表。每個面的記錄指向其一條邊的指針。
對稱數據結構:存放了面→邊、邊→面、邊→點、點→邊的4種拓撲關系,每個面記錄中設置了指向它所有邊的指針,同樣,每條邊記錄中也設置了指向它兩個鄰面的指針和兩個頂點的指針,每個點設置以它為端點的所有邊的指針。這種數據結構的空間復雜度為6E,E為實體中的邊數。
半邊數據結構:一條邊被表示成拓撲意義下的方向相反的兩條半邊。實體由多邊形(面)的組合來表示,而多邊形由外環及內環組合而成,環又是半邊構成的序列,每條半邊又由兩個頂點構成。
掃描表示
平移掃描:物體沿著某一直線方向平移一段距離
旋轉掃描:物體圍繞某一軸線旋轉一定距離
廣義掃描:物體沿著某一空間曲線掃描一定距離
構造實體幾何表示
基本思想:將簡單實體通過集合運算組合成所需要的物體。
CSG(Constructive Solid Gemetry)
采用單一的建筑塊形式的構造實體造型方法,由兩個物體的正則幾何操作生成新的物體。(并,交,差)
CSG法:集合運算的實現過程用一顆二叉樹來描述。
二叉樹葉子節點表示體素或者集合變換的參數。
非終端節點表示施加于其子節點上的實體集合運算或幾何變換。
根節點表示的就是集合運算的最終結果。
優點: 覆蓋域廣泛,輸入方便,可直觀地構造復雜圖形。數據結構簡單,數據量小,用一顆二叉樹即可表示。 形體的有效性可由實體集合運算保證。
缺點:體素很多都是由參數和表面方程表示的,用表面方程和參數表示易于求交點,方便了集合運算,但運算后的中間結果很難用方程和參數表示,后面的集合運算難度較大。解決方案:將中間結果轉化為邊界表示。
集合運算會破壞原有的點邊面的顯示拓撲關系。
體素的形狀有限。體素不能進行局部變形操作,CSG的表現能力有限制。
空間細分表示法
體素表示法,八叉樹表示法
*體素表示法常用于物體的CT或MRI圖像的三維重建。體素表示法:實體占有的空間被劃分成均勻的小立方體,小立方體構成三維矩陣,小立方體即為體素。用體素表示的空間成為三維位圖。