B-Splines/de

Diese Seite beschreibt, wie man B-Splines in FreeCAD verwendet. Sie gibt auch Hintergrundinformationen, was B-Splines sind und für welche Anwendungen sie nützlich sind.

Motivation
Wenn du bereits über B-Splines und deren Anwendung Bescheid weisst, kannst du direkt mit dem Abschnitt B-Splines in FreeCAD fortfahren.

Nehmen wir an, Du willst ein Teil entwerfen, das mit einem 3D Drucker hergestellt werden soll. Das Teil muss so eine Kante haben:



Du musst das Teil in Richtung der Unterseite der Skizze nach oben drucken. Äußere Stützstrukturen sind möglicherweise keine Option. Daher musst Du eine Stütze direkt an deinem Teil anbringen. Welche Möglichkeiten hast du?


 * Option 1: du kannst eine Linie vom Punkt (20, 0) zum Punkt (80, 40) hinzufügen:



Allerdings benötigt diese Lösung viel Volumen, also Gewicht und Material.


 * Option 2: du kannst die beiden Punkte mit einem Kreisbogen verbinden. Um Volumen zu sparen, sollte der Bogen tangential im Punkt (80,40) enden. Dann sieht deine Lösung wie folgt aus:



GUT. Aber ganz unten brauchst du keine sofortige Unterstützung.


 * Option 3: du kannst noch mehr Volumen einsparen, wenn die Verbindung zwischen den beiden Punkten eine Kurve wäre, die tangential bei (0, 20) beginnt und tangential bei (80, 40) endet:



So kann eine Kurve, mit der du zwei Punkte tangential zu einem Bezugspunkt verbinden kannst, sehr nützlich für Konstruktionen sein. Bézierkurven bieten diese Möglichkeit.

Herleitung
Bézierkurven sind Polynome zur Beschreibung der Verbindung zwischen 2 Punkten. Das einfachste Polynom, das 2 Punkte verbindet, ist eine Gerade ($$A*x^1+B$$), daher sind auch lineare Bézierkurven linear:



Ein Polynom wird jedoch erst dann nützlich, wenn wir es kontrollieren können. Es sollte also einen Punkt zwischen den beiden Endpunkten geben, der es uns erlaubt zu definieren, wie die Endpunkte verbunden sind. Wie im obigen Beispiel, Option 3, ist die Kurve hilfreich, wenn sie tangential zu Linien beginnt und endet, die die Endpunkte kreuzen. Und das ist ein Hauptmerkmal von Bézierkurven. Fügen wir also einen Kontrollpunkt zwischen den 2 Endpunkten ein. Die Kurve beginnt tangential zu diesem Kontrollpunkt, d. h. sie verläuft tangential zu der Linie, die wir zwischen dem Startpunkt und dem Kontrollpunkt ziehen können. Wenn man vom Endpunkt aus rückwärts geht, verläuft die Kurve ebenfalls tangential zu der Linie, die wir zwischen dem Kontrollpunkt und dem Endpunkt zeichnen können. Animation 2 zeigt, wie eine solche Kurve aussieht.



Die Animation verdeutlicht, worum es sich bei der Kurve im Grunde handelt - um einen Übergang von P0 zu P2, indem die Linie P0-P1 in die Linie P1-P2 gedreht wird. Dadurch erhalten wir das schöne tangentiale Anfang/Ende Merkmal.

Eine solche Kurve kann nur durch ein quadratisches Polynom beschrieben werden. (Die Anzahl der Links-/Rechtsdrehungen + 1 ist die erforderliche Polynomordnung. Ein quadratisches Polynom hat eine einzige Windung, ein kubisches Polynom hat zwei Windungen usw.) Daher ist eine Bézierkurve mit einem Kontrollpunkt eine quadratische Bézierkurve (zweiter Ordnung).

Ein einziger Kontrollpunkt ist oft nicht ausreichend. Nimm das obige Motivationsbeispiel. Bei der Option 3 endet die Kurve tangential in x-Richtung. Aber wie kann man die Punkte (20, 0) und (80, 40) so verbinden, dass die Kurve tangential in y-Richtung endet? Dazu braucht man erst eine Rechts- und dann eine Linkskurve, also ein kubisches Polynom (dritter Ordnung). Und das bedeutet für eine Bézierkurve, dass wir einen zweiten Kontrollpunkt brauchen (oder man kann sagen, wir gewinnen). Animation 3 zeigt eine kubische Bézierkurve.



Um die Frage zu beantworten: Die Lösung mit dem tangentialen Ende in y-Richtung für das Beispiel ist diese:



Mathe
Wenn du an den mathematischen Hintergründen interessiert bist, hier sind die Grundlagen.

Eine Bézierkurve wird mit dieser Formel berechnet:

$$\quad \textrm{Bezier}(n,t)=\sum_{i=0}^{n}\underbrace{\binom{n}{i}}_{\text{Polynomausdruck}}\underbrace{\left(1-t\right)^{n-i}t^{i}}_{\text{Polynomausdruck}}\; \underbrace{P_{i}}_{\text{Punktkoordinate}} $$

Dabei ist n der Grad der Kurve. Eine Bézierkurve vom Grad n ist also ein Polygon der Ordnung n. Die Faktoren $$P_{i}$$ sind dabei die Koordinaten der Kontrollpunkte der Bézierkurven. Zur Veranschaulichung siehe Steuerung von Bézierkurven.

Wenn du weiter interessiert bist, sieh dir Die Mathematik der Bézierkurven mit einer schön animierten Herleitung der Mathematik der Bézierkurven an.

Regeln
Im obigen Text sind dir vielleicht schon einige "Regeln" für Bézierkurven aufgefallen:
 * Der Polynomgrad ist auch der Grad der Kurven.
 * Wenn du $$n$$ Krümmungen benötigst, benötigst du mindestens eine Bézierkurve vom Grad $$n+1$$.
 * Eine Bézierkurve beginnt immer tangential zu der Linie zwischen dem Startpunkt und dem ersten Kontrollpunkt (und endet tangential zu der Linie zwischen dem letzten Kontrollpunkt und dem Endpunkt).

Grundlagen
Dieses Video listet zu Beginn die praktischen Probleme mit Bézierkurven auf. Zum Beispiel, dass das Hinzufügen oder Ändern eines Kontrollpunktes die gesamte Kurve verändert. Diese Probleme können gelöst werden, indem man mehrere Bézierkurven miteinander verbindet. Das Ergebnis ist ein sogenannter Spline, insbesondere ein B-Spline (Basis Spline). Das Video erklärt auch, dass eine Vereinigung von quadratischen Bézierkurven einen einheitlichen quadratischen B-Spline und eine Vereinigung von kubischen Bézierkurven einen einheitlichen kubischen B-Spline bildet.

Aus den Videos können wir nützliche "Regeln" für B-Splines entnehmen:
 * Der erste und letzte Kontrollpunkt ist der End/Startpunkt des Splines.
 * Wie bei Bézierkurven beginnen Splines immer tangential zur Linie zwischen dem Startpunkt und dem ersten Kontrollpunkt (und enden tangential zur Linie zwischen dem letzten Kontrollpunkt und dem Endpunkt).
 * Eine Vereinigung von $$S$$ Bézierkurven mit dem Grad $$D$$ hat $$S+D$$ Kontrollpunkte.
 * Da man in den meisten Fällen mit kubischen B-Splines arbeitet, kann man sagen, dass $$N$$ Kontrollpunkte zu $$N-3$$ Béziersegmenten und diese wiederum zu $$N-4$$ Segment-Knotenpunkten führen.
 * Ein B-Spline mit dem Grad $$D$$ bietet in jedem Punkt eine stetige Ableitung $$D-1$$ der Ordnung.
 * Für einen kubischen B-Spline bedeutet dies, dass sich die Krümmung (Ableitung zweiter Ordnung) nicht ändert, wenn man von einem Segment zum nächsten reist. Dies ist eine sehr nützliche Eigenschaft, wie wir später sehen werden.

If you are interested in more details about B-Spline properties, have a look at video MOOC Curves 8.2: Properties of B-spline curves.

Grundlage
The name B-spline stands for Basis spline. Instead of forming the spline as a combination of Bézier curves, the approach is to to model the same spline a different way. The idea is hereby to use another set of polynomials as basis. A linear combination of these basis polynomials $$B_D(t)$$ with the order $$D$$ forms the B-spline. This video explains the transition from the Bézier control points to the polynomial basis functions describing the spline. Mathematically we can describe a B-spline with this formula:

$$\quad c(t)=\sum_{k=0}^{N}p_{k}B_{k, D}(t) $$

Hereby $$p_k$$ is the $$k$$-th control point of the B-spline and also a factor for the $$k$$-th base polynomial $$B_{k, D}(t)$$. Every basis polynomial describe the spline in a certain region and therefore moving a control point does not affect the whole spline. To understand this, it is highly recommended to have a look at this video starting at minute 2:23.

As explained in the video, the basis polynomials are Bernstein polynomials. The set of basis polynomials for a certain B-spline can be visualized this way:



At every spline position $$t$$ the sum of polynomials is 1 (indicated by the orange line). At the start only the red polynomial has an influence since all other polynomials are there 0. At greater $$t$$ the spline is described by a linear combination of different basis polynomials. In the image above, every polynomial is greater than 1 for the whole range $$0 < t < 1$$. This is not necessarily the case. As shown in the video, the basis polynomials are basically only greater than 0 for a certain spline position range. The interval at which a basis polynomial is greater than 0 is described by the knot vector. If you are interested in learning about the knot vector, have a look at this video.

Uneinheitliche B-Splines
A property of the Bernstein polynomials is that when looking at the different S-spline Bézier parts, the path length of every part is the same. (The path length is often called the travel time). As you can imagine, it can be useful to have B-splines whose Bézier parts have different path lengths. This can be achieved by weighting the different polynomials:

$$\quad c(t)=\sum_{k=0}^{N}d_{k}B_{k, D}(t)w_k $$

$$w_k$$ is hereby the weight of the $$k$$-th control point. When the weights are not equal, the B-spline is called non-uniform.

Especially when B-splines should be used for 3D modelling, normalized, non-uniform B-splines are necessary. The normalization is done by a division by the weighted basis functions. Thus when all $$w_k$$ are equal, we get a uniform B-spline, independent on the weight itself:

$$\quad c(t)=\cfrac{\sum_{k=0}^{N}d_{k}B_{k, D}(t)w_k}{\sum_{k=0}^{N}B_{k, D}(t)w_k} $$

These non-uniform and rational (because of the division) B-splines are often called NURBS. Looking at their formula, we see that they are in fact a B-spline with a weighted basis $$R_{k, D}(t)$$:

$$\quad c(t)=\sum_{k=0}^{N}d_{k}R_{k, D}(t) $$

whereas

$$\quad R_{k, D}=\cfrac{B_{k,D}(u)w_k}{\sum_{l=1}^N B_{l,D}(t)w_l} $$

B-splines in FreeCAD
FreeCAD offers to create uniform or non-uniform B-splines of any degree in 2D via the Sketcher workbench.

Erstellung
To create B-splines, go into a sketch and use the toolbar button. Then left-click to set a control point, move the mouse left-click to set the next control point and so on. Finally right-click to finish the definition and create the B-spline.

By default uniform cubic splines are created, except there are not enough control points to do this. So when you create a B-spline with only 2 control points, you get of course a spline that is single linear Bézier curve, for 3 control points you get a quadratic Bézier curve, first with 5 control points you get a cubic B-spline consisting of 2 Bézier segments.

To create periodic B-splines (B-splines that form a closed curve), use the toolbar button. It is not necessary to set the last control point onto the first one because the B-spline will automatically be closed:



B-splines can also be generated out of existing sketch segments. To do this, select the elements and press the the toolbar button.

Ändern des Grads
To change the degree, select the B-spline and use either the toolbar button or.

Note: Decreasing the degree cannot revert a prior increase of the degree, see the Wiki page Decrease B-spline degree for an explanation.

Ändern der Knotenvielfalt
The points where two Bézier curves are connected to form the B-spline are called knots. The knot multiplicity determines how the Bézier parts are connected, see the Wiki page Increase knot multiplicity for details.

To change the knot multiplicity, use the toolbar buttons or.

Note: Creating two B-Splines that are connected to each other will not unite to a single new B-spline. So their connection point is not a knot. The only way to get a new knot in an existing B-spline is to decrease the degree. However, you may get many new knots. Thus the better choice is to redraw the B-spline with more control points.

Changing the Weight
Around every control point you see a dark yellow circle. Its radius sets the weight for the corresponding control point. By default all circles have the radius 1. This is indicated with a radius constraint for the first control point circle.

To create a non-uniform B-spline the weights have to be non-uniform. To achieve that you can either change the radius constraint of the first control point circle:



or you delete the constraint that all circles are equal and then set different radius constraints for the circles.

If no radius constraint is set, you can also change the radius by dragging:



In the dragging example you see that a high weight attracts the curve to the control point while a very low weight changes the curve so as if the control point does almost not exist.

When you look at the creation function for non-uniform rational B-splines you see that a weight of zero would lead to a division by zero. Therefore you can only specify weights greater than zero.

Informationen anzeigen
Since the form of a B-spline does not tell much about its properties, FreeCAD offers different tools to display the properties:

Begrenzungen
At the moment (FreeCAD 0.19) there are some limitations when using splines you should know:
 * 1) You cannot set tangential constraints. In this example Sketcher_spline-limit-tangential.png you want to assure that the spline touches the blue curve 2 times tangentially. This would be useful because the blue line could for example be the spatial border for your design.
 * 2) You cannot insert a new control point between two selected existing control points. There is no other way than to redraw the spline.
 * 3) You cannot delete a control point. Also in this case you must redraw the spline
 * 4) You cannot create an offset curve for a B-spline using the tool Draft Offset.

Typische Anwendungsfälle
According to the properties of B-splines, there are 3 main use cases:
 * 1) Curves that start/end tangentially to a certain direction. An example for this is the motivation example above.
 * 2) Curves describing larger designs and providing the freedom of local changes. See this example below.
 * 3) Curves providing a certain continuity (derivative). See this example below.

Gestaltung
Take for example the case that you design a housing of a kitchen mixer. Its desired shape should look like this one:



To define the outer form it is advantageous to use a B-spline because when you change a control point to change the curvature at the bottom, the curvature at the side and top will not be changed:



Stetigkeit an geometrischen Übergängen
There are several cases where it is physically necessary to have a certain surface continuity at geometric transitions. Take for example the inner walls of a fluid channel. When you have a change in the diameter of the channel, you don't want to have an edge because edges would introduce turbulences. Therefore, like in the motivation example above, one uses splines for this purpose.

The development of the Bézier curves was initially triggered by the French car industry. Besides the saving of material and the reduction of the air flow drag, the look of the cars should also be improved. And when you look at the fancy design of French cars from the 60's and 70's you see that the Bézier curves gave car design a boost.

Let's take for example this task in the design of cars: The car fender should "look nice". Here is a basic sketch of our task:



"Looking nice" means that the (potential) customer looks at the fender and does not see unexpected light reflections and also no sudden changes in the reflection from the automotive paint at all. So what do you need to avoid changes in the reflections? Looking closely to the fender:



you see when there is an edge, there is a spatial area where the reflected light has less intensity and this is what you will notice when looking at the fender. To avoid this you need a continuous change in the slope of your surface elements. The slope is the first order derivative and as explained in section Basics, a second degree (quadratic) B-spline offers at every point a continuous first order derivative.

But is this really sufficient? At the point of geometric transition we have now at both sides the same slope, but the slope might change differently at both sides. Then we have this situation:



So we have also spatial areas in which the intensity of reflected light is different. To avoid this, we need at the geometrical point of transition also a continuity of the second order derivative and thus a cubic B-spline.