This document is archived and information here might be outdated.  Recommended version.


IRay2.QueryPlaneIntersection Method (ArcObjects .NET 10.4 SDK)
ArcObjects Library Reference (Geometry)  

IRay2.QueryPlaneIntersection Method

Returns the point of intersection between the ray and the target plane. The point is set empty if there is no intersection.

[Visual Basic .NET]
Public Sub QueryPlaneIntersection ( _
    ByRef pPlaneNormal As WKSPointZ, _
    ByVal D As Double, _
    ByVal pPoint As IPoint _
)
[C#]
public void QueryPlaneIntersection (
    ref WKSPointZ pPlaneNormal,
    ref double D,
    ref IPoint pPoint
);
[C++]
HRESULT QueryPlaneIntersection(
  _WKSPointZ* pPlaneNormal,
  double D,
  IPoint* pPoint
);
[C++]

Parameters pPlaneNormal [in]
pPlaneNormal is a parameter of type _WKSPointZ D [in] D is a parameter of type double pPoint
pPoint is a parameter of type IPoint

Product Availability

Available with ArcGIS Engine, ArcGIS Desktop, and ArcGIS Server.

Description

Given a plane represented by a point lying in the plane (IPoint pointInPlane) and a vector normal to the plane (IVector3D normalToPlane):

·         pPlaneNormal represents the X, Y, and Z components of the normal vector packed into a WKSPointZ struct:

            WKSPointZ pPlaneNormal=new WKSPointZ();

            pPlaneNormal.X=normalToPlane.XComponent;

            pPlaneNormal.Y=normalToPlane.YComponent;

            pPlaneNormal.Z=normalToPlane.ZComponent;

 

·         D represents the dot product of the normal vector and a vector whose X, Y, and Z components are set to the X, Y, and Z coordinates of the point lying in the plane:


           
IVector3D vector3D=new Vector3DClass();
            vector3D.SetComponents(
                  pointInPlane.X, pointInPlane.Y, pointInPlane.Z
            );


            double D=normalToPlane.DotProduct(vector3D);

·         pPoint represents the point of intersection, and should be set to a new instance of the PointClass() before it is passed to the method:

                                IPoint point=new PointClass();

[C#]

 

        public static void QueryPlaneIntersection()

        {

            int seed=DateTime.Now.Millisecond;

 

            Random random=new Random(seed);

 

            IRay2 ray=GetRay(GetLine(GetPoint(random), GetPoint(random)));

 

            IRay planePackedAsRay=GetRay(GetLine(GetPoint(random), GetPoint(random)));

 

            WKSPointZ wksPointZ;

            double distance;

 

            ConstructPlaneParameters(planePackedAsRay.Vector, planePackedAsRay.Origin, out wksPointZ, out distance);

 

            IPoint intersectionPoint=new PointClass();

 

            ray.QueryPlaneIntersection(ref wksPointZ, distance, intersectionPoint);

 

            //intersectionPoint=(-6, -0.913, -7.289)

        }

 

        private static void ConstructPlaneParameters(IVector3D vector3D, IPoint point, out WKSPointZ wksPointZ, out double distance)

        {

            wksPointZ=ConstructWKSPointZ(vector3D);

            distance=vector3D.DotProduct(ConstructVector3D(point.X, point.Y, point.Z));

        }

 

        private static WKSPointZ ConstructWKSPointZ(IVector3D vector3D)

        {

            WKSPointZ wksPointZ=new WKSPointZ();

            wksPointZ.X=vector3D.XComponent;

            wksPointZ.Y=vector3D.YComponent;

            wksPointZ.Z=vector3D.ZComponent;

 

            return wksPointZ;

        }

 

        private static IRay2 GetRay(ILine line)

        {

            IRay2 ray=new RayClass();

            ray.Origin=line.FromPoint;

            ray.Vector=ConstructVector3D(line.ToPoint.X - line.FromPoint.X, line.ToPoint.Y - line.FromPoint.Y, line.ToPoint.Z - line.FromPoint.Z);

 

            return ray;

        }

 

        private static ILine GetLine(IPoint fromPoint, IPoint toPoint)

        {

            ILine line=new LineClass();

            line.FromPoint=fromPoint;

            line.ToPoint=toPoint;

 

            return line;

        }

 

        private static IPoint GetPoint(Random random)

        {

            const double Min=-10;

            const double Max=10;

 

            double x=Min + (Max - Min) * random.NextDouble();

            double y=Min + (Max - Min) * random.NextDouble();

            double z=Min + (Max - Min) * random.NextDouble();

 

            IPoint point=ConstructPoint3D(x, y, z);

 

            MakeZAware(point as IGeometry);

 

            return point;

        }

 

        private static IPoint ConstructPoint3D(double x, double y, double z)

        {

            IPoint point=ConstructPoint2D(x, y);

            point.Z=z;

 

            return point;

        }

 

        private static IPoint ConstructPoint2D(double x, double y)

        {

            IPoint point=new PointClass();

            point.PutCoords(x, y);

 

            return point;

        }

        private static void MakeZAware(IGeometry geometry)

        {

            IZAware zAware=geometry as IZAware;

            zAware.ZAware=true;

        }

 

        public static IVector3D ConstructVector3D(double xComponent, double yComponent, double zComponent)

        {

            IVector3D vector3D=new Vector3DClass();

            vector3D.SetComponents(xComponent, yComponent, zComponent);

 

            return vector3D;

        }

 

 

See Also

IRay2 Interface