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