This document is archived and information here might be outdated. Recommended version. |
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;
}