This document is archived and information here might be outdated. Recommended version. |
ArcObjects namespaces > Geometry > ESRI.ArcGIS.Geometry > Interfaces > IR > IRay2 Interface > IRay2.QueryPlaneIntersection Method (ArcObjects .NET 10.4 SDK) |
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
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();
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;
}