Stop dividing by zero

This commit is contained in:
Andras Schmelczer 2026-06-10 21:36:13 +01:00
parent 9a06d92ed7
commit bd2307f782
5 changed files with 20 additions and 10 deletions

View file

@ -41,7 +41,7 @@ export const DropletFactory = (color: vec3 | vec4 | number): typeof DropletBase
float h = clamp( float h = clamp(
dot(targetFromDelta, toFromDeltas[i]) dot(targetFromDelta, toFromDeltas[i])
/ dot(toFromDeltas[i], toFromDeltas[i]), / max(dot(toFromDeltas[i], toFromDeltas[i]), 0.00000001),
0.0, 1.0 0.0, 1.0
); );

View file

@ -63,7 +63,7 @@ export const InvertedTunnelFactory = (
vec2 targetFromDelta = target - froms[i]; vec2 targetFromDelta = target - froms[i];
float h = dot(targetFromDelta, toFromDeltas[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); float clampedH = clamp(h, 0.0, 1.0);

View file

@ -40,7 +40,8 @@ export const NoisyPolygonFactory = (
vec2 targetFromDelta = target - from; vec2 targetFromDelta = target - from;
vec2 toFromDelta = to - from; vec2 toFromDelta = to - from;
float h = clamp( float h = clamp(
dot(targetFromDelta, toFromDelta) / dot(toFromDelta, toFromDelta), dot(targetFromDelta, toFromDelta)
/ max(dot(toFromDelta, toFromDelta), 0.00000001),
0.0, 1.0 0.0, 1.0
); );
@ -135,9 +136,13 @@ export const NoisyPolygonFactory = (
vec2.scale(center, center, 1 / transformedVertices.length); vec2.scale(center, center, 1 / transformedVertices.length);
let length = 0; 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[i - 1], transformedVertices[i]);
} }
length += vec2.distance(
transformedVertices[transformedVertices.length - 1],
transformedVertices[0]
);
return { return {
vertices: transformedVertices, vertices: transformedVertices,

View file

@ -31,7 +31,8 @@ export const PolygonFactory = (
vec2 targetFromDelta = target - from; vec2 targetFromDelta = target - from;
vec2 toFromDelta = to - from; vec2 toFromDelta = to - from;
float h = clamp( float h = clamp(
dot(targetFromDelta, toFromDelta) / dot(toFromDelta, toFromDelta), dot(targetFromDelta, toFromDelta)
/ max(dot(toFromDelta, toFromDelta), 0.00000001),
0.0, 1.0 0.0, 1.0
); );
@ -93,6 +94,10 @@ export const PolygonFactory = (
constructor(vertices: Array<vec2>) { constructor(vertices: Array<vec2>) {
super(vertices); super(vertices);
if (vertices.length === 0) {
throw new Error('Polygons must have at least one vertex');
}
if (vertices.length > vertexCount) { if (vertices.length > vertexCount) {
throw new Error( throw new Error(
`Too many vertices, expected ${vertexCount}, got ${vertices.length}` `Too many vertices, expected ${vertexCount}, got ${vertices.length}`
@ -104,7 +109,7 @@ export const PolygonFactory = (
const startEnd = this.vertices[0]; const startEnd = this.vertices[0];
let vb = startEnd; let vb = startEnd;
let d = vec2.squaredDistance(target, vb); let d = vec2.distance(target, vb);
let sign = 1; let sign = 1;
for (let i = 1; i <= this.vertices.length; i++) { for (let i = 1; i <= this.vertices.length; i++) {
@ -141,9 +146,9 @@ export const PolygonFactory = (
private get actualVertices(): Array<vec2> { private get actualVertices(): Array<vec2> {
return this.vertices.length < vertexCount return this.vertices.length < vertexCount
? ([ ? ([
...this.vertices, ...this.vertices,
...new Array(vertexCount - this.vertices.length).fill(this.vertices[0]), ...new Array(vertexCount - this.vertices.length).fill(this.vertices[0]),
] as Array<vec2>) ] as Array<vec2>)
: this.vertices; : this.vertices;
} }

View file

@ -39,7 +39,7 @@ export const RotatedRectangleFactory = (
vec2 top = rotatedRectangleTopCenters[i]; vec2 top = rotatedRectangleTopCenters[i];
vec2 bottom = rotatedRectangleBottomCenters[i]; vec2 bottom = rotatedRectangleBottomCenters[i];
float height = length(bottom - top); 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); vec2 q = (target - (top + bottom) * 0.5);
q = mat2(d.x, -d.y, d.y, d.x) * q; q = mat2(d.x, -d.y, d.y, d.x) * q;