>作者:为梦齐舞
阅读本博文前,建议先浏览“SuperMap iObjects .NET 制作2.5D数据详解(一)”
在上一篇文章中为大家介绍了一些关于2.5D数据制作的内存,用户在使用过程中也反应了一些问题和需求,比如带有弧线的对象转换的2.5D菱角线过多,无法根据字段值拉伸高度等问题,针对上述一系列问题,小编对上期版本代码做出了优化,解决客户所提到的问题。
一、
根据字段值拉伸高度
1、
根据字段名称,获取高程值,定义ati变量存储高程值,atiFiledName为字段名称。
Double
ati=0;
if
(recordset.GetFieldInfos().IndexOf(atiFiledName) != -1)
{
ati =
Double.Parse(recordset.GetFieldValue(atiFiledName).ToString());
}
2、在生成侧面数据、侧边数据、顶面数据时,使用步骤1中获取的值即可实现。
二、弧线对象菱角线过多问题。
1、博文一中提及到生成菱角线的依据是面对象的点集合,点集合中对象越多,生成的菱角线就越多,那么我们可以想到,弧线对象中两个相邻线段几乎接近直线,那么他们夹角一定很小,所以我们可以通过三个点连接的线段夹角大小,来判断是否为中间点生成菱角线。计算夹角代码如下:
private
double angle(Point2D midpoint, Point2D startPoint, Point2D endPoint)
{
double cosfi = 0, fi = 0, norm = 0;
double dsx = startPoint.X - midpoint.X;
double dsy = startPoint.Y - midpoint.Y;
double dex = endPoint.X - midpoint.X;
double dey = endPoint.Y - midpoint.Y;
cosfi = dsx * dex + dsy * dey;
norm = (dsx * dsx + dsy * dsy) * (dex * dex + dey * dey);
cosfi /= Math.Sqrt(norm);
if (cosfi >= 1.0) return 0;
if (cosfi <= -1.0) return Math.PI;
fi = Math.Acos(cosfi);
if (180 * fi / Math.PI < 180)
{
return 180 * fi / Math.PI;
}
else
{
return 360 - 180 * fi / Math.PI;
}
}
2、 计算完成后,在生成菱角线时,调用步骤1中的方法,进行判断,是否生成菱角线,我们这里以20度和160度作为判断依据。
Double
sidePointAngle = this.angle(region[0][j], region[0][j - 1],
region[0][j + 1]);
if
(sidePointAngle > 20 & sidePointAngle < 160)
{
point2DsSideLine.Add(new Point2D(region[0][j].X,
region[0][j].Y));
point2DsSideLine.Add(new Point2D(region[0][j].X, region[0][j].Y +
ati));
recordsetSideLine.AddNew(new GeoLine(point2DsSideLine));
}
效果如下图:
三、顶面数据有压盖现象,出现这种现象时,需要对顶面数据集做融合处理,融合方法参考博文一。
修改后整体效果如下图所示:
网友评论