# generative-toolbelt.triangle

```A set of functions to create, manage, and draw Triangles.
Triangles are sets with three Points like this: {:a {:x 100 :y 100} :b {:x 100 :y 100} :c {:x 100 :y 100}}.```

`(add-point-to-triangles triangles point)`
```Add a point to the triangulated mesh.
Takes a list of Triangles and a Point.
Returns a list of Triangles.```

### bounds

`(bounds points)`
```Returns the bounding rectangle Point from a list of Points.
Returns a vector of 4 Points.```

### circumscribe-triangle

`(circumscribe-triangle {:keys [a b c]})`
```Calculates a special Circle structure that circumscribe a Triangle.
NOTE: The Circlo structure that this function returns is different from generative-toolbelt.circle/make-circle since it has been optimize for the triangulation function.
Returns a special Circle structure.```

### contains-point?

`(contains-point? {:keys [x y radius-squared]} point)`
```Checks if a Point is inside the special Circle structure or not.
Returns a boolean.```

### draw-triangle

`(draw-triangle {:keys [a b c]} & [drawOptions])`
```Draws a Triangle into the current graphics canvas.
```

### draw-triangles

`(draw-triangles triangles & [drawOptions])`
```Draws a sequence of Triangles into the current graphics canvas.
Slightly faster than draw-triangle when a lot of triangles needs to be drawn with the same `drawOptions`.```

### edges

`(edges {:keys [a b c]})`
```Scompose a Triangle into a vector of Lines.
```

### get-triangle-guide

`(get-triangle-guide tri)`
```Gets an alternative form of the Triangle structure that tells where the longest side is and what are its opposite sides.
```

### is-from-bounds?

`(is-from-bounds? boundSet {:keys [a b c]})`
```Checks if a Triangle is on a bounding box or not.
Returns a boolean.```

### make-new-triangles

`(make-new-triangles containers point)`
```Creates new Triangles from a list of Triangles and a Point.
Returns a list of Triangles.```

### make-triangle

`(make-triangle a b c)`
```Creates a Triangle with three Points.
Returns a Triangle.```

### mktr

`(mktr ax ay bx by cx cy)`
```Creates a Triangle with canvas-relative coordinates.
Returns a Triangle.```

### move-triangle-by

`(move-triangle-by tri vect)`
```Translate a Triangle by a certain distance Vector.
Returns a new Triangle.```

### outer-edges

`(outer-edges triangles)`
```Gets the outer edges of a list of Triangles.
Returns a list of Lines.```

### split-recursive

`(split-recursive t depth maxdepth oddsToSplit)`
```Recursivly splits a Triangle based on the current recursion depth and the odds to get split.
`t` is a Triangle.
`depth` is the current recursion step.
`maxdepth` is the target recursion level.
`oddsToSplit` is a 0-1 float indicating the odds to get split.
Returns a non-flattened list of Triangles.```

### split-triangle

`(split-triangle tri)`
```Splits a Triangle by its longest side, creating two new Triangles.
Returns a list of two Triangles.```

### triangle-centroid

`(triangle-centroid tri)`
```Calculate the centroid of a Triangle.
Returns a Point.```

### triangle-subdivision

`(triangle-subdivision triangles maxdepth oddsToSplit)`
```Split a list of Triangles recursively.
`maxdepth` is the maximum depth level we want to reach with the recursion.
`oddsToSplit` is a 0-1 float indicating the odds to get split.
Returns a flattened list of Triangles.```

### triangulate

`(triangulate points)`
```Creates a triangulated mesh from a list of Points.
Full explanation paper here: http://paulbourke.net/papers/triangulate/
Returns a list of Triangles.```