Editing Revolve

From BRL-CAD

Warning: You are not logged in. Your IP address will be publicly visible if you make any edits. If you log in or create an account, your edits will be attributed to your username, along with other benefits.

The edit can be undone. Please check the comparison below to verify that this is what you want to do, and then save the changes below to finish undoing the edit.
Latest revision Your text
Line 1: Line 1:
{{DesignDocument}}
 
 
 
= Overview =
 
= Overview =
  
A solid of revolution can be described by its axis of revolution (point & vector), an angle (-2*pi, 2*pi), and a 2D sketch coplanar with the axis of revolution.  The start and end surfaces will be planes, and a positive angle is counterclockwise rotation.  There are several options for how to specify the start and end planes. Starseeker suggests using:
+
A solid of revolution can be described by its axis of revolution (point & vector), an angle (-2*pi, 2*pi), and a 2D sketch coplanar with the axis of revolution.  The start and end surfaces will be planes, and a positive angle is counterclockwise rotation.
* a vector 'r' such that <axis> x <r> = direction of revolution
 
* an angle
 
 
 
In order to analytically solve for the ray/shape intersection points, the sketch must be limited to splines of at most second order.
 
  
 
= Internal Representation =
 
= Internal Representation =
 
+
'''Open questions:'''
struct rt_revolve_internal:
+
* What is a 2D sketch?
* point_t V3D;
 
* vect_t  axis3D;
 
* point2d_t V2D;
 
* vect2d_t  axis2D
 
* vect_t  r;
 
* fastf_t angle;
 
* char *sketch_name;
 
* struct rt_sketch_internal *sk;
 
 
 
''Questions:''
 
Should the sketch be restricted to revolve about its y-axis, or should I allow for an arbitrary point & axis defined in the sketch plane (*2D)?
 
If yes, the sketch would undergo a rotation/translation - is rotation/translation of a sketch already possible? If it is possible, then restricting to the y-axis will not limit the user.
 
  
 
= General Algorithms =
 
= General Algorithms =
Line 29: Line 11:
 
== rt_rev_shot() - ray intersection ==
 
== rt_rev_shot() - ray intersection ==
  
 +
#Check the ray against the bounding cylinder to quickly exit for rays that are clearly non-intersecting. <br/> '''Or is it better to use the enclosing rpp (not so exact but faster)? Will this be done automatically?'''
 
#If (angle != 2*pi) check against the start and end surfaces.
 
#If (angle != 2*pi) check against the start and end surfaces.
##Find the parameter values for the intersection of the ray with the start/end surfacesThese two plane intersections will give the bounds on the parameter for intersections. In some cases, there will only be an upper or lower bound.
+
##Check original ray against start surface
##Check if the plane intersection point(s) are inside the 2D sketch.
+
##Transform ray (rotate about Z-axis) by -(angle), and check against start surface(Or store the end surface seperately to avoid the ray transformation.) <br/> '''Alternatively: Check the ray against the planes at the start and the end (this gives us one intersection point for each plane (in general )). Look if these points are inside the 2D sketches.'''
 
#For the revolved portion:
 
#For the revolved portion:
 
##Flatten out the intersection to 2D (ignore theta): ray becomes hyperbola in the r-z plane (parameterized- use same variable for length along ray as length along hyperbola to keep mapping from 3D to 2D)
 
##Flatten out the intersection to 2D (ignore theta): ray becomes hyperbola in the r-z plane (parameterized- use same variable for length along ray as length along hyperbola to keep mapping from 3D to 2D)
##Check the hyperbola's path against the 2D revolve outline. Find the parameter values at the intersection points.
+
##Check the hyperbola's path against the 2D revolve outline. Find the parameter values at the intersection points. <br/> '''Of what degree is this problem? Should we limit the 2D sketch to a spline of at most degree 2 curves to keep the degree small?'''
##Check the parameter value against the bounds determined in 1.1.
+
##Use the parameters from (2) in the ray equation to find the actual (3D) intersection point.
 +
##Using the actual 3D intersection point, find theta for the hitpoint on the original primitive in local cylindrical coordinates. Check to ensure that the angle of the point from (3) is between (0, revolve angle).
  
 
== rt_rev_norm() - surface normals @ hitpoint ==
 
== rt_rev_norm() - surface normals @ hitpoint ==
Line 67: Line 51:
 
This would create a partial revolve (angle < 2*pi) with a 3D shape where the maximum outline does not fall in a r-z plane.  A 2D example of this is revolving an ellipse with focii at (4,1) and (6, -1) about the z axis.  For this case, the minimum radius and maximum radius do not occur along the same plane.  If the end cap method (above) was used, there would be an abrubt transition from the ellipse to the revolved body.
 
This would create a partial revolve (angle < 2*pi) with a 3D shape where the maximum outline does not fall in a r-z plane.  A 2D example of this is revolving an ellipse with focii at (4,1) and (6, -1) about the z axis.  For this case, the minimum radius and maximum radius do not occur along the same plane.  If the end cap method (above) was used, there would be an abrubt transition from the ellipse to the revolved body.
  
This feature can best be implemented by using a sweep along a circular path, because the sweep primitive will need to handle this end condition for sweeping any other general 3D primitive.  This approach minimizes code duplication, and keeps the revolve primitive focused specifically on revolving.
+
This feature can best be implemented by using a sweep along a circular path, becasue the sweep primitive will need to handle this end condition for sweeping any other general 3D primitive.  This approach minimizes code duplication, and keeps the revolve primitive focused specifically on revolving.

Please note that all contributions to BRL-CAD may be edited, altered, or removed by other contributors. If you do not want your writing to be edited mercilessly, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource (see BRL-CAD:Copyrights for details). Do not submit copyrighted work without permission!

To edit this page, please answer the question that appears below (more info):

Cancel Editing help (opens in new window)

Template used on this page: