我很难找到一种方法来计算任意多边形内的“交叉场”。由一篇论文定义的交叉字段是与域边界(在本例中为多边形)切线的最光滑域,我在四重拓扑文件中发现了很多,但令人惊讶的是,即使在维基百科,我也能找到交叉域的定义。我有图像,但由于我是新来的,系统说,我需要至少10个声誉点来上传图片。
有什么想法吗?我认为这可能是类似于插值的东西?给定一个内点,确定与每条边的距离,并将每条边的切线和垂直向量按距离进行积分或加权。(事实上还有其他因素),但还可能存在其他更简单的方法吗?提前感谢!
发布于 2015-08-30 07:57:19
//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);
}发布于 2015-09-02 21:17:12
您可以检查我正在开发的OpenSource图形软件,它实现了在我的研究团队中开发的“周期全局参数化”算法1。您也可能对下面的研究文章感兴趣,我们最近开发了2,3种算法。
石墨网站:http://alice.loria.fr/software/graphite
如何使用周期全局参数化:http://alice.loria.fr/WIKI/index.php/Graphite/PGP
1
2
3
https://stackoverflow.com/questions/32293508
复制相似问题