C++ C++;:从未排序列表中的校准图片中查找相邻网格点

C++ C++;:从未排序列表中的校准图片中查找相邻网格点,c++,grid,jquery-ui-sortable,calibration,neighbours,C++,Grid,Jquery Ui Sortable,Calibration,Neighbours,我有4个校准点的x和y坐标列表。这些列表没有特定的顺序,也没有在任何轴上对齐(它们来自一张带有轻微旋转和扭曲的真实校准图片),但是列表具有相同的索引,并且不能以每个列表都是升序/降序的方式进行排序。它们也不包含整数值,只包含浮点值。我现在试图找到给定点的四个相邻点 例如,搜索点[150150]的邻居将返回[140140]、[140160]、[160140]、[160160](除了它们实际上更像[139.581239138.28812]) 目前,我必须检查每个点的所有校准点。大约有500个校准点

我有4个校准点的x和y坐标列表。这些列表没有特定的顺序,也没有在任何轴上对齐(它们来自一张带有轻微旋转和扭曲的真实校准图片),但是列表具有相同的索引,并且不能以每个列表都是升序/降序的方式进行排序。它们也不包含整数值,只包含浮点值。我现在试图找到给定点的四个相邻点

例如,搜索点[150150]的邻居将返回[140140]、[140160]、[160140]、[160160](除了它们实际上更像[139.581239138.28812])

目前,我必须检查每个点的所有校准点。大约有500个校准点

在该过程的后期,我需要知道1600x1400网格内随机点的4个邻居数百万次。因此,尽可能快地找到这些点非常重要,以避免几天甚至几周的计算时间。

我的第一种方法是检查每个点的~500个校准点中的每个点,以检查并查看它们相对于检查点的相对位置(x_calib>x和y_calib>y将位于点的顶部、右侧区域的某个位置),并计算它们到检查点的距离。每个区域中最近的点(左上、右上、左下、右下)将是相应的相邻点。这似乎根本没有效率,而且需要很多时间

第二种方法是为每个1600x1400点创建一个彩虹表,并保存相应的相邻点(确切地说,将索引保存在坐标列表中)。稍后,该过程将在位置[x,y,0]、[x,y,1]、[x,y,2]和[x,y,3]检查彩虹表,以获得4个相邻点的4个索引。虽然计算彩虹表需要一些时间(这200万个点大约需要20分钟),但这种方法加快了后续处理。不幸的是,这种方法使得调试流程的后续步骤变得很困难,因为在其余步骤开始之前需要花费这么多时间

我仍然认为应该有优化的空间,如果有任何建议或帮助加快整个过程,我将不胜感激。我已经阅读了kd tree的相关内容,但没有看到在这里使用它的可能性。我希望有一种方法可以用于这种未排序(和不可排序)的点列表,它比彩虹表更有效,或者至少在创建表时更快


提前谢谢

您是否尝试序列化rainbow表并加载它以进行调试,这样您就不必每次运行程序时都重新创建它?这就是我现在要做的。我对C++编码很陌生(4周前开始),我尽量尽可能高效地编码。因此,我希望能有一些巧妙的方法获得同样的结果在此之前,我将继续将表写入txt文件,并在下一个实例中读取它。