2017-09-03 94 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。