Kontrollnetz des Torus

Oct 27 2020

Ich möchte aus einem Torus ein vollständiges Kontrollnetz machen. Das Netz ist jedoch nicht geschlossen. Kann jemand dieses Problem lösen?

pts6 = Table[{(2 + 1 Cos [s])*Cos [t], (2 + 1 Cos [s])*Sin[t], 1 Sin[s]},
  {s, -Pi, Pi}, {t, -Pi, Pi}];
f = BSplineFunction[pts6, SplineClosed -> {True, True}];
Show[
  Graphics3D[{PointSize[Large], Black, Map[Point, pts6]}],
  Graphics3D[{Gray, Line[pts6], Gray, Line[Transpose[pts6]]}],
  ParametricPlot3D[f[s, t], {s, 0, 1}, {t, 0, 1}, AxesLabel -> Automatic]]

] 1

Antworten

2 creidhne Nov 04 2020 at 00:27

Ulrichs Lösung beantwortet die Frage vollständig, es gibt jedoch ein Problem mit der von erzeugten Oberfläche BSpliceFunction. Beachten Sie, dass die Oberfläche kein Torus ist und der Innenradius einen Bruch aufweist (es gibt einen scharfen Schatten, der glatt sein sollte). Verwendung pts6aus Ulrichs Lösung und faus der Frage.

pts6 = Table[{(2 + Cos[t])*Cos[s], (2 + Cos[t])*Sin[s], Sin[t]}, {s, 
    Subdivide[-Pi, Pi, 6]}, {t, Subdivide[-Pi, Pi, 6]}];
f = BSplineFunction[pts6, SplineClosed -> {True, True}];
g1 = Show[Graphics3D[{PointSize[Large], Black, Map[Point, pts6]}],
  Graphics3D[{Thick, Gray, Line[pts6], Line[Transpose[pts6]]}],
  ParametricPlot3D[f[s, t], {s, 0, 1}, {t, 0, 1}]]

Die Ansicht von oben zeigt, dass das Netz ungleichmäßig verteilt ist und die Oberfläche kein Torus ist. Der Querschnitt ist nicht kreisförmig.

ParametricPlot3D[f[s, t], {s, 0, 1}, {t, 0, 1}, 
  ViewPoint -> {0, 0, \[Infinity]}, 
  PlotLabel -> "non-toroidal surface"]

ParametricPlot3D[f[s, t], {s, 0, 1}, {t, 0, 1},
 RegionFunction -> Function[{x, y, z, u, v}, 0 <= y <= 2],
 BoundaryStyle -> Black, Axes -> True, 
 PlotLabel -> "non-circular cross-section"]

Wenn wir BSplineFunctiondie SplineClosedOption mit verwenden, dürfen die Kontrollpunkte nicht geschlossen werden. BSpineFunctionVervollständigt die Oberfläche durch Verbinden der Grenzen. Beheben Sie das Problem, indem Sie die Spline-Funktion neu definieren f2, um die redundanten Endpunkte zu entfernen. Das Ergebnis ist ein Torus.

f2 = BSplineFunction[Most[pts6][[All, ;; -2]], SplineClosed -> {True, True}];
ParametricPlot3D[f2[s, t], {s, 0, 1}, {t, 0, 1}, ViewPoint -> {0, 0, \[Infinity]}

Hier ist die korrigierte Ansicht der Kontrollpunkte mit dem Torus im Vergleich zur Originalgrafik.

g2 = Show[Graphics3D[{PointSize[Large], Black, Map[Point, Most@pts6]}],
  Graphics3D[{Thick, Gray, Line[pts6], Line[Transpose[pts6]]}],
  ParametricPlot3D[f2[s, t], {s, 0, 1}, {t, 0, 1}]]

1 UlrichNeumann Oct 27 2020 at 18:08

Die Definition der Kontrollpunkte ist falsch. {s,-Pi,Pi}inside Tableerstellt ein S-Gitter, {_pi,-Pi+1,-Pi+2,...}das nicht den letzten Punkt enthält Pi.

Definieren Sie die Kontrollpunkte neu auf

pts6 = Table[{(2 + 1 Cos[s])*Cos[t], (2 + 1 Cos[s])*Sin[t],1 Sin[s]}, {s, Subdivide[-Pi, Pi, 10]}, {t,Subdivide[-Pi, Pi, 10]}]