# Drawing

## 2D primitives

`const {line, arc, circle, ellipse, rectangle} = jscad.primitives;`

2D primitives are often a good start. You can use extrusion and expansion commands, to turn 2D shapes into 3D bodies (see below).

A documentation of all primitives can be found here.

## Line

The line command takes two arrays of two numbers each:

`const shape = line([`

[x1, y1],

[x2, y2]

]);

You can also pass an array with more points to create a path.

## Arc

The arc also produces a line and works similar to the p5js arc function:

`const shape = arc({`

center: [0, 0],

radius: 1,

startAngle: 0,

endAngle: Math.PI * 2, //full arc

segments: 32 // level of detail

});

Most properties in JSCAD are optional and have a default value, so you only need to provide the ones you really need.

## Circle

`const shape = circle({`

center: [0, 0],

radius: 1,

startAngle: 0,

endAngle: Math.PI * 2, //full arc

segments: 32 // level of detail

});

Circle looks exactly like arc, the important difference is, that arc returns a line and circle a polygon.

## Ellipse

Circle and ellipse take similar parameters, radius is an array for ellipse, defining the radius on x and y axis:

`const shape = ellipse({`

center: [0, 0],

radius: [1,1],

startAngle: 0,

endAngle: Math.PI * 2, //full arc

segments: 32 // level of detail

});

Most round features, like ellipses, spheres or rounded corners, have a segment parameter. This defines the level of detail of curves. More segments lead to rounder curves, but also more complex objects (bigger files, longer rendering times, etc.).

## Rectangle

`const shape = rectangle({`

size: [2, 2],

center: [0, 0, 0]

});

## 3D-Primitives

`const {cube, sphere, cylinder} = jscad.primitives;`

A documentation of all primitives can be found here.

## Cube

`const shape = cube({`

size: 1,

center: [0, 0, 0]

});

### Sphere

`const shape = sphere({`

radius: 1,

center: [0, 0, 0]

});

### Cylinder

`const shape = cylinder({`

center: [0, 0, 0],

height: 2,

radius: 1,

segments: 32

});

There are a few more 3D primitives to explore, examples for how to construct them are included in the boilerplate:

### Task: Getting used to JSCAD

Explore the various 2D and 3D elements JSCAD provides, experiment with the various properties and see how it affects the output.