Configurazioni con segmenti rotanti
Facendo ruotare un punto (c2
) attorno a un altro punto (c1
) che ruota attorno al centro del canvas (c0
) è possibile ottenere curve più complesse. Disegnando la successione di linee fra il secondo e il terzo punto si possono generare configurazioni meno scontate.
// height=300
let raggio1;
let raggio2; // 100
let passoRad1 = 0.0155; // 0.031;
let passoRad2 = 0.0415; // 0.083;
let c0x;
let c0y;
let font;
let looping = false;
function preload() {
font = loadFont("../files/RobotoMono-Regular.ttf")
// font = loadFont("../files/RobotoMono-Medium.ttf")
}
function setup() {
createCanvas( windowWidth, 300 );
// background( 255 );
// stroke( 0, 30 );
textAlign(CENTER);
// textFont( "Roboto Mono", 20 );
textFont( font, 16 );
// textSize(20);
textStyle(BOLD);
fill(32);
setupResizable();
redraw();
noLoop();
cursor(HAND);
}
function windowResized() {
resizeCanvas(windowWidth, windowHeight);
setupResizable();
}
function setupResizable() {
c0x = width/2;
c0y = height/2 + 8;
raggio1 = raggio2 = min(width,height)/4.7;
}
function draw() {
let rad1 = (frameCount-1)*passoRad1;
let c1x = c0x + cos(rad1)*raggio1;
let c1y = c0y + sin(rad1)*raggio1;
let rad2 = (frameCount-1)*passoRad2;
let c2x = c1x + cos(rad2)*raggio2;
let c2y = c1y + sin(rad2)*raggio2;
clear();
strokeWeight(1);
stroke(212);
line( c0x,c0y, c1x,c1y);
strokeWeight(2);
stroke(0);
line( c1x,c1y, c2x,c2y);
noStroke();
circle( c0x,c0y, 8);
circle( c1x,c1y, 8);
circle( c2x,c2y, 8);
// strokeWeight(5);
// stroke(255,255,192);
text("c0", c0x, c0y-9);
// stroke(212,255,255);
text("c1", c1x, c1y-9);
// stroke(255,222,255);
text("c2", c2x, c2y-9);
}
function mouseReleased() {
if(looping) {
noLoop();
} else {
loop();
}
looping = !looping;
}
Cliccare sul canvas per avviare le rotazioni.
// height=400 lines=auto
let raggio1 = 90;
let raggio2 = 100;
let passoRad1 = 0.031; // velocità rotazione raggio1
let passoRad2 = 0.083; // velocità rotazione raggio2
let c0x = 200;
let c0y = 200;
function setup() {
createCanvas( 400, 400 );
background( 255 );
stroke( 0, 30 );
}
function draw() {
let rad1 = frameCount*passoRad1;
let c1x = c0x + cos(rad1)*raggio1;
let c1y = c0y + sin(rad1)*raggio1;
let rad2 = frameCount*passoRad2;
let c2x = c1x + cos(rad2)*raggio2;
let c2y = c1y + sin(rad2)*raggio2;
line( c1x,c1y, c2x,c2y); // disegna solo 2° raggio
}
let c0x = 200;
let c0y = 200;
1° centro di rotazione, coincidente con il centro di un canvas di 400x400 pixel.
let c1x = c0x + cos(rad1)*raggio1;
let c1y = c0y + sin(rad1)*raggio1;
2° centro di rotazione (e inizio del segmento da disegnare) ricavato attorno al centro di rotazione principale.
let c2x = c1x + cos(rad2)*raggio2;
let c2y = c1y + sin(rad2)*raggio2;
3° centro di rotazione (e fine del segmento da disegnare) ricavato attorno al 2° centro di rotazione.
Provare a modificare i primi 4 parametri dello sketch tenendo presente che, per non far uscire i segmenti dal canvas, la somma di raggio1
e raggio2
non deve superare 200 (la metà delle dimensioni del canvas).
Le circonferenze dei raggi oltre il primo vengono chiamate epicicli e attraverso particolari trasformazioni matematiche (trasformata discreta di Fourier) è possibile fargli disegnare qualsiasi cosa: Approximating and drawing closed curves with epicycles.