function earcut(vertices)
{
let pixels = []
let concave = vertices.filter((x,i) => is_concave(vertices[mod(i-1, vertices.length)],
x,
vertices[(i+1)%vertices.length]));
let idx = 0;
while(concave.length > 0 && vertices.length > 3)
{
if(!concave.some((x) => equal(x, vertices[idx])))
{
if(is_ear(vertices[idx? idx-1: vertices.length-1],
vertices[idx],
vertices[(idx+1)%vertices.length],
concave))
{
pixels = [...pixels, ...fill_triangle(vertices[mod(idx-1, vertices.length)],
vertices[idx],
vertices[(idx+1)%vertices.length])];
concave = concave.filter((x) => !equal(x, vertices[mod(idx-1, vertices.length)])
|| is_concave(vertices[mod(idx-2, vertices.length)],
x,
vertices[(idx+1)%vertices.length]));
concave = concave.filter((x) => !equal(x, vertices[(idx+1)%vertices.length])
|| is_concave(vertices[mod(idx-1, vertices.length)],
x,
vertices[(idx+2)%vertices.length]));
vertices = [...vertices.slice(0,idx), ...vertices.slice(idx+1)];
idx -= 1;
}
}
idx = (idx+1) % vertices.length;
}
if(vertices.length == 3)
return [...pixels, ...fill_triangle(...vertices)];
else
return [...pixels,
...d3.range(2,vertices.length)
.map((i) => fill_triangle(vertices[0], vertices[i-1], vertices[i])).flat()];
}