5
votes

Comment créer une feuille courbe (cube) dans OpenSCAD?

Comment puis-je courber une feuille (cube)? Je voudrais contrôler l'angle du virage / de la courbe.

curve

Par exemple

cube ([50,50,2]);


0 commentaires

4 Réponses :


1
votes

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);


0 commentaires

7
votes

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:

 entrez la description de l'image ici

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

 entrez la description de l'image ici

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:

 entrez la description de l'image ici

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.


2 commentaires

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



0
votes

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);}


0 commentaires

0
votes

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).

GIF animé ici


0 commentaires