Algorithm 将4个坐标连接在一起,使其始终形成四边形的算法

Algorithm 将4个坐标连接在一起,使其始终形成四边形的算法,algorithm,math,geometry,coordinate-systems,coordinate,Algorithm,Math,Geometry,Coordinate Systems,Coordinate,我们得到了二维平面上4个点的坐标。我们如何才能找到一个顺序,将它们与直线连接起来形成一个(只要可能)?几个阶段,假设最终结果需要4对点(和/或它们之间的直线方程): 取任意三点,画一个三角形 如果第四个点在traingle内,则将其与三个点中的ny交换 只剩下最后一个点,计算要将其附着到的两点。这是通过使用直线方程并找到相交点的位置来完成的。澄清如下 返回三角形的两条边+第四个点和从第二阶段选择的点之间的两条线 步骤2澄清: 假设点A不在三角形中(即BCD)。每条线把平原分成两条边。我们想找到点

我们得到了二维平面上4个点的坐标。我们如何才能找到一个顺序,将它们与直线连接起来形成一个(只要可能)?

几个阶段,假设最终结果需要4对点(和/或它们之间的直线方程):

  • 取任意三点,画一个三角形
  • 如果第四个点在traingle内,则将其与三个点中的ny交换
  • 只剩下最后一个点,计算要将其附着到的两点。这是通过使用直线方程并找到相交点的位置来完成的。澄清如下
  • 返回三角形的两条边+第四个点和从第二阶段选择的点之间的两条线 步骤2澄清:
    假设点A不在三角形中(即BCD)。每条线把平原分成两条边。我们想找到点(B,C或D)s.t.它和A之间的线在另外两条线之间运行(它们在线的两侧)。这是我们不希望附加到A的点

    例如:
    给定A(0,0)、B(10,0)、C(10,10)和D(0,10)。我们有三角形BCD。BC线将A&D留在平原的同一侧。华盛顿也是。AC线将B&D留在平原的两侧,因此我们想将A连接到B&C。

    编辑:正如评论中指出的,它只在特定情况下有效,因此是一个错误的答案


    通过找出4个点中哪一对点之间的距离最大,可以绘制四边形。一旦找到这一对,通过将剩余的两个点与该对的每一点连接起来,即可绘制四边形

    编辑:这个答案已经被证明是错误的

  • 计算四个点的中心
  • 按逆时针方向(或顺时针方向)枚举点
  • 把它们联系在一起

  • 考虑通过绘制由前三个点定义的三条线获得的平面的分割。它定义了7个区域。您可以通过三个有符号面积测试(三角形的代数面积ABD、BCD、CAD)轻松找到第四个点所属的区域

    在每种情况下绘制四边形都很简单(每种情况下可以有一个、两个或三个解决方案)

    在下面的例子中,当D位于
    -++
    区域时,ADBC就可以了


    实际上,两个区域评估就足够了:如果第一个测试返回
    -
    (regions
    -+-
    -++
    -+
    ),ADBC是一个解决方案,否则如果第二个测试返回
    -
    (regions
    +-+
    +-
    ),ABDC是一个解决方案,否则(regions
    +-
    +
    )ABCD是一种解决方案。

    您可以使用任何一种方法的简化。贾维斯很容易。如果凸壳是三角形,则四边形是凸的。只需在边列表中的任意位置插入缺少的点。如果凸包是一条直线(2个端点),只需在x坐标或y坐标上对所有点进行排序即可得到退化四边形。(如果更接近水平(abs delta x>abs delta y),使用x进行排序,否则使用y。)

    我认为,每次只需连接两个点,我们将得到一条线段,并检查其余两个点是否位于该线段的同一侧,如果不是,则不是所需四边形的线段,如果是,则继续使用不同的点集(即,在点上可以是该线段的一个坐标,另一个将形成剩余的两个点),并检查相同的内容,直到获得4条线段为止

    考虑仿射变换

    Px = Ax + u (Bx - Ax) + v (Cx - Ax)
    Py = Ay + u (By - Ay) + v (Cy - Ay)
    
    它将
    (0,0)
    映射到
    A
    (1,0)
    映射到
    B
    (0,1)
    映射到
    C
    。(这使三角形ABC处于标准位置。)

    求解2x2线性系统

    Dx = Ax + u (Bx - Ax) + v (Cx - Ax)
    Dy = Ay + u (By - Ay) + v (Cy - Ay)
    
    提供与
    D
    相对应的
    (u,v)

    那么

    如果u<0=>ABCD
    否则,如果v<0=>BCAD
    else=>CABD
    
    生成的四边形与三角形的方向相同
    ABC


    为了清楚起见,我考虑作为一个点
    p\n
    一个坐标
    (x\n,y\n)
    的点

    要连接4个点,您可以执行以下步骤:

  • 用最小的
    x
    获取点
    p_1
  • 计算从
    p_1
    到每个剩余点的三条线的长度
  • p_1
    与构成最大坡度线的点
    p_2
    相连
  • p_1
    与构成最小坡度线的点
    p_3
    连接
  • 将剩余的点
    p_4
    连接到
    p_2
    p_3

  • 如果有不清楚的地方,请告诉我。

    查找凸包算法。其中一个步骤包括两个步骤:在给定的顶点集(可能是凹面)上构建一个普通多边形,然后移除“凹面顶点”,使剩余多边形变为凸面

    第一步是解决你的问题

    当然这有点过分了。对于4个顶点,只需按顺序(以任何顺序)设置它们,然后验证连接点1-2和3-4的线段是否相交;如果是,交换第2点和第3点;或者可能边2-3和1-4相交–然后交换点3和4。完成了

    为了验证线段AB和CD是否相交,测试点A和B是否位于线CD的相对侧,点C和D是否位于线AB的相对侧


    要确定点K所在的线PQ的侧面,请计算PQ×PK向量积的Z部分:
    (xq xp)(yk yp)-(yq yp)(xk xp)
    。表达式在直线的一侧为正,另一侧为负(直线上为零)。

    使用h可以很容易地解决这个问题
    if u < 0 => ABCD
    else if v < 0 => BCAD
    else => CABD
    
    If AB intersects with CD then return ACBD.
    If AD intersects with BC then return ABDC.
    Otherwise return ABCD.