當前我正在嘗試檢測3D對象的輪廓邊緣。我知道你必須首先確定一張臉在看一個位置的天氣,然後找到正面和背面共用的邊緣。我已經能夠找出正面和背面的東西,但我無法弄清楚如何在不使用ALOT if語句的情況下共享邊緣。我的頂點數據是從x1,z1,y1,x2,z2,y2,x3,z3,y3爲每個多邊形存儲的。如果任何人都可以幫助解決我的糟糕的行爲,那就太好了。如何查看三維邊緣是否相同?
謝謝。
當前我正在嘗試檢測3D對象的輪廓邊緣。我知道你必須首先確定一張臉在看一個位置的天氣,然後找到正面和背面共用的邊緣。我已經能夠找出正面和背面的東西,但我無法弄清楚如何在不使用ALOT if語句的情況下共享邊緣。我的頂點數據是從x1,z1,y1,x2,z2,y2,x3,z3,y3爲每個多邊形存儲的。如果任何人都可以幫助解決我的糟糕的行爲,那就太好了。如何查看三維邊緣是否相同?
謝謝。
如果您在詢問如何確定兩條線段是否在同一條線上,則可以使用一點歐幾里德幾何。我們來討論幾個定義:
A point A是實數的n元組(a1, a2, ..., an)
。在3D情況下,n=3
。 A點
標量乘和實數t
被定義爲
tA = (t*a1, t*a2, ..., t*an)
有了這兩個想法,我們可以很容易的代表一行。對於兩點A
和B
,其滿足方程
P = tA + (1-t)B
是上線AB
其中t
是實數的點P
。
當0 <= t <= 1
,P
在於A
和B
之間,P=A
時t=1
和P=B
時t=0
。
現在把它放到編程的角度來看,你可以創建兩個類:Point
和Line
。使用上面給出的公式,很容易確定Point
是否位於給定的Line
上。要確定兩條線段是否在同一條線上,只需使用兩個Point
,它們定義一個Line
並檢查它們是否位於另一個Line
上。
同樣,我需要檢查兩行是否完全一樣,相同的位置,一切。 – BlueSpud 2013-02-17 23:20:58
如果2線路段具有相同的線
兩條線段是相同的,如果它們使用相同的點座標的或相同的點的索引。測試他們是否在同一條線上是完全不同的問題,您不需要解決以查找輪廓。
索引基元表示
1。您將所有點存儲在數組中(std::vector<vector3> points;
或類似的東西,其中vector3
是存儲xyz座標的數據類型),並且每個點都是唯一的。
2.面和邊指的是使用整數點索引的點。
I.e.
struct Vec3{
float x, y, z;
};
typedef unsigned int Index;
struct Face{
enum{vertsPerFace=3};
Index verts[vertsPerFace];
};
struct Edge{
enum{vertsPerEdge=2};
Index verts[vertsPerEdge];
};
當加載模式,你建點的列表,所有面轉換爲使用std::set
std::map
或類似結構索引數據。一旦索引了原始數據,就可以構建關聯表(使用std :: map),該表將映射邊緣到表面的列表std::multimap<std::pair<Index, Index>, FaceIndex>
,將邊緣映射到使用這些邊的邊的索引std::map<std::pair<VertexIndex, VertexIndex>, FaceIndex>
等等。
你問如何確定兩條線段是否在同一條線上? – 2013-02-17 23:10:35
@ Code-Guru並非如此,如果2條線段是同一條線。 – BlueSpud 2013-02-17 23:18:56
@BlueSpud不使用術語「行」沒有限制,使自己不那麼模糊。 「如果兩條線段是相同的線段」會使人們不那麼容易混淆。 :) ...所以,你有什麼嘗試?你有一個「線段」班嗎?你是否對開始/結束點進行排序,以使(詞彙)較低的那個始終是「第一」?從閱讀你的描述,你的多邊形實際上是三角形 - 這是真的嗎? – Yakk 2013-02-18 01:41:50