Funcións

Funcións:

Podemos utilizar unha función para establecer dimensións ou transformacións. No seguinte exemplo usaremos a función coseno.

// Función coseno

nx=180;

for(i=[0:1:nx]) {
    translate( [i, 0, 0] )
        square( [1, 11+10*cos(10*i)], center=false );
}

Tamén poderiamos escribir a función e despois chamala:

// Función seno

nx=180;

function y(x) = 11+10*sin(10*x);

for(i=[0:1:nx]) {
    translate( [i, 0, 0] )
        square( [1, y(i)] );
}
  • Fai o mesmo, pero executa a función variando a altura dun prisma de base cadrada
  • Agora fai a translación en X e en Y coa función de altura 11+10*cos(10*i)*sin(10*j)
  • Podes probar con outras funcións, por exemplo: function y(t) = 11+10*sin(10*t)*cos(5*t);

 

Funcións paramétricas en X e en Y:

Imos utilizar a funcións matemáticas para xerar unha figura. O que facemos é unir círculos con hull() que se van trasladando unha distancia p seguindo a función definida con anterioridade.

Neste exemplo utilizamos a función do corazón.

// corazón

w= 2; // espesor
e=0.5;  // para escalar a función
p=1;  // paso
res=12; // resolución

h=2;    // altura

function x(t) = 50*pow(sin(t),3);
function y(t) = 40*cos(t)-15*cos(2*t)-6*cos(3*t)-3*cos(4*t);

linear_extrude(h) for(i=[-180:1:180]) {
    hull(){
        translate([e*x(i),e*y(i),0]) circle(d=w,$fn=res);
        translate([e*x(i+p),e*y(i+p),0]) circle(d=w,$fn=res);
    } 
}

Proba con outras funcións. Por exemplo Lissajous:

// parámetros de lissajous (escala a función e=30;)
A = 2; 
B = 3; 
Phase = 30; // Phase  in degrees
E = 1.618;  // Eccentricity  1->cadrado, 1.618-> golden ratio

function x(t) = E*cos(A*t+Phase);
function y(t) = sin(B*t);

  • Modifica os parámetros para xerar máis curvas.
  • Engade unha argola para facer un colgante.

Funcións paramétricas en X, Y e Z:

Imos debuxar un resorte. Facemos o mesmo que antes, pero trasladando unha esfera tamén no eixe Z. (F5!!)

// resorte

w= 5; // diámetro esfera
p=1;  // paso
res=12; // resolución
n=4; // voltas

A=40;
C=0.03;

function x(t) = A*sin(t);
function y(t) = A*cos(t);
function z(t) = C*t;

for(i=[0:1:360*n]) {
    hull(){
        translate([x(i),y(i),z(i)]) sphere(r=w/2,$fn=res);
        translate([x(i+p),y(i+p),z(i+p)]) sphere(r=w/2,$fn=res);
    } 
}
  • Modifica os parámetros para conseguir diferentes formas.
  • Proba facer un remuíño: x(t) = 0.05*t*sin(t);   y(t) = 0.05*t*cos(t);  z(t) = 0.05*t;

 

Curvar unha función:

Imos partir dunha función, por exemplo esta: y(t)= 1+sin(s*f*t)*cos(c*f*t);

// Función sin-cos

w= 2; // espesor
p=1;  // paso
res=12; // resolución

// parámetros función

f=6;    // frecuencia
s=1;    // amplitude seno
c=2;    // amplitude coseno

e=20;   // escala

function f(t) = 1+sin(s*f*t)*cos(c*f*t);

for(i=[0:1:360]) {
    hull(){
        translate([i,e*f(i),0]) circle(d=w,$fn=res);
        translate([(i+p),e*f(i+p),0]) circle(d=w,$fn=res);
    } 
}
  • Modifica os parámetros da función para conseguir novas curvas.

 

Agora imos curvala facendo un aro. Para iso creamos dúas funcións gx(t) e gy(t), desprazando cada punto a distancia do radio do aro e cos(t) no eixe X e sin(t) no eixe Y.

// Función sin-cos en aro

w= 1; // espesor
p=1;  // paso
res=12; // resolución

// parámetros función

f=10;    // frecuencia
s=1;    // amplitude seno
c=2;    // amplitude coseno

e=4;   // escala

// parámetros aro

r=20;   // radio do aro

function f(t) = 1+sin(s*f*t)*cos(c*f*t);

function gx(t) = (r+e*f(t))*cos(t);
function gy(t) = (r+e*f(t))*sin(t);

for(i=[0:1:360]) {
    hull(){
        translate([gx(i),gy(i),0]) circle(d=w,$fn=res);
        translate([gx(i+p),gy(i+p),0]) circle(d=w,$fn=res);
    }
}
  • Proba introducir un círculo máis dentro do hull(): circle(d=w,$fn=res); Verás que se enche toda a superficie.

Agora queda extruír. Se queres facer un brazalete, parte do aro e extrúe a altura que queiras.

Tamén podemos facer un vaso para unha planta o un lapiceiro extruíndo como vimos na páxina de “extrusión de polígonos”

linear_extrude( height=80, twist=90, $fn = 360, scale=1.5) 
    for(i=[0:1:360]) {
        hull(){
            translate([gx(i),gy(i),0]) circle(d=w,$fn=res);
            translate([gx(i+p),gy(i+p),0]) circle(d=w,$fn=res);
            circle(d=w,$fn=res);
        }
    }
  • Proba modificar os parámetros da función e da extrusión.

Propostas:

Colgante:

Utiliza calquera destas funcións e modifica os parámetros ata que atopes unha figura que che guste. Despois engade unha argola. Para engadir o aro pensa en cal sería o valor máximo da función no eixe x, e fai a translación en función dese parámetro.

// Hipotrocoides:
a=30;
b=15;
n=6;
function x(t) = (a*cos(t) + b*cos(a*t/n));
function y(t) = (a*sin(t) - b*sin(a*t/n));

//Pétalos
n=6;    // voltas
A=25;   // amplitude

function x(t) = A*cos(n*t)*cos(t);
function y(t) = A*cos(n*t)*sin(t);

Brazalete:

Deseña o teu brazalete modificando os parámetros de amplitude e indicando coa variable n o número de cristas:

 // función seno en z
x(t) = 50*sin(t);
y(t) = 50*cos(t);
z(t) = 25*sin(n*t);

// solenoide tórico
x(t) = (R+r*cos(n*t))*cos(t);
y(t) = (R+r*cos(n*t))*sin(t);
z(t) = r*sin(n*t);

 

Maceta

A partir dunha función que che guste crea unha maceta ou un lapiceiro extruíndo.

 

Aneis de Borromeo

Rota para conseguir uns aneis de Borromeo

// anel:

a=10;   
b=7; 

function x(t) = a*cos(t);
function y(t) = b*sin(t);
function z(t) = 0;