# Ellipse

Martin McBride, 2020-08-26
Tags geometry ellipse arc sector segment
Categories generativepy generative art The `Ellipse` class draws ellipses, arcs, sectors and segments.

An ellipse is similar to a circle, but it has two radii, one in the x direction and one in the y direction.

There is also a `ellipse` function that just creates a ellipse as a new path.

## Ellipse class methods

The `Ellipse` class inherits `add`, `fill`, `stroke`, `fill_stroke`, `path`, `clip` and other methods from Shape.

• as_arc
• as_sector
• as_segment

Creates a ellipse based on the centre point and the two radii.

```of_center_radius(center, radius_x, radius_y)
```
Parameter Type Description
center (number, number) A tuple of two numbers, giving the (x, y) position of the centre of the ellipse.

### as_arc

Modifies a ellipse, to show only an arc. An arc is part of the circumference of the ellipse.

```as_arc(start_angle, end_angle)
```
Parameter Type Description
start_angle number A number, giving the start angle of the arc
end_angle number A number, giving the end angle of the arc

This is used as a modifier with `of_center_radius`, to draw just an arc. To draw an arc use:

```Ellipse(ctx).of_center_radius((0, 0), 1).as_arc(0, 1).stroke(Color('black'), 0.1)
```

Angles are measured in radians. Angle zero lies along the positive x-axis, and the angle increases in the clockwise direction - note that this is opposite to the normal mathematical convention, where angle increases in the counterclockwise direction. The difference is due to the fact that y increases as you move down the image in generativepy.

If you are using a flipped coordinate system (see the `setup` function in the drawing module), the angle increases in the counterclockwise direction.

Since an arc is a line, you should normally use the `stroke` method to draw it. If you attempt to fill the arc, it will fill it as if it was a segment.

### as_segment

Modifies a ellipse, to show only a segment. An segment is the part of the ellipse that is cut off by a chord.

```as_segment(start_angle, end_angle)
```

This function works in a similar way to the `as_arc` function, but it includes the area of the segment. You can fill or stroke the area, see the example below.

### as_sector

Modifies a ellipse, to show only a sector. An sector is a "pizza slice", like you would use in a pie chart,.

```as_sector(start_angle, end_angle)
```

This function works in a similar way to the `as_arc` function, but it includes the area of the sector. You can fill or stroke the area, see the example below.

## ellipse function

Adds a ellipse as a new path, without the need to create a `Ellipse` object in code.

```ellipse(ctx, center, radius)
```
Parameter Type Description
ctx Context The Pycairo Context to draw to
center (number, number) A tuple of two numbers, giving the (x, y) position of the centre of the ellipse.

The `ellipse` function doesn't allow you to create arcs, segments or sectors.

## Example

Here is some example code that draws ellipses using the class and the utility function. The full code can be found on github.

```from generativepy.drawing import make_image, setup
from generativepy.color import Color
from generativepy.geometry import Ellipse, ellipse

'''
Create ellipses using the geometry module.
'''

def draw(ctx, width, height, frame_no, frame_count):
setup(ctx, width, height, width=5, background=Color(0.8))

# The ellipse function is a convenience function that adds a ellipse as a new the path.
# You can fill or stroke it as you wish.
ellipse(ctx, (1, 1), 0.7, 1.1)
ctx.set_source_rgba(*Color(1, 0, 0))
ctx.fill()

# Ellipse objects can be filled, stroked, filled and stroked.
Ellipse(ctx).of_center_radius((2.5, 1), 0.7, 0.3).fill_stroke(Color(0, 0, 1), Color(0), 0.05)
Ellipse(ctx).of_center_radius((4, 1), 0.7, 0.3).as_arc(0, 1).stroke(Color(0, 0.5, 0), 0.05)

Ellipse(ctx).of_center_radius((1, 2.5), 0.7, 0.3).as_sector(1, 3).stroke(Color('orange'), 0.05)