-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
94 lines (71 loc) · 2.34 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
const obj = {
spread: 1,
children: []
}
const size = 80
const dx = size / 2
const dy = size / 10
let draw = SVG('drawing').size('100%', '100vh')
// https://stackoverflow.com/questions/1484506/random-color-generator
const getRandomColor = () => {
const letters = 'ABC3456789ABCDEF'
let color = '#'
for (let i = 0; i < 6; i++) {
color += letters[Math.floor(Math.random() * 16)]
}
return color
}
// オブジェクトからレンダリング 色は適当に作ってるから無視して
const render = () => {
// 再帰的に子どもを辿って四角をレンダリングしていく
const renderRecursive = (o, x, y) => {
// 色はついてなかったら適当につけておく
if (o.color === undefined) o.color = getRandomColor()
const rect = draw.rect(size, size).move(x, y).fill(o.color).radius(size / 4)
const text = draw.text(`spread: ${o.spread}`).move(x + 5, y + 5)
// クリックしたらそのオブジェクトを吐き出す デバッグ用
rect.node.addEventListener('click', () => {
// console.log(o)
appendChild(o)
})
if (o.children.length !== 0) {
let totalSpread = 0
let num = 0
for (let i = 0; i < o.children.length; i++) {
const c = o.children[i]
// 一個前のこどもの広がりを見て,初期生成位置を下にずらす量を追加
if (i !== 0) totalSpread += o.children[i - 1].spread - 1
// こどもを下に並べていく
num = totalSpread + i
renderRecursive(c, x + (size + dx), y + (size + dy) * num)
draw
.line(
x + size, y + size / 2,
x + (size + dx), y + (size + dy) * num + size / 2
)
.stroke({ width: 1 })
}
} else return
}
console.log('root', obj)
renderRecursive(obj, 10, 10)
}
// 実行
render()
// DOMをリセットして,もう一度オブジェクトから生成する
const appendChild = base => {
const makeObj = () => {
return { spread: 1, parent: base, children: [], color: getRandomColor() }
}
// 再帰的に親を辿っていって広がりの値を更新
const updateSpreadValueRecursive = o => {
o.spread++
if (o.parent !== undefined) updateSpreadValueRecursive(o.parent)
}
base.children.push(makeObj())
if (base.children.length >= 2) updateSpreadValueRecursive(base)
// clear dom
document.querySelector('#drawing').textContent = ''
draw = SVG('drawing').size('100%', '100vh')
render()
}