This commit is contained in:
djmil 2024-06-23 13:24:25 +02:00
parent b9c22554dc
commit 585c1fbb91
4 changed files with 21 additions and 6 deletions

15
README.md Normal file
View File

@ -0,0 +1,15 @@
A simple static HTML page using JavaScript Canvas to draw recurisive tree. Click [here](https://djmil.pages.djmil.dev/canvas/index.html) to see the final result.
# How does it work
In it's essence, `index.html` is responsible for providing tree-drawing configuration by placeing initial tree trunk somewhere on the page. Than, the recursive nature of the called function will do the rest of the job by drawing two, slightly smaller & slightly different, sub-trunks on top of the parrent trunk. The core trick is that the beginning of each new branch derived from the end of it's predecessor.
# Trigonometry cheetsheet
![pic](cosin.jpg)
Key: by knowing *coordinates* `x1`, `y1` of a starting point, we want to find a *destination point* `x2`, `y2` by using *distance* `L` and *angle* `Alpha` as additional constaraints.
# Pages
The pages server, self-hosted at `www.pages.djmil.dev`, is listening for your requests for the web-page content in the form of `http://user.pages.djmil.dev/repo/file.html`, than fetches the desired data from the underline Gitea instance to serve it as a responce. Check [gitea-pages](https://gitea.djmil.dev/goland/gitea-pages) for more details.

BIN
cosin.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

View File

@ -2,7 +2,7 @@
<html>
<head>
<meta charset="utf-8" />
<title>Canvas</title>
<title>Recursive tree</title>
<!-- <link rel="stylesheet" href="css/style.css"> -->
<style>
canvas {
@ -40,4 +40,4 @@
</body>
</html>
</html>

View File

@ -1,16 +1,16 @@
const angle2rad = angle => angle * (Math.PI / 180)
const stem = (ctx, x1, y1, length, angle) => {
// Визначити координати кіня стовбура знаючи почткову точку стовбура, його довжину та кут нахилу
// Визначити координати кіня стовбура знаючи початкову точку, довжину та кут нахилу
// Так, це тригонометрія в дії :)
const alpha = angle2rad(angle)
const alpha = angle2rad(angle);
let x2 = x1 + length * Math.sin(alpha);
let y2 = y1 - length * Math.cos(alpha);
ctx.beginPath();
ctx.moveTo(x1, y1);
ctx.lineTo(x2, y2);
ctx.lineWidth=length / 10; // Товщина стовбура залежить від його довжини
ctx.lineWidth = length / 10; // Товщина стовбура залежить від його довжини
ctx.stroke();
ctx.closePath();
@ -25,7 +25,7 @@ const stem = (ctx, x1, y1, length, angle) => {
const rnd2 = Math.random() *0.2 +0.6; // [ 0.6 .. 0.8]
// Рекурсивно малюємо розгалудження стовбура
// В якості початку нового стовбура використовується кінець поточного стовбура
// Початком нового стовбура слугує кінець поточного стовбура
stem(ctx, x2, y2, length * rnd2, angle + 35 +rnd1);
stem(ctx, x2, y2, length * rnd2, angle - 25 +rnd1);
}