Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 最近邻区可视化_Algorithm_Computational Geometry_Data Visualization_Kdtree_Space Partitioning - Fatal编程技术网

Algorithm 最近邻区可视化

Algorithm 最近邻区可视化,algorithm,computational-geometry,data-visualization,kdtree,space-partitioning,Algorithm,Computational Geometry,Data Visualization,Kdtree,Space Partitioning,我正在编写一个应用程序,它使用一个。在开发过程中,能够“看到”每个点周围最近的区域将是一件好事 在所附图像中,红色点是k-d树中的点,围绕每个点的蓝色线限定了最近邻搜索将返回包含点的区域 图像是这样创建的: for each point in the space: da = distance to nearest neighbor db = distance to second-nearest neighbor if absolute_value(da - db) < 4:

我正在编写一个应用程序,它使用一个。在开发过程中,能够“看到”每个点周围最近的区域将是一件好事

在所附图像中,红色点是k-d树中的点,围绕每个点的蓝色线限定了最近邻搜索将返回包含点的区域

图像是这样创建的:

for each point in the space:
  da = distance to nearest neighbor
  db = distance to second-nearest neighbor
  if absolute_value(da - db) < 4:
    draw blue pixel
对于空间中的每个点:
da=到最近邻居的距离
db=到第二个最近邻居的距离
如果绝对_值(da-db)<4:
绘制蓝色像素
该算法存在两个问题:

  • (更重要的是)在我的(相当快的Core i7)计算机上速度很慢
  • (不太重要)它很邋遢,从蓝线的不同宽度可以看出
一组点的“可视化”称为什么

有哪些好的算法可以创建这样的可视化

这被称为,有许多优秀的算法可以有效地生成它们。我听说最多的是,它在时间O(n logn)中运行,尽管还有其他算法可以解决这个问题

希望这有帮助

雅各布

嘿,你发现了一种生成这个Voronoi图的有趣方法,尽管它不是很有效

第一个不太重要的问题是:你得到的不同厚度的边界,那些蝴蝶形状,实际上是双曲线的两个分支之间的区域。精确地说是由方程| da-db |=4给出的双曲线。为了得到一条粗线,你必须修改这个标准,并用到两个最近邻居的平分线的距离来代替它,让a和B;使用向量演算,|PA.AB/|AB | | |-| | AB | |/2 |<4

更重要的问题是:构建一组点的Voronoi图有两种众所周知的有效解决方案:Fortune的扫描算法(如templatetypedef所述)和Preparata&Shamos的分治解决方案。两者都在最佳时间O(N.Lg(N))内运行N个点,但实现起来并不容易

这些算法将Voronoi图构造为一组线段和半直线。检查

这篇论文“一般细分操作原语和Voronoi计算”描述了这两种算法,使用了某种高级框架,关注所有实现细节;这篇文章很难,但算法是可以实现的

您还可以看看“平面Voronoi图的一个简单迭代算法”,我从未尝试过

另一种完全不同的方法是直接从给定点构建距离图,例如通过Dijkstra算法:从给定点开始,在距离每个点的给定距离内增长区域边界,当两个边界相交时停止增长。[需要更多解释。]请参阅


另一个好的起点(有效计算距离图)是“计算线性时间内距离变换的通用算法”。

根据个人经验:Fortune的算法很难实现。Guibas和Stolfi提出的分治算法还不错;他们给出了详细的伪代码,很容易转录成过程编程语言。如果有近似退化的输入并使用浮点,两者都会爆炸,但由于基本体是二次的,如果可以将坐标表示为32位整数,则可以使用64位执行行列式计算


一旦你工作了,你可以考虑替换你的KD树算法,它有θ(√n) 最糟糕的情况是,算法可以处理平面细分。

您可以在D3.js库中找到一个很好的实现:

感谢链接。我最终使用了D3实现,非常棒。