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