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 */