Data from Ellipses

This guide discusses ellipses and their representation in openNURBS.

Problem

You have drawn an ellipse in Rhino, using the Ellipse command. While reading the .3dm file, using openNURBS, the ellipse is classified as as ON::curve_object. How does one get the ellipse’s construction data, such as center point, major and minor axes, etc?

Solution

Unlike some curve types (e.g. Lines, Arcs, Polylines, etc.) which have their own ON_Curve-derived classes, there is no special class that is used to represent elliptical curves. Ellipses and elliptical arcs are simply NURBS, or ON_NurbsCurve, curves.

To test to see if a curve is an ellipse or an elliptical arc, first try to cast the ON_Curve object as an ON_NurbsCurve object. If successful, then use ON_NurbsCurve::IsEllipse() to verify the NURBS curve is an ellipse and to obtain its construction data.

Sample

ONX_Model model;

//...

const ON_Curve* curve = //...;

//...

const ON_NurbsCurve* nurb = ON_NurbsCurve::Cast( curve );
if( nurb )
{
  ON_Ellipse ellipse;
  double tolerance = model.m_settings.m_ModelUnitsAndTolerances.m_absolute_tolerance;
  bool rc = nurb->IsEllipse( 0, &ellipse, tolerance );
  if( rc )
  {
    // Center
    ON_3dPoint origin = ellipse.plane.origin;

    // Major and minor axes
    ON_3dVector xaxis = ellipse.radius[0] * ellipse.plane.xaxis;
    ON_3dVector yaxis = ellipse.radius[1] * ellipse.plane.yaxis;

    // Quad points
    ON_3dPoint p0( origin - xaxis );
    ON_3dPoint p1( origin + xaxis );
    ON_3dPoint p2( origin - yaxis );
    ON_3dPoint p3( origin + yaxis );

    // Foci
    ON_3dPoint f1, f2;
    ellipse.GetFoci( f1, f2 );
  }
}