0

I'm trying to get, by the initial coordinates (I put down the points myself, see the image below), in fact, to get a figure that will become a kind of emptiness for the new one. So that the new one covers the entire canvas, having a void inside in the form of the original shape. I use d3-voronoi for this.

const pixelPoints = zone.points!.map((point) => ({
  x: point.x * canvas.width,
  y: point.y * canvas.height
}));

if (pixelPoints.length > 0) {
  const voronoiLayout = voronoi()
    .extent([[0, 0], [canvas.width, canvas.height]]);

  interface Point {
    x: number;
    y: number;
  }

  const points: [number, number][] = pixelPoints.filter(point => 'x' in point && 'y' in point).map((point: Point) => [point.x, point.y]);

  const polygons = voronoiLayout.polygons(points);

  const outerPolygon = polygons.find(polygon => {
    return polygon.every(([x, y]) => {
      console.log(x, canvas.width, y, canvas.height, x >= 0 && x <= canvas.width && y >= 0 && y <= canvas.height);
      return x >= 0 && x <= canvas.width && y >= 0 && y <= canvas.height;
    });
  });

  if (outerPolygon) {
    ctx.beginPath();
outerPolygon!.forEach(([x, y], i) => {
  if (i === 0) {
    ctx.moveTo(x, y);
  } else {
    ctx.lineTo(x, y);
  }
});
ctx.closePath();
ctx.fillStyle = 'rgba(0, 0, 0, 0.5)';
ctx.fill();

[![The initial points that I put down][1]][1]

[Array(2), Array(2), Array(2), Array(2)]
(2) [549, 529]
(2) [553, 420.00000000000006]
(2) [722, 428]
(2) [710.0000000000001, 548]
length: 4

[![What is obtained][2]][2]

But I need to get, in fact, a new figure (with coordinates, which is important), which would have a void in the form of the original figure. What am I doing wrong? [1]: https://i.stack.imgur.com/kpeLa.jpg [2]: https://i.stack.imgur.com/z20FJ.jpg

Timur Musharapov
  • 163
  • 1
  • 1
  • 13

0 Answers0