美文网首页
SuperMap iObjects .NET 制作2.5D数据详

SuperMap iObjects .NET 制作2.5D数据详

作者: SuperMap技术控 | 来源:发表于2022-01-21 14:12 被阅读0次

    >作者:为梦齐舞

    阅读本博文前,建议先浏览“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数据详

          本文链接:https://www.haomeiwen.com/subject/cfmehrtx.html