作为上一篇博文的基础补充:
网格序列法的基本步骤:
1、逐个计算每一网格单元与等值线的交点;
2、连接该单元内等值线的交点,生成在该单元中的一等值线线段;
3、由一系列单元内的等值线线段构成该网格中的等值线。
(有兴趣的读者可以学习一下三角剖分法)
等值线走向的确定:沿等值线走,大于等值线值的点在等值线的左边。
该单元内存在一马鞍点,即等值线是双曲线而不是直线,等值线的连接方式产生了二义性。
上图的 “>”表示方格的对应端点 > 等值线阈值,”<”表示方格的对应端点 < 等值线阈值。
解决上面所说的二义性,采用四个端点的平均值即方格的中心点的线性插值作为一个判断的依据:
double center_Value = (a + b + c + d) / 4;
double xc = center_Value - threshold_;
if(xc < 0)
{
points.push_back(vec2f(x1, y1));
points.push_back(vec2f(x2, y2));
points.push_back(vec2f(x3, y3));
points.push_back(vec2f(x4, y4));
}
else
{
points.push_back(vec2f(x1, y1));
points.push_back(vec2f(x3, y3));
points.push_back(vec2f(x2, y2));
points.push_back(vec2f(x4, y4));
}
使用线性插值法求等值点坐标:
考虑直线pq,(px, py)为点p坐标,pv为点p的值,点q类似。ev为等值线的值。
那么等值点就应该是:
point{
px + (qx - px) * (ev - pv) / (qv - pv),
py + (qy - py) * (ev - pv) / (qv - pv)
}
理论说得不详细,有兴趣的读者去看一些这方面的论文帮助理解。