/* built with Studio Sketchpad:
* https://sketchpad.cc
*
* observe the evolution of this sketch:
* https://p5js.sketchpad.cc/sp/pad/view/ro.RmWK6w2aY9t/rev.8
*
* authors:
* GoToLoop
* license (unless otherwise specified):
* creative commons attribution-share alike 3.0 license.
* https://creativecommons.org/licenses/by-sa/3.0/
*/
<script src=http://p5js.org/js/p5.min.js></script>
<script>
/**
* Random Polygon Shape (v2.03)
* by Jonasan & GoToLoop (2016-Feb-24)
*
* https://forum.Processing.org/two/discussion/15064/
* how-to-avoid-crossing-borders-in-a-random-polygon
*
* http://p5js.SketchPad.cc/sp/pad/view/ro.RmWK6w2aY9t/latest
*/
var poly
function setup() {
createCanvas(300, 300)
smooth().frameRate(5).noLoop()
poly = new Polygon(width>>1, height>>1)
}
function draw() {
background('#' + hex(~~random(0x1000), 3))
poly.display()
document.title = `Corners: ${poly.corners.length}`
}
function keyPressed() {
poly.rebuildPolygon()
redraw()
}
function mousePressed() {
keyPressed()
}
class Polygon {
constructor (v, y) {
this.beginCorner = typeof y === 'number'?
createVector(v, y) : createVector(v.x, v.y)
this.s = createGraphics(width, height)
this.s.fill(this.FILL).stroke(this.STROKE).strokeWeight(1.5)
this.rebuildPolygon()
}
display() {
image(this.s, 0, 0)
}
rebuildPolygon() {
this.rebuildCorners(), this.rebuildShape()
}
rebuildCorners() {
const qty = ~~random(this.CORNERS_MIN, 1 + this.CORNERS_MAX),
rad = TAU/qty
this.corners = Array(qty)
for (let i = 0; i < qty; ++i) {
const x = cos(i*rad) * random(this.RAD_MIN, this.RAD_MAX)
const y = sin(i*rad) * random(this.RAD_MIN, this.RAD_MAX)
this.corners[i] = createVector(x, y)
}
}
rebuildShape() {
this.s.clear()
this.s.translate(this.beginCorner.x, this.beginCorner.y)
this.s.beginShape()
for (const v of this.corners) this.s.vertex(v.x, v.y)
this.s.endShape(CLOSE)
this.s.resetMatrix()
}
}
Polygon.prototype.CORNERS_MIN = 3
Polygon.prototype.CORNERS_MAX = 7
Polygon.prototype.DIM = 6
Polygon.prototype.RAD_MIN = 6*Polygon.prototype.DIM
Polygon.prototype.RAD_MAX = 24*Polygon.prototype.DIM
Polygon.prototype.FILL = 'yellow'
Polygon.prototype.STROKE = 0
Object.freeze(Object.freeze(Polygon).prototype)
</script>