This document is archived and information here might be outdated. Recommended version. |
Returns the first point of intersection between the ray and the target geometry. The point is set empty if there is no intersection.
[Visual Basic .NET] Public Sub QueryFirstIntersection ( _ ByVal targetGeometry As IGeometry, _ ByVal intersectionPoint As IPoint _ )
[C#] public void QueryFirstIntersection ( IGeometry targetGeometry, IPoint intersectionPoint );
[C++]
HRESULT QueryFirstIntersection(
IGeometry* targetGeometry,
IPoint* intersectionPoint
);
[C++] Parameters targetGeometry
targetGeometry is a parameter of type IGeometry* intersectionPoint
intersectionPoint is a parameter of type IPoint*
Implemented for Points, Multipoints, Polylines, Polygons, Envelopes, and Multipatches.
This method is intended to be called against top-level geometries only (Point, Multipoint, Polyline, Polygon, Envelope, MultiPatch). To call this method against a Segment/Path or Ring, first add the part to a Polyline or Polygon container, respectively, and then call this method against the container.
If a Ray intersects an Envelope and is located within the bounds of the Envelope, the result of QueryFirstIntersection will be the point closest to the Ray origin along the Ray, located on the exterior of the Envelope at which an intersection takes place.
public static void QueryFirstIntersection()
{
ILine line = new LineClass();
line.FromPoint = GetPoint();
line.ToPoint = GetPoint();
IRay 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);
IGeometry multiPatchGeometry = GetMultiPatchGeometry();
IPoint firstIntersectionPoint = new PointClass();
ray.QueryFirstIntersection(multiPatchGeometry, firstIntersectionPoint);
//firstIntersectionPoint = (5, -2.13, 0.092)
}
private static IPoint GetPoint()
{
const double Min = -10;
const double Max = 10;
Random random = new Random();
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;
}