gpt4 book ai didi

wolfram-mathematica - 修改由 ParametricPlot3D 生成的 Graphics3D 对象

转载 作者:行者123 更新时间:2023-12-04 08:14:14 25 4
gpt4 key购买 nike

这是一组结构化的3D points .现在我们可以形成一个 BSpline使用这些点作为结。

dat=Import["3DFoil.mat", "Data"]
fu=BSplineFunction[dat]

在这里我们可以做一个 ParametricPlot3D有了这些点。
pic=ParametricPlot3D[fu[u,v],{u, 0, 1}, {v, 0, 1}, Mesh -> All, AspectRatio -> 
Automatic,PlotPoints->10,Boxed-> False,Axes-> False]

enter image description here

问题

如果我们仔细观察从样条中出来的 3D 几何体,我们会发现它是一个空心结构。该孔出现在对称轮廓的两侧。我们怎样才能 完美 (不是视觉上的!)填满这个洞并创建一个统一的 Graphics3D两侧的孔都被修补的物体。

enter image description here

到目前为止我能够得到的是以下内容。孔未完全修补。
enter image description here

我最近问了太多问题,对此我深表歉意。但如果你们中的任何一个感兴趣,我希望你能帮助。

更新

这是贝利撒留法的问题。
它生成面积几乎可以忽略不计的三角形。
dat = Import[NotebookDirectory[] <> "/3DFoil.mat", "Data"];
(*With your points in "dat"*)
fd = First@Dimensions@dat;
check = ParametricPlot3D[{BSplineFunction[dat][u, v],
BSplineFunction[{dat[[1]], Reverse@dat[[1]]}][u, v],
BSplineFunction[{dat[[fd]], Reverse@dat[[fd]]}][u, v]}, {u, 0,
1}, {v, 0, 1}, Mesh -> All, AspectRatio -> Automatic,
PlotPoints -> 10, Boxed -> False, Axes -> False]

输出在这里
enter image description here
Export[NotebookDirectory[]<>"myres.obj",check];
cd=Import[NotebookDirectory[]<>"myres.obj"];
middle=
check[[1]][[2]][[1]][[1(* Here are the numbers of different Graphics group*)]][[2,1,1,1]];
sidePatch1=check[[1]][[2]][[1]][[2]][[2,1,1,1]];
sidePatch2=check[[1]][[2]][[1]][[3]][[2,1,1,1]];

一共有三个 Graphics组休息是空的。现在让我们看看这些组中三角形的面积。
polygonArea[pts_List?
(Length[#]==3&)]:=Norm[Cross[pts[[2]]-pts[[1]],pts[[3]]-pts[[1]]]]/2
TriangleMaker[{a_,b_,c_}]:={vertices[[a]],vertices[[b]],vertices[[c]]}
tring=Map[polygonArea[TriangleMaker[#]]&,middle];
tring//Min

对于中大组输出是
0.000228007

因此,这是一个允许的三角测量。但是对于侧面补丁,我们得到零区域。
Map[polygonArea[TriangleMaker[#]] &, sidePatch1] // Min
Map[polygonArea[TriangleMaker[#]] &, sidePatch2] // Min

贝利撒留有什么出路吗?

我的部分解决方案

首先从 Wolfram archive下载复杂多边形简化包.
fu = BSplineFunction[dat];
pic =(*ParametricPlot3D[fu[u,v],{u,0,1},{v,0,1},Mesh->None,
AspectRatio->Automatic,PlotPoints->25,Boxed->False,Axes->False,
BoundaryStyle->Red]*)
ParametricPlot3D[fu[u, v], {u, 0, 1}, {v, 0, 1}, Mesh -> None,
AspectRatio -> Automatic, PlotPoints -> 10, Boxed -> False,
Axes -> False, BoundaryStyle -> Black];
bound = First@Cases[Normal[pic], Line[pts_] :> pts, Infinity];
corners = Flatten[Table[fu[u, v], {u, 0, 1}, {v, 0, 1}], 1];
nf = Nearest[bound -> Automatic]; {a1, a2} =
Union@Flatten@(nf /@ corners);
sets = {bound[[2 ;; a1]], bound[[a1 ;; a2]],bound[[a2 ;; a2 + a1]]};
CorrectOneNodeNumber = Polygon[sets[[{1, 3}]]][[1]][[1]] // Length;
CorrectOneNodes1 =
Polygon[sets[[{1, 3}]]][[1]][[1]]; CorrectOneNodes2 =
Take[Polygon[sets[[{1, 3}]]][[1]][[2]], CorrectOneNodeNumber];
<< PolygonTriangulation`SimplePolygonTriangulation`
ver1 = CorrectOneNodes1;
ver2 = CorrectOneNodes2;
triang1 = SimplePolygonTriangulation3D[ver1];
triang2 = SimplePolygonTriangulation3D[ver2];
Show[Graphics3D[{PointSize[Large], Point[CorrectOneNodes1]},Boxed -> False,
BoxRatios -> 1], Graphics3D[{PointSize[Large], Point[CorrectOneNodes2]},
Boxed -> False, BoxRatios -> 1],
Graphics3D[GraphicsComplex[ver1, Polygon[triang1]], Boxed -> False,
BoxRatios -> 1],
Graphics3D[GraphicsComplex[ver2, Polygon[triang2]], Boxed -> False,
BoxRatios -> 1]]

我们在这里得到漂亮的三角形。
picfin=ParametricPlot3D[fu[u,v],{u,0,1},  {v,0,1},Mesh->All,AspectRatio->Automatic,PlotPoints->10,Boxed->False,Axes->False,BoundaryStyle->None];pic3D=Show[Graphics3D[GraphicsComplex[ver1,Polygon[triang1]]],picfin,Graphics3D[GraphicsComplex[ver2,Polygon[triang2]]],Boxed->False,Axes->False]

enter image description here
enter image description here

现在这只有一个问题。这里不管 PlotPoints总是出现四个三角形,只是 仅共享一条边 与任何其他相邻的三角形。但是我们希望所有三角形与其他三角形共享至少两条边。如果我们使用贝利撒留法,就会发生这种情况。但它创建的三角形太小,我的面板求解器将其视为零面积的刺痛。

可以在这里检查我的方法的问题。这里我们将使用 Sjoerd的解决方案中的方法。 .
Export[NotebookDirectory[]<>"myres.obj",pic3D];
cd=Import[NotebookDirectory[]<>"myres.obj"];
polygons=(cd[[1]][[2]]/.GraphicsComplex-> List)[[2]][[1]][[1,1]];
pt=(cd[[1]][[2]]/.GraphicsComplex-> List)[[1]];
vertices=pt;
(*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*)
ClearAll[edgesNeighbors]
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]
(*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}];
Cases[Cases[trires,x_:>Length[x]],4]

输出显示总是有四个三角形与其他三角形只共享一条边。
{4,4,4,4}

在 belisarius 方法的情况下,我们不会看到这种情况发生,但我们会得到面积为零的三角形。

BR

最佳答案

导入数据并像以前一样构造 BSpline 函数:

dat = Import["Downloads/3DFoil.mat", "Data"];

fu = BSplineFunction[dat]

生成曲面,确保包括(仅)边界线,它将沿着曲面的边缘。确保设置 MeshAllNone .
pic = ParametricPlot3D[fu[u, v], {u, 0, 1}, {v, 0, 1}, Mesh -> None, 
AspectRatio -> Automatic, PlotPoints -> 10, Boxed -> False,
Axes -> False, BoundaryStyle -> Red]

从边界线上提取点:
bound = First@Cases[Normal[pic], Line[pts_] :> pts, Infinity]

根据您的参数空间找到“角落”:
corners = Flatten[Table[fu[u, v], {u, 0, 1}, {v, 0, 1}], 1]

找到与角对应的最佳边缘点,记住 ParametricPlot3D不完全使用限制,所以我们不能只使用 Position :
nf = Nearest[bound -> Automatic];
nf /@ corners

计算边界上的哪些点范围对应于您需要填充的区域。此步骤涉及一些手动检查。
sets = {bound[[2 ;; 22]], bound[[22 ;; 52]], bound[[52 ;; 72]], 
bound[[72 ;;]]}

构建与孔对应的新多边形:
Graphics3D[Polygon[sets[[{1, 3}]]], Boxed -> False, BoxRatios -> 1]

Show[pic, Graphics3D[Polygon[sets[[{1, 3}]]]]]

请注意,您提到的孔之间的边缘所在的位置可能仍有一个看不到的孔,我还没有尝试填充它,但是如果需要,您应该有足够的信息来执行此操作。

关于wolfram-mathematica - 修改由 ParametricPlot3D 生成的 Graphics3D 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7676032/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com