如何计算任意多边形内的几何交叉场?

时间:2015-08-30 05:32:58

标签: geometry field interpolation

我很难找到计算交叉场的方法"在任意多边形内。 由一张纸定义的交叉场是与域边界相切的最平滑的场(在这种情况下是多边形)我在四重新拓扑论文中发现它很多,但令人惊讶的是甚至没有维基百科我可以找到交叉字段的定义。 我有图像,但由于我是新手,系统说我需要至少10个声誉点来上传图像。

有什么想法吗? 我认为它可能是一个插值的东西?给定一个内点确定每个边缘的距离,并将每个边缘的切线和垂直向量与距离进行积分或加权求和? (或其他任何因素) 但是可能存在其他更简单的方法吗? 提前谢谢!

2 个答案:

答案 0 :(得分:0)

//I've come up with something like this (for the 3D case), very raw, educational purposes
float ditance2segment(Vector3D p, Vector3D p0, Vector3D p1){
   Vector3D v = p1 - p0;
   Vector3D w = p - p0;
   float c1 = v.Dot(w);
   if (c1 <= 0)
      return (p - p1).Length();
   float c2 = v.Dot(v);
   if (c2 <= c1)
      return (p - p1).Length();

   float b = c1 / c2;
   Vector3D pb = p0 + b*v;
   return (p - pb).Length();

}
void CrossFieldInterpolation(List<Vector3D>& Contour, List<Vector3D>&   ContourN, Vector3D p, Vector3D& crossU, Vector3D& crossV){
    int N = Contour.Amount();   
    for (int i=0; i < N; i++){
        Vector3D u = Contour[(i + 1) % N] - Contour[i];     
        Vector3D n = 0.5*(ContourN[(i + 1) % N] + ContourN[i]); 
        Vector3D v = -Vector3D::Cross(u,n); //perpendicular vector  
        u = Vector3D::Normalize(u);
        n = Vector3D::Normalize(n);
        v = Vector3D::Normalize(v);

        float dist = ditance2segment(p, Contour[i], Contour[(i+1)%N]);

        crossU += u / (1+dist); //to avoid infinity at points over the segment
        crossV += v / (1+dist);
    }
    crossU = Vector3D::Normalize(crossU);   
    crossV = Vector3D::Normalize(crossV);
  }

答案 1 :(得分:0)

您可以查看我正在开发的OpenSource Graphite软件,它实现了&#34;周期性全局参数化&#34;算法[1]是我的研究团队开发的。您可能也对我们最近开发的算法的以下研究文章感兴趣[2],[3]

石墨网站: http://alice.loria.fr/software/graphite

如何使用定期全局参数化: http://alice.loria.fr/WIKI/index.php/Graphite/PGP

[1] http://alice.loria.fr/index.php/publications.html?Paper=TOG_pgp%402006

[2] http://alice.loria.fr/index.php/publications.html?Paper=DGF@2008

[3] http://alice.loria.fr/index.php/publications.html?redirect=0&Paper=DFD@2008&Author=vallet