javascript 如何将多边形直接切割成几块?

wgmfuz8q  于 2022-11-27  发布在  Java
关注(0)|答案(1)|浏览(141)

我想用JavaScript开发一个游戏“剪切形状”。几个带有凸多边形的组件需要根据凸自由面的数量进行剪切。线条和多边形显示在画布上。Paper.js图形加载使用。
但是问题来了,关于多边形相对于画线的正确分离,我就是想不出一个方法来做这个。
下面是一个简单多边形的示例(线可以是任何线,用户可以自己绘制):

我得到的点划分成其他多边形使用小圆点与一条线:

var polygon = new Path.RegularPolygon(new Point(200, 300), 4, 100);
polygon.strokeColor = 'blue';
polygon.fullySelected = true;

var shapesArray = [];
shapesArray.push(polygon);

function splitShape(path1, path2){
var shapesArrayCopy = path1.slice(0);
shapesArray = [];
for(var i = 0; i < shapesArrayCopy.length; i++){
    var intersections = shapesArrayCopy[i].getIntersections(path2);
    if(intersections.length >= 2){
        var p1 = shapesArrayCopy[i].split(shapesArrayCopy[i].getNearestLocation(intersections[0].point));
        var p2 = shapesArrayCopy[i].split(shapesArrayCopy[i].getNearestLocation(intersections[1].point));
        p1.closed = true;
        p2.closed = true;
        shapesArray.push(Object.assign(p1));
        shapesArray.push(Object.assign(p2));
        path2.visible = false;
    }
    else{
        shapesArray.push(shapesArrayCopy[i])
    }
}

var myPath;

function onMouseDown(event) {
   myPath = new Path();
   myPath.strokeColor = 'black';
   myPath.add(event.point);
   myPath.add(event.point);
}

function onMouseDrag(event) {
    myPath.segments.pop(); 
    myPath.add(event.point);
}

function onMouseUp(event) {
   splitShape(shapesArray, myPath)
   myPath.visible = false;
}

nbysray5

nbysray51#

在2D中,您只需在垂直于切割线的方向上移动切割。如果您的切割线端点为:p0(x0,y0),p1(x1,y1)则线方向为:

dp = p1-p0 = (x1-x0,y1-y0)

使其单位:

dp /= sqrt((dp.x*dp.x)+(dp.y*dp.y)

使其等于切口之间差距的一半:

dp *= 0.5*gap

现在有两个垂直方向:

d0 = (-dp.y,+dp.x)
d1 = (+dp.y,-dp.x)

因此,现在只需将d0添加到一条切割线的所有顶点,并将d1添加到另一条切割线的所有顶点。

t = dot(p-p0,d0) = ((p.x-x0)*d0.x)+((p.y-y0)*d0.y)

如果(t>0),则使用d0;如果(t<0),则使用d1;如果(t==0),则选择了错误的点p,因为它位于切割线上。

相关问题