Comment puis-je courber une feuille (cube)? Je voudrais contrôler l'angle du virage / de la courbe.
Par exemple
cube ([50,50,2]);
4 Réponses :
Je peux le faire de cette façon mais ce serait mieux si vous pouviez spécifier le pli / courbe en #degrees comme argument de la fonction:
$fn=300; module oval(w, h, height, center = false) { scale([1, h/w, 1]) cylinder(h=height, r=w, center=center); } module curved(w,l,h) { difference() { oval(w,l,h); translate([0.5,-1,-1]) color("red") oval(w,l+2,h+2); } } curved(10,20,30);
Vous pouvez rotate_extrude ()
un rectangle avec le paramètre angle. Cela nécessite la version openscad 2016.xx ou une version plus récente, voir la documentation .
Il est nécessaire d'installer un instantané de développement, voir download openscad
$fn= 360; w = 10; // width of rectangle h = 2; // height of rectangle l = 30; // length of chord of the curve dh = 4; // delta height of the curve module curve(width, height, length, dh) { r = (pow(length/2, 2) + pow(dh, 2))/(2*dh); a = 2*asin((length/2)/r); translate([-(r -dh), 0, -width/2]) rotate([0, 0, -a/2]) rotate_extrude(angle = a) translate([r, 0, 0]) square(size = [height, width], center = true); } curve(w, h, l, dh);
ressemble à ceci:
La courbe est définie par le rayon et l'angle. Je pense qu'il est plus réaliste d'utiliser d'autres dimensions comme la longueur ou le dh dans ce croquis
et calculez le rayon et l'angle
$fn= 360; w = 10; // width of rectangle h = 2; // height of rectangle l = 25; // length of chord of the curve dh = 2; // delta height of the curve module curve(width, height, length, dh) { // calculate radius and angle r = ((length/2)*(length/2) - dh*dh)/(2*dh); a = asin((length/2)/r); rotate_extrude(angle = a) translate([r, 0, 0]) square(size = [height, width], center = true); } curve(w, h, l, dh);
Modifier 30.09.2019: compte tenu du commentaire de Cfreitas, a en outre déplacé la forme résultante à l'origine, de sorte que les dimensions puissent être vues sur les axes de coordonnées
$fn= 360; width = 10; // width of rectangle height = 2; // height of rectangle r = 50; // radius of the curve a = 30; // angle of the curve rotate_extrude(angle = a) translate([r, 0, 0]) square(size = [height, width], center = true);
et le résultat:
Edit 19.09.2020: Il y avait une faute de frappe dans la dernière modification: Dans le premier 'translate', la 'largeur' locale devrait être utilisée au lieu de 'w' . Corrigé dans le code ci-dessus.
Plus un pour l'idée. Mais les calculs sur a et r sont faux. les formules correctes seraient b: r = (length * length + 4 * dh * dh) / (8 * dh);
et a = 2 * asin (length / (2 * r) );
@CFreitas: correct, voir l'édition de ma réponse, les nouvelles formules sont équivalentes à la vôtre
En utilisant le concept utilisé par a_manthey_67, corrige le calcul et centré (aligné l'accord sur l'axe y) l'objet résultant:
module bentCube(width, height, length, dh) { // calculate radius and angle r = (length*length + 4*dh*dh)/(8*dh); a = 2*asin(length/(2*r)); translate([-r,0,0]) rotate([0,0,-a/2]) rotate_extrude(angle = a) translate([r, 0, 0]) square(size = [height, width], center = true);}
Ou, si vous voulez simplement quelque chose avec une longueur fixe, et un certain angle de courbure, procédez comme suit:
module curve(width, height, length, a) { if( a > 0 ) { r = (360 * (length/a)) / (2 * pi); translate( [-r-height/2,0,0] ) rotate_extrude(angle = a) translate([r, 0, 0]) square(size = [height, width], center = false); } else { translate( [-height/2,0,width] ) rotate( a=270, v=[1,0,0] ) linear_extrude( height = length ) square(size = [height, width], center = false); } }
L'instruction if (a> 0)
est nécessaire pour faire une exception lorsque l'angle de pliage est de 0 (ce qui, si vous dessinez une surface courbe, entraînerait un rayon infini).