SuperMap iObjects .NET 制作2.5D数据详解(二)

作者:为梦齐舞

      阅读本博文前,建议先浏览“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));
}

      效果如下图:
SuperMap iObjects .NET 制作2.5D数据详解(二)_第1张图片
三、顶面数据有压盖现象,出现这种现象时,需要对顶面数据集做融合处理,融合方法参考博文一。

      修改后整体效果如下图所示:

你可能感兴趣的:(.net,优化,数据,supermap)