【发布时间】:2011-10-19 23:40:46
【问题描述】:
这是一个函数,它使用了我几天前提出的问题的答案中的建议。让我们在 Mathematica 中创建一个 Graphics3D 对象。我使用来自here 的这个 3D 几何数据。
cd = Import[NotebookDirectory[] <> "withwake.obj"];
vertices = cd[[1, 2, 1]];
polygons = Flatten[cd[[1, 2, 2, 1]] /. Polygon -> List, 2];
Graphics3D[GraphicsComplex[vertices, Polygon[polygons]]]
对于每个多边形,我们创建一个列表,其中包含指向其顶点的数字,然后是指向每个边所连接的多边形的数字。需要注意的是表面法线;定义面板的节点顺序应该是逆时针的。根据右手定则,如果手指弯曲以跟随编号,拇指将显示应该指向“向外”几何图形的法线向量。
如果Graphics3D 对象中的所有多边形都是三角形,则此函数会创建这样一个列表。
EdgeSorting[vertices_, polygons_] :=
Block[{triangleEdges, singleEdges, edgesNeighbors, relations, n, n1,
n2, trires, triangleNeigbours, TriangleMaker, polygonArea, tring},
(*Split every triangle in 3 edges,with nodes in each edge sorted*)
triangleEdges = (Sort /@ Subsets[#, {2}]) & /@ polygons;
(*Generate a list of edges*)
singleEdges = Union[Flatten[triangleEdges, 1]];
(*Define a function which,given an edge (node number list),
returns the bordering*)
(*triangle numbers.It's done by working through each of the \
triangles' edges*)
edgesNeighbors[_] = {};
MapIndexed[(edgesNeighbors[#1[[1]]] =
Flatten[{edgesNeighbors[#1[[1]]], #2[[1]]}];
edgesNeighbors[#1[[2]]] =
Flatten[{edgesNeighbors[#1[[2]]], #2[[1]]}];
edgesNeighbors[#1[[3]]] =
Flatten[{edgesNeighbors[#1[[3]]], #2[[1]]}];) &, triangleEdges];
(*Build a triangle relation table.Each'1' indicates a triangle \
relation*)
relations =
ConstantArray[
0, {triangleEdges // Length, triangleEdges // Length}];
Scan[(n = edgesNeighbors[##];
If[Length[n] == 2, {n1, n2} = n;
relations[[n1, n2]] = 1; relations[[n2, n1]] = 1];) &,
singleEdges];
Print[MatrixPlot[relations]];
(*Build a neighborhood list*)
triangleNeigbours =
Table[Flatten[Position[relations[[i]], 1]], {i,
triangleEdges // Length}];
trires =
Table[Flatten[{polygons[[i]], triangleNeigbours[[i]]}], {i, 1,
Length@polygons}];
TriangleMaker[{a_, b_, c_}] := {vertices[[a]], vertices[[b]],
vertices[[c]]};
{trires}
];
我不完全理解这个函数的工作方式。而且我无法理解如何实现以下目标。
- 对于每个三角形和四边形,如前所述,如何形成列表。
- 远离 3D 水翼的平面网格称为尾流面板。对于每个唤醒四边形面板/多边形,我们需要形成一个指向其顶点的数字列表,然后是指向两个多边形的数字列表,它共享其唯一连接边缘的边具有主要水翼几何形状的尾流四边形面板/多边形。
【问题讨论】:
-
你的函数中有哪些不明白的地方?
-
主要是
edgesNeighbors部分。我尝试添加edgesNeighbors[#1[[4]]] = Flatten[{edgesNeighbors[#1[[4]]], #2[[1]]}];,但没有奏效。而且尾流似乎更难处理。 -
如果您的代码适用于三角形并且您有四边形......为什么不按对角线分割它们?
-
我需要四边形。我需要他们使用外部程序。不需要简单的三角形网格。这些四边形是绝对必要的。