I am interested in finding the intersection of a Ray and a Surface in ArcObjects.

I already know of two solutions. First solution is to use the Locate method of ISurface:

Dim intersectionPoint As IPoint = surface.Locate(ray, hint)

The other solution is to use the GetLineOfSight method of IGeoDatabaseBridge (where the variable point is a calculated point along the path of the ray):

Dim geoDatabaseBridge2 As IGeoDatabaseBridge2 = New GeoDatabaseHelper
geoDatabaseBridge2.GetLineOfSight(surface, baseRay.Origin, point, intersectionPoint, Nothing, Nothing, Nothing, False, False)

Surprisingly, the GetLineOfSight method is much faster than the locate method. But I am looking for an even faster solution.

So my question is: Is there any other (and faster) ways to find the intersection between a ray and a surface? Or can you point me in the direction of literature that explains the calculations I need to roll my own?


UPDATE: I have started the process of creating my own Line of Sight algorithm. I have posted my current solution description in a blog post. Thanks again for all of the suggestions.

  • Is your surface based on a TIN or raster? – Kirk Kuykendall Jun 28 '11 at 13:10
  • The surface is based on a raster – Chris Jun 28 '11 at 13:11
  • 1
    Are you wanting to stick with ArcObjects? If not, have you searched for using GPU for line of sight? – Kirk Kuykendall Jun 28 '11 at 13:18
  • I would prefer to stick with ArcObjects. But if ArcObjects can't do it, I'll look for other options. – Chris Jun 28 '11 at 13:20
  • 1
    @Chris Small things make big differences. Different approaches may be best if (a) all lines of sight emanate from the same point and use the same DEM; (b) different DEMs are used; (c) a single DEM is used and all lines of sight lie above a common point; (d) there are known bounds on the slopes of the DEM; etc. It would therefore help for you to disclose more about what you really want to accomplish and some details about the nature of the surface and these rays. – whuber Jun 28 '11 at 13:48

If you really want to roll your own, it sounds like you may need a ray caster/ray tracer. A ten year old paper describes the state of the art (back then): you have to convert the surface to a TIN and create a 3D data structure (the authors propose a BSP tree of voxels) to expedite finding the intersections. Maybe you could get hold of a ray tracing engine and deploy it.

  • Thanks for the information. This will come in handy when/if I have to roll my own to meet my requirements. – Chris Jun 29 '11 at 14:54
  • @Chris In a series of comments, @Dan S. gives useful advice and analysis concerning ray-casting. – whuber Jun 29 '11 at 16:53

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.