Delphi中网格类结构的最佳方法是什么?

时间:2014-03-05 18:01:29

标签: delphi decoupling law-of-demeter

我想在Delphi XE5中创建一个三角形网格结构。

主要的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作为所有者传递来完成此操作。

在我的理解中,第二部分应该是更好的代码(Demeter法则)。但是作为主人传递TMyMesh可能并不那么好。

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

非常感谢!

1 个答案:

答案 0 :(得分:3)

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

正如大卫评论的那样,将一切TMyMesh类中的所有内容与顶点和索引作为记录数组相比会快得多。