You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
225 lines
6.7 KiB
225 lines
6.7 KiB
|
|
paper.install(window); |
|
|
|
|
|
var baum = { |
|
length: 30, |
|
angle: Math.PI / 2, |
|
crown: { |
|
shape: "kite", |
|
length: 130, |
|
width: 0.3, |
|
bisect: 0.3, |
|
}, |
|
forks: [ |
|
{ |
|
pos: 0.3, |
|
branch: { |
|
angle: 0.3, |
|
length: 30, |
|
crown: { |
|
shape: "kite", |
|
length: 50, |
|
width: 0.3, |
|
bisect: 0.3, |
|
}, |
|
forks: [ |
|
{ |
|
pos: 0.6, |
|
branch: { |
|
angle: Math.PI/2.5, |
|
length: 40, |
|
crown: { |
|
shape: "kite", |
|
length: 70, |
|
width: 0.3, |
|
bisect: 0.3, |
|
}, |
|
}, |
|
} |
|
], |
|
}, |
|
}, |
|
{ |
|
pos: 0.5, |
|
branch: { |
|
angle: 3*Math.PI /4, |
|
length: 30, |
|
crown: { |
|
shape: "kite", |
|
length: 50, |
|
width: 0.3, |
|
bisect: 0.3, |
|
}, |
|
}, |
|
} |
|
], |
|
}; |
|
|
|
|
|
function gen_tree(pos) { |
|
var baum = new Branch(); |
|
|
|
baum.length = (20 + Math.random() * 20); |
|
|
|
var shape; |
|
if(Math.random() < 0.5) { |
|
shape = "kite"; |
|
} else { |
|
shape = "triangle"; |
|
} |
|
|
|
baum.crown = {shape: shape}; |
|
if(shape == "kite") { |
|
baum.crown.length = (70 + Math.random() * 30); |
|
baum.crown.width = 0.4 + Math.random() * 0.2; |
|
baum.crown.bisect = 0.3 + Math.random() * 0.1; |
|
} else if(shape == "triangle") { |
|
baum.crown.length = (70 + Math.random() * 30); |
|
baum.crown.width = 0.4 + Math.random() * 0.2; |
|
//baum.crown.bisect = 0.3 + Math.random() * 0.1; |
|
} |
|
|
|
baum.angle = Math.PI / 2; // + Math.random() * 0.2 - 0.1; |
|
|
|
if((shape == "kite") && (Math.random() < 0.5)) { |
|
var b = { |
|
length: baum.length * 0.4, |
|
angle: Math.PI / 5 + Math.random() * 0.45, |
|
crown: { |
|
shape: "kite", |
|
length: baum.crown.length * 0.4, |
|
width: baum.crown.width, |
|
bisect: baum.crown.bisect, |
|
//bisect: 0.5, |
|
} |
|
}; |
|
baum.forks = [{ |
|
pos: 0.2 + Math.random() * 0.4, |
|
branch: new Branch(b), |
|
}]; |
|
|
|
baum.draw(pos); |
|
var rectified = false; |
|
var i=0; |
|
while(baum.collides_crown(baum.forks[0].branch)) { |
|
baum.forks[0].branch.angle -= 0.01; |
|
baum.draw(pos); |
|
rectified = true; |
|
i += 1; |
|
if(i>50) { |
|
var c = new Path.Circle({center:pos, radius: 2, strokeWidt: 1, strokeColor: '#ff0000'}); |
|
//break; |
|
} |
|
} |
|
|
|
if(rectified) { |
|
baum.forks[0].branch.angle -= Math.random() * 0.1; |
|
var c = new Path.Circle({center:pos, radius: 2, strokeWidt: 1, strokeColor: '#ff0000'}); |
|
baum.draw(pos); |
|
} |
|
} |
|
|
|
baum.draw(pos); |
|
return baum; |
|
} |
|
|
|
|
|
class Branch { |
|
constructor(data, parentBranch=null) { |
|
//this.parentBranch = parentBranch; |
|
Object.assign(this, data); |
|
console.log(this); |
|
if(typeof this.forks !== "undefined") { |
|
for (let fork of this.forks) { |
|
fork.branch = new Branch(fork.branch, this); |
|
} |
|
} |
|
} |
|
|
|
draw(pos) { |
|
if(typeof this._crown !== "undefined") { |
|
this._crown.removeSegments(); |
|
delete this._crown; |
|
} |
|
if(typeof this._branch !== "undefined") { |
|
this._branch.removeSegments(); |
|
delete this._branch; |
|
} |
|
|
|
this._branch = new Path(); |
|
var bvec = new Point(Math.cos(this.angle) * this.length, |
|
-1 * Math.sin(this.angle) * this.length); |
|
var end = pos.add(bvec); |
|
this._branch.strokeColor = 'black'; |
|
this._branch.strokeWidth = 2; |
|
this._branch.add(pos); |
|
this._branch.add(end); |
|
|
|
if(typeof this.crown !== "undefined") { |
|
console.log("CROWN"); |
|
if(this.crown.shape == "kite") { |
|
console.log("KITE"); |
|
var cvec = bvec.multiply(1/bvec.length * this.crown.length); |
|
var bswidth = this.crown.length * this.crown.width; |
|
var bsvec = new Point(Math.sin(this.angle) * bswidth / 2, |
|
Math.cos(this.angle) * bswidth / 2); |
|
this._crown = new Path(); |
|
this._crown.strokeColor = 'black'; |
|
this._crown.fillColor = 'white'; |
|
this._crown.strokeWidth = 2; |
|
this._crown.closed = true; |
|
//this._crown.selected = true; |
|
this._crown.add(end); |
|
this._crown.add(end.add(cvec.multiply(this.crown.bisect)) |
|
.add(bsvec)); |
|
this._crown.add(end.add(cvec)); |
|
this._crown.add(end.add(cvec.multiply(this.crown.bisect)) |
|
.subtract(bsvec)); |
|
console.log(this._crown); |
|
|
|
} else if(this.crown.shape = "triangle") { |
|
console.log("TRIANGLE"); |
|
var cvec = bvec.multiply(1/bvec.length * this.crown.length); |
|
var bswidth = this.crown.length * this.crown.width; |
|
var bsvec = new Point(Math.sin(this.angle) * bswidth / 2, |
|
Math.cos(this.angle) * bswidth / 2); |
|
this._crown = new Path(); |
|
this._crown.strokeColor = 'black'; |
|
this._crown.fillColor = 'white'; |
|
this._crown.strokeWidth = 2; |
|
this._crown.closed = true; |
|
//this._crown.selected = true; |
|
this._crown.add(end.add(bsvec)); |
|
this._crown.add(end.add(cvec)); |
|
this._crown.add(end.subtract(bsvec)); |
|
console.log(this._crown); |
|
} |
|
} |
|
|
|
if(typeof this.forks !== "undefined") { |
|
for (let fork of this.forks) { |
|
fork.branch.draw(pos.add(bvec.multiply(fork.pos))); |
|
} |
|
} |
|
|
|
} |
|
collides_crown(other) { |
|
return this._crown.intersects(other._crown); |
|
} |
|
} |
|
|
|
|
|
window.onload = function() { |
|
var canvas = document.getElementById('canvas'); |
|
paper.setup(canvas); |
|
|
|
//var br = new Branch(baum); |
|
|
|
for(var x=0; x<10; x++) { |
|
for(var y=0; y<5; y++) { |
|
var br = new Branch(gen_tree(new Point(50 + x*80, 150 + y*160))); |
|
} |
|
} |
|
|
|
}
|
|
|