# Circle

A circle is magical when 3D modeling. If you know what a circle can be composed of, you'll get many brilliant inspirations. So, what is a circle?

# `\$fn`

According to Circle from Wikipedia, a circle is the set of all points in a plane that are at a given distance from the center.

These points are infinite, so it's impossible to draw a perfect circle. You can just make a circle almost perfect. What does it mean? When invoking the `circle` module of OpenSCAD, you can specify a `\$fn` parameter. The code and figures shown below demonstrate what effects of `\$fn` is.

``````radius = 100;
`````` One way to draw a circle is moving forward a little, rotating a particular degree, and repeating these two steps several times. That is making a regular polygon. However, if `\$fn` is small, such as 12 or less, it surely looks like a regular polygon. Nevertheless, if `\$fn` is 24 or more, the regular polygon is more like a circle. The bigger `\$fn`, the closer to a perfect circle. For human vision, `\$fn = 96` is basically enough to look like a circle.

# Drawing a circle

Could we draw a circle without using the built-in `circle` module? Yes. Similarly, you have to specify how many sides the circle has.

``````radius = 50;
fn = 96;
thickness = 2;

PI = 3.14159;
circumference = 2 * PI * radius;
length = circumference / fn;
angle_step = 360 / fn;
for(i = [0 :  angle_step : 360 - angle_step]) {
rotate(i)
square([length, thickness], center = true);
}
}

`````` The code demonstrates a way to draw a circle. It leverages the `square` module to draw several thin squares which look like lines. However, if you room out the circle, you will see small gaps between lines.

# The `polygon` module

You may leverage the `polygon` module to build a circle. It accepts a list of `[x, y]` coordinates to create a multi-sided shape.

``````radius = 50;

PI = 3.14159;
circumference = 2 * PI * radius;
length = circumference / fn;
angle_step = 360 / fn;
polygon(
[
for(i = [0 :  angle_step : 360 - angle_step])
]
);
}

``````

The code creates the same models as shown in the first figure. You can see a code fragment in it.

``````[
for(i = [0 :  angle_step : 360])
]
``````

The syntax is List Comprehension which is common in Functional programming. It looks kind of a loop. Every time `[radius * cos(i), radius * sin(i)]` is evaluated, you get a `[x, y]`. All `[x, y]` are collected so when the list comprehension finishes, you get `[[50, 0], [25, 43.3013], [-25, 43.3013], [-50, 0], [-25, -43.3013], [25, -43.3013], [50, 0]]`. The list is passed into the `polygon` module. It takes a point sequentially and draws a multiple sided shape.

Why do we use `[radius * cos(i), radius * sin(i)]`? It's just a simple calculation of trigonometric functions. # Using triangles

A circle ring may be composed of lines. How about a solid circle? As shown above, one way is using the `polygon` module. Can any other shape form a circle? Well, we can use triangles. Now that, we can use the following code to draw a circle.

``````radius = 50;

PI = 3.14159;
circumference = 2 * PI * radius;
length = circumference / fn;
angle_step = 360 / fn;
for(i = [0 : angle_step : 360 - angle_step]) {
rotate(i)
polygon([
[0, 0],
]);
}
}

# `\$fa` and `\$fs`
For example, a circle needs many triangles if the vertex angle of the triangle is small. You can use `\$fa` to control the vertex angle when invoking the `circle` module. Even more, if the base of the triangle is small, the circle needs many triangles. The length of the base is controlled by `\$fs`. In most situations, we'll use `\$fn`. You can, however, take `\$fa` or `\$fs` into consideration when controlling faces precisely is necessary. For more information about this, take a look at OpenScad circle calculations.