计算几何:在镜子上旋转、平移或反射后找到三角形的位置
Posted
技术标签:
【中文标题】计算几何:在镜子上旋转、平移或反射后找到三角形的位置【英文标题】:Computational geometry: find where the triangle is after rotation, translation or reflection on a mirror 【发布时间】:2010-04-30 15:45:12 【问题描述】:我有一个小竞赛问题,其中给出了一组点,在 2D 中,形成一个三角形。这个三角形可以进行任意旋转,可以进行任意平移(都在 2D 平面中)并且可以在镜子上进行反射,但其尺寸保持不变。 然后,他们给了我平面上的一组点,我必须在一个或多个几何运算之后找到构成我的三角形的 3 个点。
例子:
5 15
8 5
20 10
6
5 17
5 20
20 5
10 5
15 20
15 10
Output:
5 17
10 5
15 20
我打赌它应该应用一些已知的算法,但我不知道是哪个。最常见的有:凸包、扫掠平面、三角剖分等。
有人可以给小费吗?我不需要代码,只需要一个推送!
【问题讨论】:
仅供参考,这与数学比编程更相关,不确定它是否真的属于这个网站 【参考方案1】:三角形由其三个边的长度唯一定义(忽略旋转、翻转和平移)。标记原始三角形 A、B、C 的顶点。你在找 对于点 D,E,F 使得 |AB| = |德|, |交流| = |DF| 和 |BC| = |EF|。长度由毕达哥拉斯公式给出(但您可以通过比较在每次测试中保存平方根运算 线段长度的平方...)
【讨论】:
【参考方案2】:给定的三角形由三个长度定义。您想在列表中找到恰好被这些长度分隔的三个点。
对给定的长度求平方,以免打扰sqrt
。
求列表中每对点之间距离的平方,只记下那些与给定长度重合的点:O(V^2),但系数较低,因为大多数长度不匹配。
现在你有一个带有 O(V) 边的稀疏图。在 O(V) 时间内找到每个大小为 3 的循环,并修剪匹配项。 (不确定最好的方法,但 here is one way 带有适当的 big-O。)
总复杂度:O(V^2),但在 O(V) 中找到循环可能是限制因素,具体取决于点数。对点列表进行空间排序以避免查看所有对应该改善渐近行为,否则。
【讨论】:
非常好用且易于理解!【参考方案3】:这通常使用矩阵数学来完成。 This Wikipedia article 涵盖了旋转、平移和反射矩阵。这是another site(附图片)。
【讨论】:
【参考方案4】:由于变换只是旋转、缩放和镜像,那么你可以通过检查三角形两侧的点积来找到形成变换三角形的点:
-
对于原三角形A、B、C,计算AB.AC、BA.BC、CA.CB的点积
对于每组 D、E、F 三个点,计算 DE.DF 的点积并与 1 中找到的三个点积进行比较。
这工作自 AB.AC = |AB| x |交流| x cos(a),两个长度和它们之间的角度定义了一个三角形。
编辑:是的,Jim 是对的,仅仅一个点积是不够的,你需要做所有三个,包括 ED.EF 和 FD.FE。所以最后,这个方法的计算次数与平方距离方法的计算次数相同。
【讨论】:
我认为这还不够。 P dot Q = R dot S 并不一定意味着|P| = |R|或 |P| = |S|。以上是关于计算几何:在镜子上旋转、平移或反射后找到三角形的位置的主要内容,如果未能解决你的问题,请参考以下文章