2013-02-17 89 views
0

當前我正在嘗試檢測3D對象的輪廓邊緣。我知道你必須首先確定一張臉在看一個位置的天氣,然後找到正面和背面共用的邊緣。我已經能夠找出正面和背面的東西,但我無法弄清楚如何在不使用ALOT if語句的情況下共享邊緣。我的頂點數據是從x1,z1,y1,x2,z2,y2,x3,z3,y3爲每個多邊形存儲的。如果任何人都可以幫助解決我的糟糕的行爲,那就太好了。如何查看三維邊緣是否相同?

謝謝。

+0

你問如何確定兩條線段是否在同一條線上? – 2013-02-17 23:10:35

+0

@ Code-Guru並非如此,如果2條線段是同一條線。 – BlueSpud 2013-02-17 23:18:56

+0

@BlueSpud不使用術語「行」沒有限制,使自己不那麼模糊。 「如果兩條線段是相同的線段」會使人們不那麼容易混淆。 :) ...所以,你有什麼嘗試?你有一個「線段」班嗎?你是否對開始/結束點進行排序,以使(詞彙)較低的那個始終是「第一」?從閱讀你的描述,你的多邊形實際上是三角形 - 這是真的嗎? – Yakk 2013-02-18 01:41:50

回答

0

如果您在詢問如何確定兩條線段是否在同一條線上,則可以使用一點歐幾里德幾何。我們來討論幾個定義:

A point A是實數的n元組(a1, a2, ..., an)。在3D情況下,n=3。 A點

標量乘和實數t被定義爲

tA = (t*a1, t*a2, ..., t*an) 

有了這兩個想法,我們可以很容易的代表一行。對於兩點AB,其滿足方程

P = tA + (1-t)B 

是上線AB其中t是實數的點P

0 <= t <= 1P在於AB之間,P=At=1P=Bt=0

現在把它放到編程的角度來看,你可以創建兩個類:PointLine。使用上面給出的公式,很容易確定Point是否位於給定的Line上。要確定兩條線段是否在同一條線上,只需使用兩個Point,它們定義一個Line並檢查它們是否位於另一個Line上。

+0

同樣,我需要檢查兩行是否完全一樣,相同的位置,一切。 – BlueSpud 2013-02-17 23:20:58

0

如果2線路段具有相同的線

兩條線段是相同的,如果它們使用相同的點座標的或相同的點的索引。測試他們是否在同一條線上是完全不同的問題,您不需要解決以查找輪廓。

  1. 使用索引基元。
  2. 在加載模型時,預先預先計算邊緣和所需拓撲表的列表。
  3. 如果您正在嘗試繪製陰影,請使用shadowmaps而不是 - 它們更易於理解。

索引基元表示
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::setstd::map或類似結構索引數據。一旦索引了原始數據,就可以構建關聯表(使用std :: map),該表將映射邊緣到表面的列表std::multimap<std::pair<Index, Index>, FaceIndex>,將邊緣映射到使用這些邊的邊的索引std::map<std::pair<VertexIndex, VertexIndex>, FaceIndex>等等。