Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从多边形连接的顶点,如何获得新多边形_Javascript_Algorithm_Polygon - Fatal编程技术网

Javascript 从多边形连接的顶点,如何获得新多边形

Javascript 从多边形连接的顶点,如何获得新多边形,javascript,algorithm,polygon,Javascript,Algorithm,Polygon,我有一个多边形,其中一些顶点与直线相连(起点和终点是多边形的顶点)。对于每条线(连接顶点),有4条规则: 这条线与其他线不相交 直线与多边形不相交 直线完全包含在多边形中 直线不是多边形的边 例如: 在图像中,红线是坏线, 黑线是多边形边,绿线是一条好线 行h良好 直线i不好,因为它与多边形相交 行j不好,因为它与行h和i 直线k不好,因为它是多边形的边 直线g不正确,因为它不包含在多边形中 我有一个包含多边形顶点的数组,还有一个包含直线的数组,如下所示: polygon = [ {

我有一个多边形,其中一些顶点与直线相连(起点和终点是多边形的顶点)。对于每条线(连接顶点),有4条规则:

  • 这条线与其他线不相交
  • 直线与多边形不相交
  • 直线完全包含在多边形中
  • 直线不是多边形的边
例如: 在图像中,红线是坏线, 黑线是多边形边,绿线是一条好线

  • h
    良好
  • 直线
    i
    不好,因为它与多边形相交
  • j
    不好,因为它与行
    h
    i
  • 直线
    k
    不好,因为它是多边形的边
  • 直线
    g
    不正确,因为它不包含在多边形中
我有一个包含多边形顶点的数组,还有一个包含直线的数组,如下所示:

polygon = [
  {x: ..., y: ...},
  ...
]
lines = [
  {
    p1: {x: ..., y: ...},
    p2: {x: ..., y: ...}
  },
  ...
]
function getSlicedPolygons(polygon, lines){
  // No check for valid lines, they are already valid
  // Do the algorithm...
}
数组仅包含有效行

我怎样才能得到被直线分割的多边形

我想要这样的东西:

polygon = [
  {x: ..., y: ...},
  ...
]
lines = [
  {
    p1: {x: ..., y: ...},
    p2: {x: ..., y: ...}
  },
  ...
]
function getSlicedPolygons(polygon, lines){
  // No check for valid lines, they are already valid
  // Do the algorithm...
}

到目前为止我都试过了 我从第一个顶点开始,然后继续,直到到达一个连接的顶点。从该顶点,我转到在直线另一端连接的顶点。现在我继续下一步,直到另一个连接的顶点,依此类推,直到到达我开始的顶点。现在我有了第一个多边形。我找不到其他人

代码(实现,非真实代码):

函数getSlicedPolygons(多边形、线){ var结果=[] var ofl=0;//溢出计数器,用于防止无限循环 while(lines.length>0){ //遍历多边形 var i=0; var r=[];//新索引数组 var iterations=0;//再次使用溢出计数器 而(i10次)中断; } var结果=[];
对于(var z=0;z将多边形及其相交线视为具有循环的无向图,并对其应用循环检测算法。由于我们知道连接线,事情变得更简单,我们实际上可以解决
O(V)
中的问题

这将是一个足以解释基本原理的模型。我们可以将多边形转换为一个由直线列表分割的矩形。因为没有直线可以相交,这也将应用于生成的矩形。现在可以从图形的一个角开始,沿着两条边移动,直到在两条路径上都有一个3度的顶点已到达。因此,我们找到了第一个多边形,它是对原始多边形进行切片的结果。从上一步中达到的两个点继续,直到再次达到3度的顶点。当两条路径相交并且列出了所有可能的多边形时,终止此步骤

运行此流程的单个步骤的示意图:

查找“角”顶点 从图形/多边形中的任意点开始,沿多边形以任意方向遍历顶点,直到到达3度的顶点。存储相应的切片线,然后沿多边形继续,直到到达3度的顶点。如果是同一条切片线,则找到“角点”顶点,否则存储新的切片线并重复

编辑 python的工作实现:

def slice_polygon(poly, part):
    # find the "corner point"
    last_slice = None
    last_pt = None

    for pt in poly:
        s = [x for x in part if pt in x]

        if s:
            if last_slice in s:
                break

            last_slice = s[0]

        last_pt = pt

    # find slicing starting from border-point
    a = poly.index(last_pt)
    b = (a + 1) % len(poly) # current positions on the polygon
    sliced_poly = []    # current polygon
    slicing = []    # list of all polygons that are created by the slicing
    while a != b:
        if not [x for x in part if poly[a] in x]:
            # point doesn't lie on slicing-line => add to current polygon
            sliced_poly.insert(0, poly[a])             # prepend point
            a = (a - 1 + len(poly)) % len(poly)  # advance a by one
        elif not [x for x in part if poly[b] in x]:
            # point doesn't lie on slicing-line => add to current polygon
            sliced_poly.append(poly[b])                # append point
            b = (b + 1 + len(poly)) % len(poly)  # advance by one
        else:
            # append points of slicing line
            sliced_poly.insert(0, poly[a])
            sliced_poly.append(poly[b])

            # store created polygon and start over
            slicing.append(sliced_poly)
            sliced_poly = []

            # remove partitioning-line at which the algorithm stopped
            part.remove([x for x in part if poly[a] in x and poly[b] in x][0])

    # add last point to the current polygon, as it's not yet added to it
    sliced_poly.append(poly[a])
    # add last polygon to result-set
    slicing.append(sliced_poly)

    return slicing


# test
polygon = [(150, 110), (270, 40), (425, 90), (560, 150), (465, 290), (250, 290), (90, 220)]
partition = [((270, 40), (250, 290)), ((425, 90), (250, 290))]
print(slice_polygon(polygon, partition))
输出:

[(42590),(560150),(465290),(250290)],[(270,40),(42590),(250290)],[(90220),(150110),(270,40),(250290)]]

输入:


因为总共有两个“角点”(至少),如果我们遍历多边形一次,我们保证至少会找到一个。

我试图从第一个顶点开始,然后得到下一个顶点,直到到达一条线的终点,然后我移动到另一条线的终点,然后继续,直到回到第一个顶点。现在我得到了第一个顶点,但没有其他顶点。我会编辑我的问题……我相信@JonasGiuro被问到了到目前为止,你尝试了哪些代码。我们希望看到你实际上是在试图弄清楚这一点,而不是将你的工作交给志愿者。哦,对不起,我会再次编辑它…顺序是有意的吗,即如果两条线相交,那么第一条是好的,第二条是坏的?而且,如果j和h被交换,那么d使h变差或变差(即与先前确认为不好的线相交吗)?顺序不重要。例如:连接2个顶点,检查是否有效,然后连接2个其他顶点检查是否有效,依此类推…谢谢你的回答!@OlafNankman我有时间时会用python版本更新;)@我做了一个简单的测试,但是如果我遗漏了什么,请随时通知我。