diff --git a/src/drawables/shapes/droplet-factory.ts b/src/drawables/shapes/droplet-factory.ts index 76289a3..1c8c7ad 100644 --- a/src/drawables/shapes/droplet-factory.ts +++ b/src/drawables/shapes/droplet-factory.ts @@ -41,7 +41,7 @@ export const DropletFactory = (color: vec3 | vec4 | number): typeof DropletBase float h = clamp( dot(targetFromDelta, toFromDeltas[i]) - / dot(toFromDeltas[i], toFromDeltas[i]), + / max(dot(toFromDeltas[i], toFromDeltas[i]), 0.00000001), 0.0, 1.0 ); diff --git a/src/drawables/shapes/inverted-tunnel-factory.ts b/src/drawables/shapes/inverted-tunnel-factory.ts index e219576..e0d3c4e 100644 --- a/src/drawables/shapes/inverted-tunnel-factory.ts +++ b/src/drawables/shapes/inverted-tunnel-factory.ts @@ -63,7 +63,7 @@ export const InvertedTunnelFactory = ( vec2 targetFromDelta = target - froms[i]; float h = dot(targetFromDelta, toFromDeltas[i]) - / dot(toFromDeltas[i], toFromDeltas[i]); + / max(dot(toFromDeltas[i], toFromDeltas[i]), 0.00000001); float clampedH = clamp(h, 0.0, 1.0); diff --git a/src/drawables/shapes/noisy-polygon-factory.ts b/src/drawables/shapes/noisy-polygon-factory.ts index 3ca55fa..aba0d93 100644 --- a/src/drawables/shapes/noisy-polygon-factory.ts +++ b/src/drawables/shapes/noisy-polygon-factory.ts @@ -40,7 +40,8 @@ export const NoisyPolygonFactory = ( vec2 targetFromDelta = target - from; vec2 toFromDelta = to - from; float h = clamp( - dot(targetFromDelta, toFromDelta) / dot(toFromDelta, toFromDelta), + dot(targetFromDelta, toFromDelta) + / max(dot(toFromDelta, toFromDelta), 0.00000001), 0.0, 1.0 ); @@ -135,9 +136,13 @@ export const NoisyPolygonFactory = ( vec2.scale(center, center, 1 / transformedVertices.length); let length = 0; - for (let i = 1; i < this.vertices.length; i++) { + for (let i = 1; i < transformedVertices.length; i++) { length += vec2.distance(transformedVertices[i - 1], transformedVertices[i]); } + length += vec2.distance( + transformedVertices[transformedVertices.length - 1], + transformedVertices[0] + ); return { vertices: transformedVertices, diff --git a/src/drawables/shapes/polygon-factory.ts b/src/drawables/shapes/polygon-factory.ts index c093ea9..04f35a1 100644 --- a/src/drawables/shapes/polygon-factory.ts +++ b/src/drawables/shapes/polygon-factory.ts @@ -31,7 +31,8 @@ export const PolygonFactory = ( vec2 targetFromDelta = target - from; vec2 toFromDelta = to - from; float h = clamp( - dot(targetFromDelta, toFromDelta) / dot(toFromDelta, toFromDelta), + dot(targetFromDelta, toFromDelta) + / max(dot(toFromDelta, toFromDelta), 0.00000001), 0.0, 1.0 ); @@ -93,6 +94,10 @@ export const PolygonFactory = ( constructor(vertices: Array) { super(vertices); + if (vertices.length === 0) { + throw new Error('Polygons must have at least one vertex'); + } + if (vertices.length > vertexCount) { throw new Error( `Too many vertices, expected ${vertexCount}, got ${vertices.length}` @@ -104,7 +109,7 @@ export const PolygonFactory = ( const startEnd = this.vertices[0]; let vb = startEnd; - let d = vec2.squaredDistance(target, vb); + let d = vec2.distance(target, vb); let sign = 1; for (let i = 1; i <= this.vertices.length; i++) { @@ -141,9 +146,9 @@ export const PolygonFactory = ( private get actualVertices(): Array { return this.vertices.length < vertexCount ? ([ - ...this.vertices, - ...new Array(vertexCount - this.vertices.length).fill(this.vertices[0]), - ] as Array) + ...this.vertices, + ...new Array(vertexCount - this.vertices.length).fill(this.vertices[0]), + ] as Array) : this.vertices; } diff --git a/src/drawables/shapes/rotated-rectangle-factory.ts b/src/drawables/shapes/rotated-rectangle-factory.ts index 1672669..83e0506 100644 --- a/src/drawables/shapes/rotated-rectangle-factory.ts +++ b/src/drawables/shapes/rotated-rectangle-factory.ts @@ -39,7 +39,7 @@ export const RotatedRectangleFactory = ( vec2 top = rotatedRectangleTopCenters[i]; vec2 bottom = rotatedRectangleBottomCenters[i]; float height = length(bottom - top); - vec2 d = (bottom - top) / height; + vec2 d = height > 0.00000001 ? (bottom - top) / height : vec2(0.0, 1.0); vec2 q = (target - (top + bottom) * 0.5); q = mat2(d.x, -d.y, d.y, d.x) * q;