2017-09-03 79 views
0

我嘗試實現我的小型CAD,並想知道如何組織Bezier立方體表面基元的數據。我的原始作品,例如一個盒子,將包含六個立方Bezie貼片,爲了方便起見,它們通過自己的數據彼此分離。任何補丁都有16點。我的primitieves將針對任何迭代(選擇點)縫合:例如,補丁邊上的任何點將與相鄰補丁的對應點共享自己的位置。我可以刪除重複點,但爲了渲染和更新原始數據,我需要保持數據不變,同時我需要強大的鼠標拾取算法,在邊緣選取這些點並讓相鄰點的相應點移動一個點。 我想我有兩個選擇:CAD程序的數據結構。用一個數據進行鼠標拾取和渲染

  1. 組織數據的std :: multimap中或別的東西,其中有幾點需要通過按鍵連接,但在這裏我有搜索點的問題。
  2. 改進挑選算法,提供2-3點挑選作爲一點,但我認爲這是一個不好的解決方案。

解決此問題的常用方法是什麼?感謝您的任何建議。

+0

您可以更改數據結構,以便點不是修補程序的一部分。然後你只有一個點,並且你會有兩個指向同一點的補丁。 – immibis

+1

這個問題對Stack Overflow格式來說太寬泛了。我認爲你有很多選擇,那麼爲什麼不嘗試一些,看看它們是如何工作的?給出簡要說明真的很難說他們會如何發揮。 – tadman

+0

目前還沒有明確的答案,您真的需要檢查現有的解決方案,甚至可能混合一些以便爲您的需求提供最有效的解決方案。它不在堆棧溢出的範圍內。 –

回答

1

一種常見的和相對簡單的方法是基於指針或基於索引的數據結構。後一個例子:

std::vector<Vector3> vertices; 
struct Patch 
{ 
    // Zero-based indices of the 16 control points in the vertices vector 
    uint32_t indices[4][4]; 
} 
std::vector<Patch> patches; 

一個缺點是消除頂點是昂貴的,因爲補丁需要固定調整這些指標。另一個缺點是枚舉鏈接到特定頂點的修補程序是昂貴的,但是如果您需要經常這樣做,您可以構建&爲其維護一個單獨的索引。 std::unordered_multimap<uint32_t, uint32_t> lookupPatches;

如果您在GPU上鑲嵌這些Bézier補丁,這樣做有好處,上傳兩個頂點(頂點緩衝區)和補丁(索引緩衝區)非常有效。例如。對於D3d11,它是Map,memcpy,Unmap。