xxxxxxxxxx
100
class LineSeg {
constructor(x1, y1, x2, y2) {
this.p1 = createVector(x1, y1);
this.p2 = createVector(x2, y2);
}
show() {
line(this.p1.x, this.p1.y, this.p2.x, this.p2.y);
}
}
class Curve {
constructor(start_x, start_y, end_x, end_y) {
this.start = createVector(start_x, start_y);
this.end = createVector(end_x, end_y);
this.points = [];
this.lines = [];
}
createJitteredMidpoints(n) {
for (let i = 0; i < n; i++) {
let section = 1 / (n + 1);
let pX = this.start.x + section * (i + 1) * (this.end.x - this.start.x);
let pY = this.start.y + section * (i + 1) * (this.end.y - this.start.y);
pX += randomGaussian(0,20);
pY += randomGaussian(0,20);
let p = createVector(pX, pY);
this.points.push(p);
}
}
makeCurve() {
this.lines.push(
new LineSeg(
this.start.x,
this.start.y,
this.points[0].x,
this.points[0].y
)
);
for (let i = 0; i < this.points.length - 1; i++) {
let start = this.points[i];
let end = this.points[i + 1];
this.lines.push(new LineSeg(start.x, start.y, end.x, end.y));
}
this.lines.push(
new LineSeg(
this.points[this.points.length - 1].x,
this.points[this.points.length - 1].y,
this.end.x,
this.end.y
)
);
}
subdiv(n, segRate = 0.25) {
this.createJitteredMidpoints(n);
this.makeCurve();
for (let i = 0; i < 5; i++) {
this.chopLines(segRate);
let newCurve = [];
for (let i = 0; i < this.lines.length - 1; i++) {
newCurve.push(this.lines[i]);
let start = this.lines[i].p2;
let end = this.lines[i + 1].p1;
newCurve.push(new LineSeg(start.x, start.y, end.x, end.y));
}
newCurve.push(this.lines.pop());
this.lines = newCurve;
}
}
chopLines(segRate) {
for (let i = 1; i < this.lines.length - 1; i++) {
let x1 =
this.lines[i].p1.x +
segRate * (this.lines[i].p2.x - this.lines[i].p1.x);
let y1 =
this.lines[i].p1.y +
segRate * (this.lines[i].p2.y - this.lines[i].p1.y);
let x2 =
this.lines[i].p1.x +
(1 - segRate) * (this.lines[i].p2.x - this.lines[i].p1.x);
let y2 =
this.lines[i].p1.y +
(1 - segRate) * (this.lines[i].p2.y - this.lines[i].p1.y);
let newLine = new LineSeg(x1, y1, x2, y2);
this.lines[i] = newLine;
}
}
show() {
for (let i = 0; i < this.lines.length; i++) {
this.lines[i].show();
}
}
}