xxxxxxxxxx
83
function setup() {
createCanvas(400, 400);
strokeWeight(3);
//noFill();
}
function draw() {
const r = 100;
background(220);
push();
translate(width/2 + r/2+r/10, height/2);
draw_leaf(r);
pop();
push();
translate(width/2 - r/2-r/10, height/2);
scale(-1,1);
draw_leaf(r);
pop();
noLoop();
}
//葉っぱを描く
function draw_leaf(r) {
push();
beginShape();
translate(-r/2, -r/2);
let points = [];
let num = 10;
let angle = 360 / num;
const a = 3;
let testX = [];
let testY = [];
for (let i = 0; i < 60; i++) {
x = (r / 3) * a * pow(cos(radians(i * 2)), 3);
y = (r / 3) * a * pow(sin(radians(i * 1.5)), 3);
points.push(new p5.Vector(x, y));
testX.push(x);
testY.push(y);
vertex(x, y);
}
//pointsで一番小さい点と大きい点を割り出す
const middleX = map(0.5, 0, 1.0, Math.min(testX), Math.max(testX));
const middleY = map(0.5, 0, 1.0, Math.min(testY), Math.max(testY));
//point(middleX, middleY); //回転する中心座標
for (let i = 0; i < 60; i++) {
const afin = afin_rotate(radians(180), points[i].x, points[i].y, middleX, middleY);
vertex(afin[0], afin[1]);
}
endShape(CLOSE);
pop();
}
//行列計算
function afin(a, b) {
let x;
let y;
for (let k = 0; k < 3; k++) {
let a0 = a[k][0] * b[0];
let a1 = a[k][1] * b[1];
let a2 = a[k][2] * b[2];
if (k == 0) {
x = a0 + a1 + a2;
} else if (k == 1) {
y = a0 + a1 + a2;
}
}
return [x, y];
}
//回転
function afin_rotate(shita, x, y, tx, ty) {
let a = [
[cos(shita), -sin(shita), tx - tx * cos(shita) + ty * sin(shita)],
[sin(shita), cos(shita), ty - tx * sin(shita) - ty * cos(shita)],
[0, 0, 1],
];
let b = [x, y, 1];
return afin(a, b);
}