zoukankan      html  css  js  c++  java
  • SceneControl中绘制面的思考过程

      如何在SceneControl中绘制面?目前好像没有找到相关的代码,我的目的是在ArcScene中显示垂直剖切的剖面,但是面要素类不可以是垂直的!所以只有借助Multipatch了。绘制面这个功能在ArcScene中已经实现了,在ArcScene中获得点是基于现有的面或者要素相交得到的。并不是很好用。绘制面的时候点击产生一系列点,最后双击得到需要的面。开始我以为是采用了某种Delaunay三角化的方法,但是后来觉得似乎并非如此。查对象模型图看到Multipatch包含的类型有三种:TriangleStrip、Ring和TriangleFan。TriangleStrip以前绘制巷道时用过,但是Ring和TriangleFan没有用过。是不是这个Ring的功能呢?Ring继承自Path,Polygon也是有多个Ring组成的。看来有门!

    查看AE的示例程序,感觉Ring完全可以满足我的要求,把面要素转成Multipatch!不过这个Ring自身是如何构建的确实是个问题!是属于Mesh(网格,网眼)构模的内容吗?等一下贴出自己讲二维剖面转换为三维剖面的代码!

    补充代码:

    View Code
     1  IQueryFilter pQueryfilter = new QueryFilterClass();
     2             IFeatureCursor featCursor = pInPolygonFClass.Search(null, true);
     3             IFeature feat=featCursor.NextFeature();
     4             while (feat != null)
     5             {
     6                 if (feat.Shape.GeometryType == esriGeometryType.esriGeometryPolygon)
     7                 {
     8                     IGeometryCollection multiPatchGeometryCollection = new MultiPatchClass();
     9                     IMultiPatch multiPatch = multiPatchGeometryCollection as IMultiPatch;
    10                     IPolygon4 polygon = feat.Shape as IPolygon4;
    11                     //IPolygon4.ExteriorRingBag should be used instead of IPolygon.QueryExteriorRings,
    12                     //which does not work in .NET because of C-Style Arrays
    13                     IGeometryBag exteriorRings = polygon.ExteriorRingBag;
    14                     //For each exterior rings find the number of interior rings associated with it and print it
    15                     IEnumGeometry exteriorRingsEnum = exteriorRings as IEnumGeometry;
    16                     exteriorRingsEnum.Reset();
    17                     IRing currentExteriorRing = exteriorRingsEnum.Next() as IRing;
    18 
    19                     int counter = 1;
    20                     while (currentExteriorRing != null)
    21                     {
    22                         IRing ExteriorRing3d = ProfileUtility.Ring_3D_2D_Manual(currentExteriorRing, m_U_Matrix, 0, 1);
    23                         multiPatchGeometryCollection.AddGeometry(ExteriorRing3d as IGeometry, ref _missing, ref _missing);
    24 
    25                         multiPatch.PutRingType(ExteriorRing3d, esriMultiPatchRingType.esriMultiPatchOuterRing);
    26                         //IPolygon4.get_InteriorRingBag should be used instead of IPolygon.QueryInteriorRings,
    27                         //which does not work in .NET because of C-Style Arrays
    28                         IGeometryBag interiorRings = polygon.get_InteriorRingBag(currentExteriorRing);
    29                         IEnumGeometry interiorRingsEnum = interiorRings as IEnumGeometry;
    30                         interiorRingsEnum.Reset();
    31                         IRing currentinteriorRing = interiorRingsEnum.Next() as IRing;
    32                         while (currentinteriorRing != null)
    33                         {
    34                             IRing interiorRing3d = ProfileUtility.Ring_3D_2D_Manual(currentinteriorRing, m_U_Matrix, 0, 1);
    35                             multiPatchGeometryCollection.AddGeometry(interiorRing3d as IGeometry, ref _missing, ref _missing);
    36 
    37                             multiPatch.PutRingType(interiorRing3d, esriMultiPatchRingType.esriMultiPatchInnerRing);
    38                             currentinteriorRing = interiorRingsEnum.Next() as IRing;
    39                         }
    40                         currentExteriorRing = exteriorRingsEnum.Next() as IRing;
    41                         counter++;
    42                     }
    43                     IFeature pFeat = pClass.CreateFeature();
    44                     pFeat.Shape = multiPatchGeometryCollection as IGeometry;
    45                     pFeat.set_Value(2, feat.get_Value(0));
    46                     pFeat.Store();
    47                 }
    48                 feat = featCursor.NextFeature();
    49             }

     

    文章未经说明均属原创,学习笔记可能有大段的引用,一般会注明参考文献。 欢迎大家留言交流,转载请注明出处。
  • 相关阅读:
    STL::next_permutation();
    P2626 斐波那契数列(升级版)
    P1029 最大公约数和最小公倍数问题
    P1075 质因数分解
    4.7生日当天测
    cin,scanf,gets,getline,cin.getline对于字符串的输入
    两个互质的数不能凑出来的数证明
    简单的全排列问题(给初学者)
    紫书 例题 10-22 UVa 1640(数位统计)
    紫书 例题 10-21 UVa 11971(连续概率)
  • 原文地址:https://www.cnblogs.com/yhlx125/p/2614531.html
Copyright © 2011-2022 走看看