我很难找到计算交叉场的方法"在任意多边形内。 由一张纸定义的交叉场是与域边界相切的最平滑的场(在这种情况下是多边形)我在四重新拓扑论文中发现它很多,但令人惊讶的是甚至没有维基百科我可以找到交叉字段的定义。 我有图像,但由于我是新手,系统说我需要至少10个声誉点来上传图像。
有什么想法吗? 我认为它可能是一个插值的东西?给定一个内点确定每个边缘的距离,并将每个边缘的切线和垂直向量与距离进行积分或加权求和? (或其他任何因素) 但是可能存在其他更简单的方法吗? 提前谢谢!
答案 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