2014-03-05 69 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

相關問題