Krzywa i płat Beziera

Do projektowania kadłubów czy elementów o wzdłużnej płaszczyźnie symetrii posłuży nam płat Beziera. Dla jego konstrukcji wykorzystujemy wiedzę o krzywej kubicznej Beziera. Poniżej kod z programu OpenSCAD, który przybliży nam te pojęcia.

$fa=1;
$fs=0.4;
$fn=40;

/* ------------ Krzywa Beziera -------------- */

function bt0(t) = pow(1-t,3);
function bt1(t) = 3*t*pow(1-t,2);
function bt2(t) = 3*t*t*(1-t);
function bt3(t) = t*t*t;

// cp = [[x,y,z],[x,y,z],[x,y,z],[x,y,z]]
// t = <0,1>
function Bernstein(t, cp) = [
    bt0(t)*cp[0][0]+bt1(t)*cp[1][0]+bt2(t)*cp[2][0]+bt3(t)*cp[3][0],
    bt0(t)*cp[0][1]+bt1(t)*cp[1][1]+bt2(t)*cp[2][1]+bt3(t)*cp[3][1],
    bt0(t)*cp[0][2]+bt1(t)*cp[1][2]+bt2(t)*cp[2][2]+bt3(t)*cp[3][2] ];

//oblicza punkty krzywej Beziera w przestrzeni 3D z zadanym skokiem s
function getPB(cp,s=0.05) = [ for (t=[0:s:1]) Bernstein(t, cp) ];

//b =  [[0,0,0],[0,50,0],[100,50,0],[100,0,0]];
module draw_bezier(cp, s, radius=0.5) {
    points = getPB(cp, s);
    for (i = [0: len(points)-1]) translate(points[i]) sphere(radius);
}
// draw_bezier(b, 0.1);
/* -------------- Płaty Beziera --------------- */

// na bazie czterech krzywych Beziera opisanych za pomocą ich
// punktów kontrolnych tworzy tablicę punktów tych krzywych
// z zadanym skokiem s
function getSBU(data,s=0.05) = [
    for(n=[0:3]) getPB(data[n], s) ];

//oblicza punkty płata w wierszach przyjmując krzywe Beziera
// z punktami kontrolnymi z tablicy u=getSBU()
function getSBV(data,s) = [
       for (m=[0:len(data[0])-1])
              [  for(t=[0:s:1]) Bernstein(t,[data[0][m],data[1][m],
                data[2][m],data[3][m]]) ]
];
function createPointsForPoly(data) =
       let ( u = len(data), v = len(data[0]) )
       [ for(k=[0:u-1])
           for(w=[0:v-1]) data[k][w] ];
 function createFacesForPoly(data) =
       let ( u = len(data), v = len(data[0]) )
       [ for(k=[0:u-2])
           for(w=[0:v-2]) [k*v+w,k*v+w+1,(k*v+1)+v+w,(k*v+1)+w+v-1] ];

 module drawSurfaceBezier(data4Bez,s=0.025) {
    //tworzymy tablicę punktów kontrolnych z zadanym skokiem w kolumnach
    u = getSBU(data4Bez, s);
    //obliczamy punkty płata w wierszach
    v = getSBV(u, s);
    p = createPointsForPoly(v);
    f = createFacesForPoly(v);
    polyhedron(p,f);
 }
/* /test
pU = [
    [[0,0,25],[0,-20,15],[0,-40,-15],[0,0,-25]],
    [[10,0,25],[10,-25,18],[10,-50,-18],[10,0,-25]],
    [[20,0,25],[20,-15,15],[20,-35,-15],[20,0,-25]],
    [[30,0,25],[30,-10,10],[30,-25,-10],[30,0,-25]] ];

 //hull() {
    drawSurfaceBezier(pU);
   //mirror([0,1,0]) drawSurfaceBezier();
 //}
//end test  */ 
Powłoka (płat Beziera) dla przykładowych danych