【问题标题】:Can't understand the solution of HDU 2823看不懂HDU 2823的解决方法
【发布时间】:2016-07-30 17:56:54
【问题描述】:

以下代码 sn-p 取自 here。就是这个问题的解决方案HDU 2823

#define eps 1e-9
double rc(point pp[],point qq[],int n,int m)    
{    
    int q=0;    
    int p=0;    
    for(int i=0;i<n;i++)     
        if(pp[i].y-pp[p].y<-eps)    
            p=i;    
    for(int i=0;i<m;i++)    
        if(qq[i].y-qq[q].y>eps)    
            q=i;    
    pp[n]=pp[0];    
    qq[m]=qq[0];    
    double tmp,ans=1e99;    
    for(int i=0;i<n;i++)    
    {    
        while((tmp=cross(pp[p+1],qq[q+1],pp[p])-cross(pp[p+1],qq[q],pp[p]))>eps)    
            q=(q+1)%m;    
        if(tmp<-eps)    
            ans=min(ans,dist_p_to_seg(qq[q],pp[p],pp[p+1]));    
        else    
            ans=min(ans,dist_seg_to_seg(pp[p],pp[p+1],qq[q],qq[q+1]));    
        p=(p+1)%n;    
    }    
    return ans;    

}    

pp[]qq[] 是两个不同的凸包。 ppp 凸包的最高点,qqq 凸包的最低点。

我似乎无法理解这一行:

while((tmp=cross(pp[p+1],qq[q+1],pp[p])-cross(pp[p+1],qq[q],pp[p]))>eps) 
    q=(q+1)%m;

他想达到什么目的?

【问题讨论】:

  • 在询问代码的 sn-ps 时要小心。例如,eps 的值非常重要 - 就像它的使用一样。您熟悉“epsilon 值”的常见用法吗?
  • 哇!我喜欢数学,但不喜欢这样长的字符串:)

标签: c++ computational-geometry raycasting convex-hull


【解决方案1】:

函数 cross(a, b, c) 正在寻找以下矩阵的行列式,

| a.x a.y 1 |
| b.x b.x 1 |  = 2 * A
| c.x c.y 1 | 

其中 A 是三角形 a、b、c 的有符号区域。 行列式的符号还告诉我们 3 个点是顺时针还是逆时针。 see here for an explanation

让我们这样重写,

triA ← cross(pp[p+1],qq[q+1],pp[p])
triB ← cross(pp[p+1],qq[q],pp[p])

// This is equivalent to,
// just to make it a bit clearer
triA ← cross(pp[p], pp[p+1],    qq[q+1])
triB ← cross(pp[p], pp[p+1],    qq[q])

因此,它会检查由 船体 pp 的一侧形成的三角形 ppqq 的最低点形成的三角形是否小于同一侧和 qq 的下一个最高点形成的三角形。

如果是,则在qq中选择下一个点为q并继续。 -IE。选择一个q,使q 与侧面&lt;p, p+1&gt; 的垂直距离最小。

一旦对给定边&lt;p, p+1&gt; 进行了局部最小化,对pp 的所有边重复此操作。在每一步保持当前边之间的最小距离。

这是一种有点不稳定的方法来找到两个凸包之间的最小间隔。直觉是正确的——正确的意思是它很容易理解(这个想法,不是所讨论的代码),对于凸多边形非常普遍,并且对各种问题非常有用(参见参考资料以下);但是,我有一种感觉,这可以用一种更有效、更易于理解的方式来编写。

本文很好地说明了这些想法背后的直觉 "Solving Geometric Problems with the Rotating Calipers" -- Toussaint G.

【讨论】:

  • 感谢您的解释。只是好奇,你是如何制作这张地理图的?
  • Np。 Adobe Illustrator。
猜你喜欢
  • 1970-01-01
  • 2017-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多