【问题标题】:How many triangles can be found from N points that with the centroid of the N points in them?从N个点中可以找到多少个三角形,其中有N个点的质心?
【发布时间】:2020-02-06 20:29:59
【问题描述】:

我有 N 个点(N 大约是 12000),并计算这 N 个点的质心Ct。 我想知道,从 N 个点中可以找到多少个三角形,每个三角形的质心为Ct

我做了什么:
1.使用 pandas 将 N 个点的坐标读入数据框。 (以下所有数据仅供参考)

PntsDF
   x y
a1 1 1
a2 1 2
...
a12000 100 100

2.将N个点按极坐标分为三部分,可以大大降低计算复杂度。

PntsDF
   x y Part
a1 1 1  Sec1
a2 1 2  Sec1
...
a12000 100 100 Sec3

3.使用笛卡尔积得到三部分的点组合,比itertools快。

CombsDF:
   p1 p2 p3
1 a1 a2  a1000
2 a1 a2  a1001
...
64000000000 a12000 a200 a201

4.检查Ct是否为三角形组合
4.1 查找组合[a1 a2 a1000]的对应坐标很慢,大概需要6秒完成查找过程。

由于 N 大约为 10 000,因此即使使用我的工作站,仍需要几个小时才能完成计算。

非常感谢任何关于如何缩短计算时间的 cmets。

【问题讨论】:

  • 你能发布你的代码吗?只有结果有点难以优化。
  • 如果你有 12k 个点,大约有 1.7e12 个可能的三角形,你可能会过滤掉大约 1/2,仅存储坐标仍然有相当多的 TB。你真的有能力做到这一点吗? several hours你说???
  • 没那么大。 Combin(12000,3) 约为 2.9E11。根据我的估计,质心所在的三角形不会超过 640 亿。所以它可以用现代计算机来完成。但需要更多的效率。

标签: python pandas numpy math


【解决方案1】:

工作正在进行中,但第一个想法:

通过检查以下 4 个条件,您已经可以减少 43.75% (1 - (3/4)**2) 的三角形(假设您的点分布均匀):

  • (triangles['x1'] > ct_x) & (triangles['x2'] > ct_x) & (triangles['x3'] > ct_x)
  • (triangles['x1'] < ct_x) & (triangles['x2'] < ct_x) & (triangles['x3'] < ct_x)
  • (triangles['y1'] > ct_y) & (triangles['y2'] > ct_y) & (triangles['y3'] > ct_y)
  • (triangles['y1'] < ct_y) & (triangles['y2'] < ct_y) & (triangles['y3'] < ct_y)

这将大大减少计算负担。

然后检查剩余的三角形,我实现了@Andreas Brinck 在stackoverflow - algorithm 中描述的算法。其中一位 cmets 还在jsfiddle 中测试了他的算法。

顺便说一句,我不完全理解你的分割技术,如果你只是要从 3 个不同的段中选择点组合,你会忽略很多仍然包括我们的 ct 的三角形?:

【讨论】:

  • 以质心为原点,每隔120度将点放在一个截面中。同一截面中的点不会形成质心在的三角形。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多