博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

ArcEngine开发判断3D模型之间的关系(转载)

Posted on 2014-07-08 14:04  张冰  阅读(319)  评论(0)    收藏  举报

来源:http://blog.csdn.net/jixg1800/article/details/8232689

ArcEngine开发判断3D模型之间的关系

 

1、可以通过IRelationalOperator3D接口的Disjoint3D方法查看两个模型是否有相交的地方,C#示例代码如下

public  static  void  TestIntersection()

{

        IGeometry  polylineGeometry = GetPolylineGeometry();
        IGeometry  polygonGeometry = GetPolygonGeometry();

        IRelationalOperator3D  relationalOperator3D = polylineGeometryasIRelationalOperator3D;
        bool intersect = !(relationalOperator3D.Disjoint3D(polygonGeometry));
        //intersect = true

}

新的IRelationalOperator3D2接口增加了IsNear3D方法,可以判断模型一定距离之内是否有其他的模型;

2、判断两个模型之间的距离可以通过IProximityOperator3D接口实现,C#示例代码返回最近的点

public  static  void  ReturnNearestPoint3D()

{

        IGeometry  pointGeometry = GetPointGeometry();
        IGeometry  envelopeGeometry = GetEnvelopeGeometry();
        IProximityOperator3D  proximityOperator3D = envelopeGeometry  as  IProximityOperator3D;
        IPoint  nearestPoint3D= proximityOperator3D.ReturnNearestPoint3D(pointGeometry as  IPoint, esriSegmentExtension.esriNoExtension);
        //nearestPoint3D = (5.393, -0.583, -6.043)

}

public static void QueryNearestPoint3D()
{

        IGeometry pointGeometry = GetPointGeometry();
        IGeometry envelopeGeometry = GetEnvelopeGeometry();
        IProximityOperator3DÂ proximityOperator3D = envelopeGeometry as IProximityOperator3D;
        IPoint nearestPoint3D = new PointClass();
        proximityOperator3D.QueryNearestPoint3D(pointGeometry as IPoint, esriSegmentExtension.esriNoExtension, nearestPoint3D);
        //nearestPoint3D =Â (5.393, -0.583, -6.043)
}

C#示例返回最近距离

public  static  void  ReturnDistance3D()

{

        IGeometry  pointGeometry = GetPointGeometry();
        IGeometry  envelopeGeometry = GetEnvelopeGeometry();
        IProximityOperator3D proximityOperator3D = envelopeGeometry as IProximityOperator3D;
        double distance3D = proximityOperator3D.ReturnDistance3D(pointGeometry);
        //distance3D = 13.971

}

3、获取3D模型直接相交或者合并的部分可以通过IEnvelope3D实现;该接口实现的只是相交或合并的最大和最小范围;

C#中相交代码如下

publicstaticvoid TestIntersect3D()

{

        IGeometry envelopeGeometry1 = GetEnvelopeGeometry1();

        IGeometry envelopeGeometry2 = GetEnvelopeGeometry2();

        IEnvelope3D envelope3D = envelopeGeometry1 asIEnvelope3D;

        envelope3D.Intersect3D(envelopeGeometry2 asIEnvelope);

}

C#中合并代码如下

publicstaticvoid TestUnion3D()

{

        IGeometry envelopeGeometry1 = GetEnvelopeGeometry1();

        IGeometry envelopeGeometry2 = GetEnvelopeGeometry2();

        IEnvelope3D envelope3D = envelopeGeometry1 asIEnvelope3D;

        envelope3D.Union3D(envelopeGeometry2 asIEnvelope);

}

 

以上