【问题标题】:Modifying a convex hull to exclude unwanted points修改凸包以排除不需要的点
【发布时间】:2009-10-20 09:49:56
【问题描述】:

在我的 C#-Silverlight 3 程序中,我有一组点。这些点可以是不同的颜色,绿色、红色或蓝色。然后我为不同的点创建一个凸包:一个绿色的包,一个红色的包和一个蓝色的包。现在可能会发生,每种颜色的外壳内都有来自另一种颜色的点,就像绿色外壳内的红色点一样。

是否有任何算法可以修改外壳,以便将那些其他颜色的点从外壳中排除(此时不再是凸点)?

提前致谢, 弗兰克

【问题讨论】:

  • 排除是什么意思?你的意思是去掉这些点?但是在删除一些点时,您可能会“破坏”现有的凸包。当绿色凸包的所有点都在红色凸包内时会发生什么?需要更多细节来回答这个问题。一个具体的例子也会有所帮助。
  • 通过“破坏”凸包,我的意思是移除凸包的 5 个点中的 3 个,因为这 3 个点在另一个包内。然后你会得到 2 个不能是凸包的剩余点。

标签: c# algorithm geometry


【解决方案1】:

转化为经典的旅行商问题。

使用生成此外壳的点并添加您希望它们排除的其他点。 现在在这些点上找到shotrest路径,你就有了这个新船体

编辑

我们需要在点上找到一条不相交的路径。

  1. 在中间找一个点(比如算术中心)
  2. 计算每个点的角度(使用函数 atan2)
  3. 按角度对这些点进行排序。

复杂度现在是 N*log(N)

【讨论】:

  • 神秘回答,但正确的结论是:这是一个 NP 难题。
  • @Clint Tseng 我现在在想,一旦你在这个被排除的点上寻找路径是最可靠的,那就没有必要了。它只是作为船体。在点上找到非交叉路径最坏的情况是 N*log(N)。
  • 我找到了research.cs.queensu.ca/home/daver/Pubs/MyPDF/…,你可能会感兴趣。 :)
猜你喜欢
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
  • 2017-02-18
  • 2013-05-09
  • 1970-01-01
  • 2011-01-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多