首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将4个协调连接在一起的算法,使其总是产生四边形。

将4个协调连接在一起的算法,使其总是产生四边形。
EN

Stack Overflow用户
提问于 2015-05-25 12:47:37
回答 11查看 213关注 0票数 4

我们得到了二维平面上4个点的坐标。我们如何找到一个订单,将它们与行连接起来,形成一个四边形 (只要有可能)?

EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2015-05-25 12:57:37

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

  1. 取任何三个点,然后形成一个三角形。
  2. 如果第四个点在套路内,则将其与三个中的ny交换。
  3. 只剩下最后一个点,计算出你想把它附加到哪两个点。这是通过播放线方程和找到相交点的位置来完成的。下文对此作出澄清。
  4. 返回三角形的两边+第四点和第二阶段中选择的两条线。

第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。DC也是。线路AC离开B&D在平原的对面,所以我们想连接A和B& C。

票数 -2
EN

Stack Overflow用户

发布于 2015-05-25 13:45:44

考虑通过绘制前三个点定义的三条线来划分平面。它界定了7个区域。通过三个符号区域测试(三角形的代数面积ABD、BCD、CAD),您可以很容易地找到第四个点属于哪个区域。

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

在下面的例子中,使用区域-++中的D,ADBC就可以了。

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

票数 4
EN

Stack Overflow用户

发布于 2015-05-25 15:13:12

考虑仿射变换

代码语言:javascript
运行
复制
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线性系统

代码语言:javascript
运行
复制
Dx = Ax + u (Bx - Ax) + v (Cx - Ax)
Dy = Ay + u (By - Ay) + v (Cy - Ay)

给出与(u, v)对应的D值。

然后,

代码语言:javascript
运行
复制
if u < 0 => ABCD
else if v < 0 => BCAD
else => CABD

得到的四边形与三角形ABC具有相同的方向。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30438748

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档