# 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 );
}
}
```