canva-tree/tree.js

35 lines
1.4 KiB
JavaScript
Raw Permalink Normal View History

const angle2rad = angle => angle * (Math.PI / 180)
2024-06-22 22:54:58 +02:00
const stem = (ctx, x1, y1, length, angle) => {
2024-06-23 13:24:25 +02:00
// Визначити координати кіня стовбура знаючи початкову точку, довжину та кут нахилу
// Так, це тригонометрія в дії :)
2024-06-23 13:24:25 +02:00
const alpha = angle2rad(angle);
let x2 = x1 + length * Math.sin(alpha);
let y2 = y1 - length * Math.cos(alpha);
2024-06-05 23:00:24 +02:00
ctx.beginPath();
ctx.moveTo(x1, y1);
ctx.lineTo(x2, y2);
2024-06-23 13:24:25 +02:00
ctx.lineWidth = length / 10; // Товщина стовбура залежить від його довжини
2024-06-05 23:00:24 +02:00
ctx.stroke();
ctx.closePath();
// Закоментуй цей IF. Що змінилось в картинці дерева? Чому стало гірше?
if (length > 20) {
x2 = x1 + (length * 0.95) * Math.sin(alpha);
y2 = y1 - (length * 0.95) * Math.cos(alpha);
2024-06-05 23:00:24 +02:00
}
if (length > 1) {
2024-06-22 22:54:58 +02:00
const rnd1 = Math.random() *20 -10; // [-10.0 .. +10.0]
const rnd2 = Math.random() *0.2 +0.6; // [ 0.6 .. 0.8]
2024-06-05 23:00:24 +02:00
// Рекурсивно малюємо розгалудження стовбура
2024-06-23 13:24:25 +02:00
// Початком нового стовбура слугує кінець поточного стовбура
2024-06-05 23:00:24 +02:00
stem(ctx, x2, y2, length * rnd2, angle + 35 +rnd1);
stem(ctx, x2, y2, length * rnd2, angle - 25 +rnd1);
}
}
2024-06-22 22:54:58 +02:00
const tree = (ctx, x, y, height) => stem(ctx, x, y, height, 0);