Geomagic :: Knowledge Base Nuggets - How can I use Python to project points to a plane?

Sandham's Flying Circus

Ping-Fu-exec

Beyond the Box

The news and stories from Geomagic that you don't find anywhere else.

Ping-Fu-exec

Sandham's Flying Circus

The crazy world of customizing Geomagic products

Ping-Fu-exec

The World is 3D

Seeing the world in 3D from Ping Fu

June 04, 2012

Knowledge Base Nuggets - How can I use Python to project points to a plane?

Lately I've been having to perform a lot of vector math...what fun.  Luckily the GPSE comes preloaded with helper functions and overloaded arithmetic operators.  Here's today's nugget...projecting points to a plane.

Q: How can I use Python to project points to a plane?

A: To project any point to a given plane, all that is needed is a plane to project to and a point to project.

Below is a short script that uses GPSE math objects to calculate a projected point from a given plane and point.  The script then creates feature to be added to the Model Manager or Graphics Scene.  The .project() call on the Plane object is the helper math function used to create the Vector3D position needed to build the PointFeature that is added to the scene, it is the heart of the solution:

myProjectedPointPos = myPlane.project( myPointPos )

Here is the script:

 

import geoappall
for m in geoappall.execStrings: exec m in locals(), globals()

#
# calculate the position
#

# the plane to project to using the Plane ( Direction, Origin ) construction method
pDir = Vector3D( 0.2344, 0.665, 0.11 )
pOrg = Vector3D( 0.0344, 1.456, 10.125 )
myPlane = Plane( pDir, pOrg )

# the position to project
myPointPos = Vector3D( 5.125, -2.45, 0.0125 )

# the projected position
myProjectedPointPos = myPlane.project( myPointPos )

#
# create the features
#
myPointFeature = PointFeature()
myPointFeature.name = u"myPoint"
myPointFeature.position = myPointPos

myProjectedPointFeature = PointFeature()
myProjectedPointFeature.name = u"myProjectedPoint"
myProjectedPointFeature.position = myProjectedPointPos

myPlaneFeature = PlaneFeature()
myPlaneFeature.name = u"myPlane"
myPlaneFeature.origin = pOrg
myPlaneFeature.normal = pDir
myPlaneFeature.uRange = Vector2D( -12, 12 )
myPlaneFeature.vRange = Vector2D( -12, 12 )


#
# add them to the World Object in the model manager (scene)
#
models = geoapp.getModels()
for model in models:
   # Find the world object and make it active.
   if model.name == "World":
      geoapp.setActiveModel(model)
      geoapp.addFeature( model, myPointFeature )
      geoapp.addFeature( model, myProjectedPointFeature )
      geoapp.addFeature( model, myPlaneFeature )