多边形上的边界线

时间:2020-02-08 23:00:57

标签: javascript fabricjs

我正在尝试在多边形周围绘制线,应该从一个点到下一个点绘制不同颜色的线,我被困在将线附加到多边形的最后一个点上,还有一些红色的圆正在成功创建多边形的角,使用'modified'事件使用鼠标移动框时会绘制线条

JSFiddle here

问题在这里:

var lastPoint = (i=>polygon.points.length)?0:i+1;
var fromX = transformedPoints[lastPoint].x;
var fromY = transformedPoints[lastPoint].y;
  return new fabric.Line([p.x, p.y, 25, fromX],{

JS代码

var canvas = new fabric.Canvas("c", {
  selection: false
});

var polygon = new fabric.Polygon([
  new fabric.Point(150, 50),
  new fabric.Point(250, 50),
  new fabric.Point(250, 150),
  new fabric.Point(150, 150)
]);

polygon.on("modified", function() {
  document.getElementById("p").innerHTML = JSON.stringify(this);
  var matrix = this.calcTransformMatrix();
  var transformedPoints = this.get("points")
    .map(function(p) {
      return new fabric.Point(
        p.x - polygon.pathOffset.x,
        p.y - polygon.pathOffset.y);
    })
    .map(function(p) {
      return fabric.util.transformPoint(p, matrix);
    });
  var circles = transformedPoints.map(function(p) {
    return new fabric.Circle({
      left: p.x,
      top: p.y,
      radius: 3,
      fill: "red",
      originX: "center",
      originY: "center",
      hasControls: false,
      hasBorders: false,
      selectable: false
    });
  });
  document.getElementById("l").innerHTML = JSON.stringify(transformedPoints);
  var colors = ['#E5097F', '#00A0E3', '#009846', '#FECC00', '#000', '#000', '#000'];
  var lines = transformedPoints.map(function(p, i) {
    document.getElementById("r").innerHTML = JSON.stringify(p);
    var lastPoint = (i => polygon.points.length) ? 0 : i + 1;
    var fromX = transformedPoints[lastPoint].x;
    var fromY = transformedPoints[lastPoint].y;
    document.getElementById("r").innerHTML = fromX + ' - > ' + fromY;
    return new fabric.Line([p.x, p.y, 25, fromX], {
      stroke: colors[i],
      strokeWidth: 10,
      hasBorders: false,
      strokeDashArray: [8, 13]
    });
  });
  side_a = new fabric.Line([150, 0, 50, 0], {
    stroke: "red",
    strokeWidth: 10,
    hasBorders: false
  });
  this.canvas.clear().add(this).add(side_a).add.apply(this.canvas, lines).add.apply(this.canvas, circles).setActiveObject(this).renderAll();
});

canvas.add(polygon).renderAll();

更新:

我可以通过提供静态值来生成这些行,以进行演示。在“已修改”事件发生之前,我已经在其中添加了一些内容:

side_a = new fabric.Line([250, 50, 150, 50], {
  stroke: "red",
  strokeWidth: 10,
  hasBorders: false
});
side_b = new fabric.Line([150, 150, 150, 50], {
  stroke: "green",
  strokeWidth: 10,
  hasBorders: false
});
side_c = new fabric.Line([250, 150, 250, 50], {
  stroke: "blue",
  strokeWidth: 10,
  hasBorders: false
});
side_d = new fabric.Line([150, 150, 260, 150], {
  stroke: "green",
  strokeWidth: 10,
  hasBorders: false
});
canvas.add(polygon).add(side_a).add(side_b).add(side_c).add(side_d).renderAll();

现在只需要弄清楚如何动态创建它们。 new JSFIDDLE HERE

更新: 最终我能够通过循环运行来解决它。

1 个答案:

答案 0 :(得分:0)

我能够通过遍历各个点并生成线来解决它:

var fromX = transformedPoints[i].x;
var fromY = transformedPoints[i].y;
return new fabric.Line([p.x, p.y , fromX, fromY], {
  stroke: colors[i],
  strokeWidth: 10,
  hasBorders: true,
  strokeDashArray: [20, 5]
});
相关问题