B-Splines/bg

Тази страница описва как да използвате B-сплайни в FreeCAD. Той също така дава основна информация какво представляват B-сплайните и за какви приложения са полезни.

Мотивация

Ако вече знаете за B-сплайните и тяхното приложение, можете директно да продължите с раздел B-сплайните във FreeCAD.

Да приемем, че искате да проектирате част, която трябва да бъде произведена с 3D принтер. Частта трябва да има следния контур:

Трябва да отпечатате частта по посока на долната част на скицата към върха. Външните поддържащи структури може да не са опция. Затова трябва да добавите поддръжка директно към вашата част. Какви опции имате?

Това решение обаче се нуждае от много обем, като по този начин добавя тегло и материал.

Добре. Но на дъното не се нуждаете от незабавна опора.

Така че крива, с която можете да свържете две точки тангенциално към референтна точка, може да бъде много полезна за конструкции. Кривите на Bézier осигуряват тази функция.

Криви на Bézier

Произход

Кривите на Bézier са полиноми, с които се описва връзката между 2 точки. Най-простият полином, свързващ 2 точки, е линия (A*x1+B), така че линейните криви на Bézier също са сегменти на линиите:

Анимация 1: Линейна крива на Безие.

Въпреки това полиномът става полезен, когато можем да го контролираме. Така че трябва да има точка между 2-те крайни точки, която ни позволява да определим как са свързани крайните точки. Както в горния пример вариант 3, кривата е полезна, когато започне и завършва тангенциално до линии, пресичащи крайните точки. И това е основна характеристика на кривите на Bézier. Така че нека добавим контролна точка между 2-те крайни точки. Кривата ще започне тангенциално към тази контролна точка, което означава, че е допирателна към линията, която можем да изтеглим между началната точка и контролната точка. Връщайки се назад от крайната точка, кривата също ще бъде допирателна към линията, която можем да изтеглим между контролната точка и крайната точка. Анимация 2 показва как изглежда такава крива.

Анимация 2: Квадратична крива на Безие. P1 е контролната точка.

Анимацията дава ясно да се разбере каква е кривата в общи линии - преход от P0 към P2 чрез завъртане на линията P0-P1, за да се превърне в линията P1-P2. Затова получаваме хубавата тангенциална функция за начало/край.

Такава крива може да бъде описана само с квадратичен полином. (Броят на завоите ляво/дясно + 1 е необходимият полиномен ред. Квадратичният полином е един завой, кубичен полином има два завоя и така нататък.) Следователно кривата на Bézier с една контролна точка е квадратична (втори ред) крива на Bézier.

Наличието само на една контролна точка често не е достатъчно. Вземете горния пример за мотивация. Там във вариант 3 завършваме кривата тангенциално в x-посока. Но как можете да свържете точките (20, 0) и (80, 40), така че кривата да завърши тангенциално в y-посока? За да постигнете това, първо се нуждаете от завой надясно и след това от завой наляво, така че е необходим кубичен (трети ред) полином. А това означава за крива на Безиер, от която се нуждаем (или можете да кажете, че придобиваме) е с втора контролна точка. Анимация 3 показва кубична крива на Безие.

Анимация 3: Кубична крива на Bézier.

За да се отговори на въпроса, решението с тангенциалния y-посока за примера е това:

Правила

В Произход може би вече сте забелязали някои "правила" за криви на Bézier:

Математика

Ако се интересувате да разберете математика зад това, тук е основното.

Крива на Bézier се изчислява с помощта на тази формула:

Bezier(n,t)=∑i=0n(ni)⏟binomial term(1−t)n−iti⏟polynomial termPi⏟point coordinate

n е степента на кривата. Така че кривата на Bézier от степен "'n" е многоъгълник с n върха. Факторите Pi фактически са координатите на контролните точки на кривата на Bézier. За визуализация вижте Controlling Bézier curvatures.

Ако проявявате по-нататъшно интерес, погледнете The mathematics of Bézier curves с хубаво анимирано извеждане на математиката на кривите на Bézier.

B-сплайни

Основа

Това видео изброява в началото практическите проблеми с кривите на Bézier. Например, че добавянето или промяната на контролна точка променя цялата крива. Тези проблеми могат да бъдат решени чрез присъединяване на няколко криви на Bézier. Резултатът е така наречен сплайн, по-специално B-сплайн (базов сплайн). Видеото също така обяснява, че обединение на квадратични криви на Bézier образува еднороден квадратичен B-сплайн и че съюз на кубични криви на Bézier образува еднообразен кубичен B-сплайн.

От видеоклиповете можем да съберем полезни "правила" за B-сплайните:

Ако се интересувате от повече подробности за свойствата на B-сплайните, погледнете това видео.

Базис

Тъй като ще въведем само базиса на B-spline, няма да влизаме в подробности.

Базисът изгражда сплайна. Разглеждайки дефиницията на кривите на Bézier от раздел Math, ние помним, че кривата на Bézier е линейна комбинация от полиноми от х/y координатите на всяка от контролните точки като фактор. Тези полиноми се наричат полиноми на Бернщайн (Bernstein).

Тъй като няколко криви на Bézier се комбинират, за да образуват сплайн, получаваме набор от полиноми на Bernstein, образуващи сплайна (те са базисът). Тъй като искаме да преодолеем споменатите ограничения на кривите на Bézier, ние не комбинираме геометрично различните полиноми на Bernstein на кривите на Bézier, а дефинираме полиноми на Bernstein върху целия геометричен диапазон на сплайна. Така че ние не комбинираме кривите на Bézier с неговите полиноми на Bernstein, които биха били

Bezier−combination={∑i=0nPi⋅Bi,n(t),0≤t≤1∑i=0nPi+n⋅Bi,n(t−1),1≤t≤2⋯

където Bi,n(t) е i-тия Bernstein полином от степен n и коефициентите Pi са контролните точки от кривата на Bézier. Но ние използваме различно множество от функции които са дефинирани върху целия обхват на сплайна:

B−spline=∑i=0npi⋅Ni,n(t).

Забележете, че общо Ni,n(t)≠Bi,n(t), контролните точки на Bezier {P1,P2,…} са различни от контролните точки на B-сплайна {p1,p2,…}.

Различните Ni,n(t) са дефинирани на парче, където интервалът на всяко парче е интервалът на парчето Bézier.

Когато дължините на всички Ni,n парчета са равни, говорим за еднороден сплайн. (В литературата това често се обозначава като равно време за пътуване t на парче.)

За да разберете как pi са координатите на контролните точки на B-сплайн, вижте първата минута на това видео.

Възлов вектор

Както е изведено по-горе, B-сплайните се създават от Ni,n полиноми с гладкост до определена степен между частите. Крайните точки на интервала на дефиниция на частите се наричат възли. За сплайн, дефиниран върху k части, има възли k+1, дадени от така наречения knot vector (възлов вектор):
{t0,t1,t2,…,tk} докато t0<t1<t2<…<tk

Възловият вектор включва възлите на Ni,n базови функции, които определят B-сплайна, вижте това видео. Базисните функции на B-spline могат да бъдат изчислени с помощта на възловия вектора и алгоритъм за създаване, вижте това видео.

Производната, до което се изисква непрекъснатост, се дава от множествеността m. Затова можем да определим вектор с множествеността за всеки възел: {m0,m1,…,mk}. Възел на сплайна със степен d и множественост m означава, че кривата наляво и надясно към възела има поне до ред n равна производна (наречена C'n гладкост), докато n=d−m.

Нееднородни B-сплайни

Извеждането на B-сплайни от кривите на Bézier има математическото последствие, че при B-сплайните всяко полиномно парче има еднаква дължина. Такива B-сплайни се наричат "еднородни". По-общият случай е, когато те могат, но не трябва да имат същата дължина. Такива "нееднородни" сплайни имат предимството, че човек може да контролира колко близо сплайните пресичат контролната си точка.

Математически това се постига чрез дефиниране на различните Ni,n парчета върху различни интервали. Ако например B-сплайнът е дефиниран за интервала [0, 1], той е еднороден, ако всички негови, например 5 броя части, също са определени в този интервал. Ако сега N1,4 е дефиниран само в интервала [0, 0.6] (извън интервала е настроен на нула), той е по-кратък и по този начин сплайнът става нееднороден.

As described above the parameters of the knots are described by the knot vector. So the knot vector stores the definition intervals. When now one piece gets another interval, also the knot vector changes, see this video for a visualization.

Rational B-splines

A further generalization can be made for B-splines by introducing weights for the control points. This way it can be controlled "how important" a control point is.

The equation for such a spline is

c(n,t)=∑i=0ndiNi,n(t)⋅wi∑i=0nNi,n(t)⋅wi

Notice that the function is no longer a polynomial, but a rational function, and these splines are called rational B-splines. Observe that when all wi are equal, the equation reduces to a regular non-rational B-spline. So non-rational B-splines are a subset of rational B-splines.

Non-uniform and rational B-splines are often called NURBS and are widely used in geometric modeling.

B-сплайните във FreeCAD

FreeCAD предлага да създаде еднородни или нееднородни B-сплайни от всяка степен в 2D чрез работната маса Sketcher.

Създаване

За да създадете B-сплайни, отидете в скица и използвайте бутона от лентата с инструменти Create B-spline. След това щракнете с левия бутон, за да зададете контролна точка, преместете щракването с левия бутон на мишката, за да зададете следващата контролна точка и така нататък. Накрая щракнете с десния бутон, за да завършите дефиницията и да създадете B-сплайна.

По подразбиране се създават еднократни кубични сплайни, само че няма достатъчно контролни точки, за да направите това. Така че, когато създавате B-сплайн само с 2 контролни точки, получавате разбира се сплайн, който е единична линейна крива на Bézier, за 3 контролни точки получавате квадратична крива на Bézier, първо с 5 контролни точки получавате кубичен B-сплайн, състоящ се от 2 сегмента Bézier. Можете също така да използвате натиснете D, докато създавате B-сплайни, за да зададете степента му (все още степента ще падне в по-ниска, ако са предоставени по-малко точки).

За да създадете периодични B-сплайни (B-сплайни, които образуват затворена крива), използвайте бутона на лентата с инструменти Periodic B-spline. Не е необходимо да настройвате последната контролна точка към първата, тъй като B-сплайнът автоматично ще бъде затворен:

B-сплайните също могат да бъдат генерирани от съществуващите сегменти на скиците. За да направите това, изберете елементите и натиснете бутона на лентата с инструменти Convert Geometry to B-spline.

Докато създавате B-сплайн, степента му може да бъде уточнена чрез натискане на клавиш D. С това създаването на кубичен B-сплайн по подразбиране, ако е възможно, може да бъде отменено.

Променяне на степента

За да промените степента изберете B-сплайн и натиснете Increase B-spline degree or Decrease B-spline degree.

Забележка: Намаляването на степента не може да върне предварителното увеличение на степента, вижте страницата в Уики Decrease B-spline degree за обяснение.

Промяна на множествеността на възлите

Точките, в които две криви на Bézier са свързани в B-сплайна, се наричат възли. Множествеността на възли определя как са свързани частите на Bézier, вижте страницата в Уики Increase knot multiplicity за подробности.

За да промените множествеността на възел, използвайте бутоните на лентата с инструменти B-spline increase knot multiplicity или B-spline decrease knot multiplicity.

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 rational B-spline the weights have to be made independent. To achieve that you can 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. Negative weights are theoretically possible but they are not supported. Therefore you can only specify weights greater than zero.

Note: When dragging points, knots or widths, the circle diameters denoting the weight will change. This is because the diameter depends on the overall B-spline length for visualization reasons. The actual weight is not changed.

Editing knots

New knots can be added using the B-spline insert knot button.

A knot is deleted by decreasing it's degree to 0 (i.e applying B-spline decrease knot multiplicity when it's degree is 1).

Changing the parameter value of a knot is not yet supported.

Display information

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

Property Toolbar button
Degree Show/Hide B-spline degree
Control polygon Show/hide B-spline control polygon
Curvature comb Show/hide B-spline curvature comb
Knot multiplicity Show/hide B-spline knot multiplicity
Weights Show/hide B-spline control point weight

Limitations

Typical Use Cases

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.

Designing

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:

Continuity at geometric transitions

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:

At the spatial area above the edge the intensity of reflected light is low (denoted by the red ellipse) because no light is directly reflected in the direction from the edge to the eye.

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.

Creating an arc segment

Sometimes it might be useful to have an arc represented by a B-spline, for example if you need an arc to become a straight line in a part variation, which would usually require an infinite radius.

First, create a sketch for reference and create two equal length lines that represent the arc's tangents that meet up at an angle. Add an angle constraint between the two lines, check the Reference checkbox and give it a name.

Create a second sketch and constrain a B-spline with three control points to the two lines from the previous sketch. Finally, edit the weight of the middle control point, and add the following expression:

sin(<<ReferenceSketch>>.Constraints.angle / 2)

Where ReferenceSketch is the name of the previous sketch, and angle is the name of the above reference constraint.