2016-11-23 2 views
1

Je ne suis pas sûr de ce que rechercher ou comment poser la question car je ne peux pas dessiner. S'il vous plaît, supportez avec moi.OpenSCAD: bords incurvés intérieurs entre 2 cercles

Si j'ai un rectangle avec des embouts circulaires. Je veux enlever certains des bords du rectangle afin qu'il y ait un chemin lisse tout autour. Un peu comme vous étirer les extrémités, le milieu s'amincit. J'essayais de travailler sur l'accord d'un cercle extérieur plus large jusqu'à ce que je sois coincé à essayer de trouver où les cercles devraient se toucher.

Je peux voir quelques relations pour la trigonométrie, mais mon cerveau ne va pas faire un effort supplémentaire.

Quelqu'un peut-il s'il vous plaît aider à me diriger dans la bonne direction.

Merci.

Répondre

1

Voici la réponse:

// Small value for CSG 
Delta = 0.01; 
2Delta = 2 * Delta; 
$fa=1; $fs=$fa; 

module roudedArm(xl=50, yt=10, zh=5, in=2, bh=0.8) { 
    EndRadius = yt/2; // size of outer ends 
    EndSpacing = xl-yt; // distance between end point radii 
    ArmConcavity = in; // how much in does it go in on each side 
    ArmThickness = zh; // height in z 

    // Negative curve to narrow the Arm (calculated by pythagoras) 
    ArmCurveRadius = (pow((EndSpacing/2), 2) - 2 * EndRadius * ArmConcavity + pow(ArmConcavity, 2))/(2 * ArmConcavity); 

    // The orthogonal distance between the middle of the Arm the point it touches the round pillar sections 
    ArmSectionLength = (EndSpacing/2) * ArmCurveRadius/(ArmCurveRadius + EndRadius); 

    // end points 
    lbxcylinder(r=EndRadius, h=ArmThickness); 
    translate([EndSpacing, 0, 0]) lbxcylinder(r=EndRadius, h=ArmThickness); 

    // inner curve 
    difference() 
    { 
     translate([EndSpacing/2 - ArmSectionLength, -EndRadius -ArmThickness, 0]) 
      translate([ArmSectionLength, (EndRadius + ArmThickness),0]) 
       lbxcube([ArmSectionLength * 2, 2 * (EndRadius + ArmThickness), ArmThickness], bh=bh); 

      // Cut out Arm curve 
      translate([EndSpacing/2, ArmCurveRadius + EndRadius - ArmConcavity, -Delta]) 
       lbxcylinder(r = ArmCurveRadius, h = ArmThickness + 2Delta, bh=-bh); 
      translate([EndSpacing/2, -(ArmCurveRadius + EndRadius - ArmConcavity), -Delta]) 
       lbxcylinder(r = ArmCurveRadius, h = ArmThickness + 2Delta, bh=-bh); 
    } 
} 

module lbxcube(size, bh=0.8) { 
    // don't support bevelling in demo 
    translate([-size[0]/2, -size[1]/2, 0]) cube(size); 
} 

module lbxcylinder(r, h, bh=0.8) { 
    // don't support bevelling in demo 
    cylinder(r=r, h=h); 
} 

roudedArm(xl=50, yt=10, zh=5, in=2, bh=0.8); 

Merci à Rupert et son Curvy Door Handle sur Thingiverse.