我收集了100个地理点。我想尽可能多地创建三角形(每个三角形是单个区域)。现在制作三角形边的唯一标准是两点不能超过5KM。所以我需要3分ABC
|AB| <= 5
|BC| <= 5
|CA| <= 5
现在我唯一能想到的就是用其余的点来检查每个点。当然,当我得到3分时,我正在打破循环。但我认为这不是最快的方式。
我有什么?我有List
分,每个点都有纬度和经度所以使用google api我可以轻松获得点之间的距离。
点存储在SQLite数据库中,其中每个点在单独的列中具有纬度和经度
任何想法?我应该使用哪种方法?或者也许是我认为唯一的好处?
答案 0 :(得分:0)
1)在最坏的情况下,每个点都在每个其他点的5公里范围内,并且最终会创建(100个选择3个)三角形,而聪明的数据结构不会加快速度。所以你可能最好只做你所描述的简单事情。
2)假设您为每个点找到了参考点的北方,以及该参考点以东的距离。然后想想一个网格,其中一个交叉点位于参考点,并且其线条间隔超过5公里。将每个点排序到它所在的网格中的框中。现在迭代网格中的框,组合它们中的点以组成三角形。由于网格宽度为5km,因此您无需比较来自不同网格框的点,除非这些网格框至少在拐角处接触。如果它们不接触,那些网格框至少相隔5km,其中的所有点也是如此。 (如果你担心地球的曲率会扰乱这里隐含的假设,你可以使用略大于5km的值)
这里有一些注释和例子可以解释(2)更多:
其中一些想法的例子:
选择第一个点作为参考点。假设它是54.37N,5.56W。根据定义,这是(0,0)。取点54.32N,5.703W。忽略地球的曲率,计算出从54.37N,5.56W到54.32N,5.56W的距离,以找出第二点距离第一点的南边有多远。同样地,找出第一个点的西边多远,并根据它给它一个(-X,-Y)的网格位置。为所有要点做到这一点。现在使用这些网格位置将点放入框中,其中每个框保存5km x 5km网格中的所有点。你只需要除以5,然后使用floor()把它变成一个整数就可以做到这一点,这会给你一个盒子网格中的坐标。
迭代所有盒子。假设您正在使用其西南点(10,15)的盒子。您必须将该框中的每个点与该框中的每个其他点进行比较。您必须将该方框中的每个点与包含西南点(10,20)的方框中的每个点进行比较,因为这两个方框并排放置,因此连接它们的线两侧的点可能相距不到5公里。您甚至必须将框中的每个点与(10,15)处的西南点进行比较,并将框中的每个点与西南点(15,20)进行比较,因为您可以在第一个框中指向点(14,19)并指向( 16,21)在第二个盒子里,它们相距不到5公里。您不必将框中的任何点与西南点(10,15)与西南点(20,15)框中的任何点进行比较,因为这些框的北距离差异意味着( 10,15)盒子在(20,15)盒子的每个点以南5公里以上(如果你将点放入盒子的方式是一致的,甚至在网格位置的点也不会分成两个盒子,除非他们相距超过5公里。)
所以我的想法是,因为你已经将点分类到盒子中,你只需要将盒子中的点与九个盒子中的点进行比较,这些盒子是盒子和相邻盒子的盒子,有很多比较你不必做的点。 - 但在最坏的情况下,每个点都会在同一个盒子里结束,然后你就会沉没。