2014-03-05 137 views
2

我想在Delphi XE5中创建一个三角形网格结构。Delphi中的mesh类结构的最佳方式是什么?

主要TMyMesh类具有通用TObjectLists持有顶点列表,面等

比方说,我要计算财产以后为网格的每个人脸上。我可以让乘坐TMyMesh类照顾这个:

TMyVertex=class(TComponent) 
    Vertex: TPoint3D; 
    //other fields and methods 
end; 

TMyTriangleFace=class(TComponent) 
    Vertices: Array [0..2] of Integer; 
    //other fields and methods 
end; 

TMyMesh=class(TComponent) 
    ListOfVertices: TObjectList<TMyVertex>; 
    ListOfTriangleFaces: TObjectList<TMyTriangleFace>; 
    procedure CreateListOfTriangleFaces; 
    procedure DoSomethingWithTheFace(const FaceNumber: Integer); 
    procedure DoSomethingWithAllFaces; 
end; 

procedure TMyMesh.CreateListOfTriangleFaces; 
begin 
    for i := 0 to NumberOfTriangleFaces-1 do 
    begin 
    ListOfTriangleFaces.Add(TMyTraingleFace.Add(nil)); 
    end; 
end; 

procedure TMyMesh.DoSomethingWithTheFace(const AFaceNumber: Integer); 
begin 
    AVertex:=ListOfVertices[ListOfFaces[AFaceNumber].Vertices[0]]; 
    //do something 
end; 

procedure TMyMesh.DoSomethingWithAllFaces; 
begin 
    for i := 0 to ListOfFaces.Count-1 do 
    begin 
    DoSomethingWithTheFace(i); 
    end; 
end; 

或者,我可以将其委托给TMyTriangleFace类:

TMyVertex=class(TComponent) 
    Vertex: TPoint3D; 
    //other fields and methods 
end; 

TMyTriangleFace=class(TComponent) 
    Vertices: Array [0..2] of Integer; 
    procedure DoSomethingWithTheFace; 
    //other fields and methods 
end; 

TMyMesh=class(TComponent) 
    ListOfVertices: TObjectList<TMyVertex>; 
    ListOfTriangleFaces: TObjectList<TMyTriangleFace>; 
    procedure CreateListOfTriangleFaces; 
    procedure DoSomethingWithAllFaces; 
end; 

procedure TMyTriangleFace.DoSomethingWithTheFace; 
begin 
    AVertex:=TMyMesh(Owner).ListOfVertices[Vertices[0]]; 
    //do something 
end; 

procedure TMyMesh.CreateListOfTriangleFaces; 
begin 
    for i := 0 to NumberOfTriangleFaces-1 do 
    begin 
    ListOfTriangleFaces.Add(TMyTraingleFace.Add(Self)); 
    end; 
end; 

procedure TMyMesh.DoSomethingWithAllFaces; 
begin 
    for i := 0 to ListOfFaces.Count-1 do 
    begin 
    ListOfTriangleFaces[i].DoSomethingWithTheFace; 
    end; 
end; 

在这种情况下,我需要给TMyTriangleFace类访问ListOfVertices 。我可以通过在CreateListOfTriangleFaces过程中将TMyMesh作为所有者来传递。

在我的理解第二部分应该是更好的代码(德米特法)。但传递TMyMesh作为所有者可能不太好。

这样做的最佳做法是什么?也许这两种解决方案都走错了方向,还有更好的解决方案?

非常感谢!

+1

您想要尽可能使用值。把所有东西都作为一个组件将导致可怕的性能。 –

+0

此问题似乎无关紧要,因为它要求进行代码审查。 Code Review堆栈交换站点最好问这个问题。 –

+0

看起来不像代码审查给我。确实存在大量代码示例,但本质上它是关于OOP方法与数据存储的关系。如果面向对象应该是粒度或简单的方法是有益的。 – Kromster

回答

3

为每个顶点和三角形创建一个新的对象是非常低效的,因为所有额外的初始化开销和单独的内存分配。由于数据在内存中稀疏(与Delphi创建的对象头交织)以及函数调用,访问也会效率低下。

正如David所言,将单个TMyMesh类中的顶点和索引作为记录数组的所有内容都会更快。

+0

更多关于记录与数据存储类:http://stackoverflow.com/questions/1876879/records-in-delphi – Kromster

+0

谢谢!然后我不会使用对象。我应该使用简单的动态数组记录还是可以使用TList ? – user3384674

+1

我对此提出了一个问题:http://stackoverflow.com/questions/22215029/what-are-the-pros-and-cons-of-using-dynamic-array-of-records-vs-tlisttmyrecord – Kromster

相关问题