Bézierfläche

TomyUlrich shared this question 4 months ago
Needs Answer

Hallo zusammen,


ich versuche eine Bézierfläche mit dem Befehl "Oberfläche" zu generieren.


In der Liste/Matrix KP sind die 16 Kontrollpunkte (nennen wir sie P_nm, 0<=n,m<=3 - ist für die mitgegebene Datei nicht relevant) definiert.


Mit den zwei über Schieberegler definiterten Parametern s,t in [0,1] und dem via


P:=(x(Summe(Summe(nCr(3, n)*(1 - s)^(3 - n)*s^n*nCr(3, m)*(1 - t)^(3 - m)*t^m*Element(KP, n+1, m+1), n, 0, 3), m, 0, 3)),y(Summe(Summe(nCr(3, n)*(1 - s)^(3 - n)*s^n*nCr(3, m)*(1 - t)^(3 - m)*t^m*Element(KP, n+1, m+1), n, 0, 3), m, 0, 3)),z(Summe(Summe(nCr(3, n)*(1 - s)^(3 - n)*s^n*nCr(3, m)*(1 - t)^(3 - m)*t^m*Element(KP, n+1, m+1), n, 0, 3), m, 0, 3)))


definierten Punkt P(s,t) zeichnet dessen Spur bei Variation von s & t wunderbar die gewünschte Fläche.


Weshalb funktioniert es mit der Variante über den Oberfläche-Befehl nicht?

Oberfläche(x(Summe(Summe(nCr(3, n)*(1 - u)^(3 - n)*u^n*nCr(3, m)*(1 - v)^(3 - m)*v^m*Element(KP, n+1, m+1), n, 0, 3), m, 0, 3)),y(Summe(Summe(nCr(3, n)*(1 - u)^(3 - n)*u^n*nCr(3, m)*(1 - v)^(3 - m)*v^m*Element(KP, n+1, m+1), n, 0, 3), m, 0, 3)),z(Summe(Summe(nCr(3, n)*(1 - u)^(3 - n)*u^n*nCr(3, m)*(1 - v)^(3 - m)*v^m*Element(KP, n+1, m+1), n, 0, 3), m, 0, 3)),u,0,1,v,0,1)


(Ich habe die Parameter s,t mit u,v ersetzt, da s&t per Schieberegler festgesetzt sind.)


Vielen Dank im Voraus

und freundliche Grüsse.

Tomy

Comments (9)

photo
1

Maybe this is interesting? https://www.geogebra.org/m/fqfe5trp

photo
1

Hello Mr Borcherds


Thank you very much but I think this is not what I need.


You do an explicit description of the surface and at first glance it has something to do with minimization/fitting. I want to do Béziersurfaces which I think could also have configurations without a global explicit description (only local). So I want to stick to the parametric description with the Bernstein polynomials.


I just don't get it, why the point P on the surface can be modelled with the rulers s,t but it doesn't work out with the "surface" (I hope this is the matching English command) function and parameters u,v (replacing s,t because they are determined by the rulers).


Best regards

Tomy

photo
1

PS: interesting it is of course!

photo
photo
1

Der Oberfläche-Befehl scheint bei solchen geschachtelten Befehlen etwas in Bedrängnis zu geraten. Ich würde dir raten folgenden Weg einzuschlagen (Warnung dieser Weg ist nicht optimiert/optimal).9e96eb402b237af2423e389dd7dbc4f3

Ausgang ist deine 4x4 Koordinatenmatrix.

KP = {{(75, 0, 86), (73, 28, 85), (66, 13, 85), (51, 47, 85)}, {(63, 6, 60), (58, 30, 60), (56, 48, 60), (47, 56, 60)}, {(71, 21, 25), (62, 32, 25), (46, 45, 25), (37, 21, 25)}, {(73, 0, 0), (60, 20, 0), (39, 37, 0), (43, 55, 0)}}
Gemäß der Bézierkurven-Definition sind das die Polynomgrade
p = {3, 3}
für jede Richtung. Da die Binomialkoeffizienten in Formeln Probleme machen berechne sie vorher.
BK = Folge(Folge(nCr(p(d), i - 1), i, 1, p(d) + 1), d, 1, Länge(p))
Nun berechne alle Basisfunktionen und ordne sie linear an.
N = Verbinde(Folge(Folge(Wenn(-1 <= x <= 1 && -1 <= y <= 1, Element(BK, 1, i) 1 / 2^p(1) (x + 1)^(i - 1) (1 - x)^(p(1) - i + 1) Element(BK, 2, j) 1 / 2^p(2) (y + 1)^(j - 1) (1 - y)^(p(2) - j + 1)), j, 1, p(2) + 1), i, 1, p(1) + 1))
Die Kontrollpunkte können auch gleich linear angeordnet werden.
P = Verbinde(KP)
Nun Berechne die Zwischenfunktionen für jede Richtung.
X(x, y) = Summe(N x(P))
Y(x, y) = Summe(N y(P))
Z(x, y) = Summe(N z(P))
Als letzter Schritt kann dann die 3D-Oberfläche definiert werden.
Oberfläche(X(u, v), Y(u, v), Z(u, v), u, -1, 1, v, -1, 1)

Beachte, dass dieser Weg wirklich sehr sehr ungünstig für GGb ist (abgesehen davon, dass es vermutlich auch allgemein ungünstig ist). Besser ist es vermutlich die geometrische Konstruktion zu wählen.

Leider gibt es im kein 2D Konterpart zum 1D Ortslinien-Befehl. Falls es dies doch möglich ist so kann man den hieraus resultierenden Punkt nutzen die Oberfläche zu erzeugen (dürfte vermutlich deutlich performanter und sogar dynamisch sein):

Element(Iteration(Teilliste(L, 1, Länge(L) - 1) t + Teilliste(L, 2, Länge(L)) (1 - t), L, {Folge(Element(Iteration(Teilliste(L, 1, Länge(L) - 1) s + Teilliste(L, 2, Länge(L)) (1 - s), L, {Element(KP, j)}, Länge(KP) - 1), 1), j, 1, Länge(KP))}, Länge(KP) - 1), 1)

Generell empfehle ich nicht GGb für rekursive 2D Flächendefinitionen zu nutzen. Es ist einfach zu langsam dafür.

photo
1

5e376b84c22ed0593b369e325ce2d0f7

Hier noch ein paar Befehle um die Dateien etwas anzureichern:

bezier_surf.ggb & bezier_surf_geo.ggb

{Zip(Polygonzug(L), L, KP), Zip(Polygonzug(L), L, Transponiere(KP))}

bezier_curve.ggb

Zip(Polygonzug(L), L, Iterationsliste(Teilliste(L, 1, Länge(L) - 1) s + Teilliste(L, 2, Länge(L)) (1 - s), L, {KP}, Länge(KP) - 2))

Desweiteren müssten die Ausdrücke (1-s) mit s, (1-t) mit t und deren jeweilige Gegenstücke substituiert werden damit der Laufindex für die geometrische Konstruktion richtig herum verläuft (echt nervig, dass man kompliziertere Posts nicht nachberarbeiten kann...).

photo
photo
1

Natürlich ist auch folgendes möglich:

KP = {{(75, 0, 86), (73, 28, 85), (66, 13, 85), (51, 47, 85)}, {(63, 6, 60), (58, 30, 60), (56, 48, 60), (47, 56, 60)}, {(71, 21, 25), (62, 32, 25), (46, 45, 25), (37, 21, 25)}, {(73, 0, 0), (60, 20, 0), (39, 37, 0), (43, 55, 0)}}
C = Oberfläche( Element(KP, 1,1) (1 - u)^3 (1 - v)^3 + Element(KP,1, 2) * 3 u (1 - u)^2 (1 - v)^3 + Element(KP,1, 3) * 3 u^2 (1 - u) (1 - v)^3 + Element(KP,1, 4) u^3  (1 - v)^3 + Element(KP, 2,1) (1 - u)^3 3 v (1 - v)^2 + Element(KP,2, 2) * 3 u (1 - u)^2 3 v (1 - v)^2 + Element(KP,2, 3) * 3 u^2 (1 - u) 3 v (1 - v)^2 + Element(KP,2, 4) u^3 3 v (1 - v)^2 + Element(KP, 3,1) (1 - u)^3 3 v^2 (1 - v) + Element(KP,3, 2) * 3 u (1 - u)^2 3 v^2 (1 - v) + Element(KP,3, 3) * 3 u^2 (1 - u) 3 v^2 (1 - v) + Element(KP,3, 4) u^3 3 v^2 (1 - v) + Element(KP, 4,1) (1 - u)^3 v^3 + Element(KP,4, 2) * 3 u (1 - u)^2 v^3 + Element(KP,4, 3) * 3 u^2 (1 - u) v^3 + Element(KP,4, 4) u^3  v^3 , u, 0, 1, v, 0, 1)

photo
1

Hallo -Loco-,


vielen herzlichen Dank für die ausführlichen Vorschläge. Das "funktioniert" so. Allerdings ist mein Compi bzw. GG hoffnungslos überfordert und man kann auch die 3D-Grafik kaum kontrolliert drehen.


(Ich hatte es auch noch mit Ortslinien versucht aber die werden sogar falsch gezeichnet von GG.)


Mit freundlichen Grüssen

Tomy Ulrich

photo
1

Okay, funktioniert evtl. eine der angehängten Notlösungen?

Interessanterweise lässt sich die 3D-Ansicht drehen ohne, dass die Spuren verschwinden.

/wdFqaOCznLNcQAAAABJRU5ErkJggg==/AS7PSZYJwa7+AAAAAElFTkSuQmCC


Wenn nicht dann sehe ich keine andere Lösung das bei dir mit GGb darzustellen.

photo
1

Hallo -Loco-,


vielen herzlichen Dank. Solche Ansätze hatte ich auch schon probiert - funktioniert bisher am besten aber wie erwähnt nicht wirklich befriedigend auf meiner Maschine.


Ist schon ok - von mir aus ist gut, ich kann momentan damit leben.


Vielen herzlichen Dank.

Tomy Ulrich

photo
© 2020 International GeoGebra Institute