【发布时间】:2017-07-19 14:56:50
【问题描述】:
我有一个多边形,其中一些顶点与线相连(起点和终点是多边形的一个顶点)。每条线(连接顶点)有 4 条规则:
- 该线不与其他线相交
- 线不与多边形相交
- 线完全包含在多边形中
- 线不是多边形的边
示例: 在图像中,红线是坏线, 黑线是多边形边缘,绿线是好线。
- 行
h好 - 线
i不好,因为它与多边形相交 - 线
j不好,因为它与线h和i相交 - 线
k不好,因为它是多边形的一条边 - 线
g不好,因为它不包含在多边形中
我有一个包含多边形顶点的数组,以及一个包含线条的数组,如下所示:
polygon = [
{x: ..., y: ...},
...
]
lines = [
{
p1: {x: ..., y: ...},
p2: {x: ..., y: ...}
},
...
]
lines 数组仅包含有效行。
如何获得被线切割的多边形。
我想要这样的东西:
function getSlicedPolygons(polygon, lines){
// No check for valid lines, they are already valid
// Do the algorithm...
}
到目前为止我已经尝试过什么
我从第一个顶点开始,然后继续,直到我到达一个连接的顶点。从那个顶点,我去到在线的另一端连接的顶点。现在我下一步直到另一个连接的顶点,依此类推,直到我到达我开始的顶点。现在我有了第一个多边形。我找不到其他人...
代码(实现,不是真正的代码):
function getSlicedPolygons(polygon, line){
var results = []
var ofl = 0; // Overflow counter, to prevent infinite looping
while(lines.length > 0){
// Iterate through polygon
var i = 0;
var r = []; // Array of new indices
var iterations = 0; // An overflow counter again
while(i < polygon.length){
r.push[i]
// findNextConnectionIndex(...) searches for a line
// that connects with this vertex and returns the index of
// the other connected vertex
var n = findNextConnectionIndex(i, polygon, lines) || i+1
i=n;
// Don't loop infinite
iterations++;
if(iterations > 10) break;
}
var result = [];
for(var z = 0; z<r.length; z++){
result.push(polygon[r[z]])
}
results.push(result)
// Now I should do something to get another polygon next
// time ...
// Don't loop infinite
ofl++;
if(ofl >= 10) break;
}
return results;
}
它在一个数组中返回相同的多边形 10 次...
【问题讨论】:
-
我试图从第一个顶点开始并获取下一个顶点,直到我到达一个行尾,然后我移动到另一个行尾并继续下一个,直到我回到第一个顶点。现在我有第一个,但没有其他的。我会编辑我的问题...
-
我相信@JonasGiuro 是在问你到目前为止尝试过什么代码。我们希望看到您实际上是在尝试解决这个问题,而不是将您的工作交给 SO 上的志愿者。
-
哦,对不起,我会再次编辑它...
-
顺序是否重要,即如果两条线相交,那么第一条是好的,第二条是坏的?此外,如果 j 和 h 被交换,那是否会使 h 变坏(即与以前被认为是坏的线相交是否重要)?
-
顺序无关紧要。示例:连接2个顶点,检查是否有效,然后连接另外2个顶点检查是否有效,以此类推...
标签: javascript algorithm polygon