Imprimante 3D

 

Cette maquette imprimée avec une imprimante 3D a été conçue avec le logiciel OpenSCad. Ce logiciel hyper simple n’est pas un logiciel CAD typique conçu pour les ingénieurs. Pour concevoir un objet, un simple liste de commandes, sous forme de programme est nécessaire. Cette figure illustre la distance entre un point (rouge [-20,-20,40]) et un plan (point = [1, 7, 4] et vecteur normal = [-3,-1,3])

 

 

 Théoriquement un plan est un objet de grandeur infinie. Pour le construire il faut le limiter à un cube de vision.

 

 

 

Il faut donc trouver les points de contact du plan avec le cube de vision : dans ce cas il y en a 6. Une fois ces points trouvés, on peut créer les différents trapèzes à dessiner.

 

 

Un petit exemple de code de OpenSCad et son dessin

 

 

Dans OpenSCad les seules fonctions permises :

                function nom (paramètres) = valeur;

 

Nous ne pouvons utiliser de boucle itérative pour définir la valeur d’une fonction comme dans la plupart des autres langages informatiques. C’est un gros problème. Heureusement avec l’énoncé « condition  ?  calcul si vrai :  calcul si faux » qui vient du langage C et la récursivité nous pouvons faire de petits miracles.

Exemple trouver le point milieu géométrique d’une suite de points.

//  li : une suite de points 3D

//  trouver le point milieu de cette suite

// somme composantes no de la suite li

function somme(li,no,i=0,s=0) = i<len(li) ? somme(li,no,i+1,s+li[i][no]) : s;

 

function ptMilieu(li) = [somme(li,0)/len(li), somme(li,1)/len(li), somme(li,2)/len(li)];

vous avez remarqué la récursivité en rouge.

Étapes à suivre pour trouver les points de rencontre du plan (point = [1, 7, 4] et vecteur normal = [-3,-1,3]) (notre image) avec le cube de vision [ ±60, ±60, ±60].

A. Trouver le points de rencontre des plans XY, XZ, YZ et le cube :

suite points = [[60, 60, 0], [60, -60, 0], [60, 0, 60], [60, 0, -60], [-60, 60, 0], [-60, -60, 0], [-60, 0, 60], [-60, 0, -60], [0, 60, 60], [0, 60, -60], [0, -60, 60], [0, -60, -60]]

 

B. Liste des numéros de composantes nulles de ces points :

suite des numéros = [2, 2, 1, 1, 2, 2, 1, 1, 0, 0, 0, 0]

C. suite des valeurs = [80.6667, 40.6667, -2, -362, -39.3333, -79.3333, 358, -2, 39.3333, -80.6667, 79.3333, -40.6667]

En combinant les trois suites nous obtenons 12 points géométriques dont certains ne sont pas dans le cube. Par exemple pour le point [60,60,0] : si x = 60, y=60, quelle est la valeur de z pour que ce point  soit sur le plan ? 80.6667. Donc le point [60,60,80.6667] est sur le plan, mais pas dans le cube de vision, donc éliminé.

D. Suite points sur le plan = [[60, 60, 80.6667], [60, -60, 40.6667], [60, -2, 60], [60, -362, -60], [-60, 60, -39.3333], [-60, -60, -79.3333], [-60, 358, 60], [-60, -2, -60], [39.3333, 60, 60], [-80.6667, 60, -60], [79.3333, -60, 60], [-40.6667, -60, -60]]

Affichés en vert : deux des points sont hors vision

 

 

E. Suite point dans le cube = [[60, -60, 40.6667], [60, -2, 60], [-60, 60, -39.3333], [-60, -2, -60], [39.3333, 60, 60], [-40.6667, -60, -60]]

 

F. Ce n’est pas fini, il faut ordonner ces points pour qu’ils soient placés en rotation dans le sens des aiguilles d’une montre (Cw). Pour ce nous avons besoin de quelques fonctions dont quelques unes sont récursives.

//////////////////////////////////////

//// déplacer le no1 à la position no2 d'une liste

//// il faut que no2 <= no1

function depl(li,no1,no2) = [for (i=0;i<=len(li);i=i+1)

     if(i<no2) li[i]

     else if(i==no2) li[no1]

     else if(i!=no1+1)li[i-1]];

////////////////////////////////////////

////////////////////////////////////////////

////////////////////////////////////////////

function vec(p,q) =[q.x-p.x,q.y-p.y,q.z-p.z];

function dot(p,q) = q.x*p.x+q.y*p.y+q.z*p.z;

// p vers q est clockwise vect n et centre

function estCw(p,q,n,c) = (dot(n,cross(vec(c,p),vec(c,q)))>=0);

 

 

///////////////////////////////////////

// vv : point dont on cherche la position

// n  : valeur de départ dans li

// nn : dernier numero testé

// b  : booleen de départ

// li : liste des points

// vn : vecteur normal du plan

// pt : pt du plan

 

function noPosCW(vv,n=0,nn,li,vn,pt) =

    ((n>nn)||!estCw(li[n],vv,vn,pt) ) ?

        min(n,nn):

        noPosCW(vv,n+1,nn,li,vn,pt);

/////////////////////////////////////////

function ord(li,no,vn,pt) =

  depl(li,no,noPosCW(li[no],0,no,li,vn,pt));

////////////////////////////////////////

function suiteCw(n,lr,vn,pt) =

    n<len(lr) ? suiteCw(n+1,ord(lr,n,vn,pt),vn,pt) : lr;

==============================================================+

G. Ce n’est toujours pas fini. Un plan a une épaisseur infinitésimale. Ça ne s’imprime pas. Il faut générer une épaisseur. Nous n’irons pas dans les détails, pas de récursivité nécessaire, juste de la « job » de bras avec des trapèzes.