Update the README with triangulation and convex hull
This commit is contained in:
parent
4504f89d30
commit
08dbfc254f
1 changed files with 54 additions and 23 deletions
77
README.md
77
README.md
|
|
@ -1,65 +1,96 @@
|
||||||
Übergeekism
|
Übergeekism
|
||||||
===========
|
===========
|
||||||
|
|
||||||
This is an attempt at using as many as possible **cool** computer science stuff to produce a single image.
|
This is an attempt at using as many as possible **cool** computer science stuff
|
||||||
|
to produce a single image.
|
||||||
|
|
||||||
Algorithms may not be implemented in the most efficient manner, as the aim is to have elegant and simple code for
|
Algorithms may not be implemented in the most efficient manner, as the aim is to
|
||||||
educationnal purpose.
|
have elegant and simple code for educational purpose.
|
||||||
|
|
||||||
Until now, the following algorithms/data structure/concepts are used:
|
Until now, the following algorithms/data structure/concepts are used:
|
||||||
- the (logo) turtle,
|
- the (logo) turtle,
|
||||||
- Lindenmayer systems,
|
- Lindenmayer systems,
|
||||||
- Penrose tiling,
|
- Penrose tiling,
|
||||||
- Travelling salesman problem,
|
- travelling salesman problem,
|
||||||
- ant colony algorithm,
|
- ant colony algorithm,
|
||||||
- A\* shortest path,
|
- A\* shortest path,
|
||||||
|
- Delaunay triangulation,
|
||||||
|
- Bowyer-Watson algorithm,
|
||||||
|
- convex hull,
|
||||||
|
- Chan's algorithm,
|
||||||
- graph (adjacency list, adjacency matrix),
|
- graph (adjacency list, adjacency matrix),
|
||||||
- hash table.
|
- hash table.
|
||||||
|
|
||||||
The current code is written in Python.
|
The current code is written in Python.
|
||||||
|
|
||||||
|
|
||||||
Penrose tiling
|
Penrose graph
|
||||||
--------------
|
-------------
|
||||||
|
|
||||||
The main shape visible on the image is a Penrose tiling (type P3), which is a **non-periodic tiling** with an absurd level
|
The main shape visible on the image is a Penrose tiling (type P3), which is a
|
||||||
of coolness.
|
**non-periodic tiling** with an absurd level of coolness.
|
||||||
|
|
||||||
The edges are **recursively** built with a **Lindenmayer system**. Yes, it is capable of building a Penrose tiling if you
|
The edges are **recursively** built with a **Lindenmayer system**. Yes, it is
|
||||||
know which grammar to use. Yes, this is insanely cool.
|
capable of building a Penrose tiling if you know which grammar to use. Yes, this
|
||||||
|
is insanely cool.
|
||||||
|
|
||||||
The Lindenamyer system works by drawing edges one after another, we thus use a (LOGO) **turtle** to draw them.
|
The Lindenamyer system works by drawing edges one after another, we thus use a
|
||||||
|
(LOGO) **turtle** to draw them.
|
||||||
|
|
||||||
Because the L-system grammar is not very efficient to build the tiling, we insert edges in a data structure that
|
Because the L-system grammar is not very efficient to build the tiling, we
|
||||||
contains an unordered collection of unique element: a **hash table**.
|
insert edges in a data structure that contains an unordered collection of unique
|
||||||
|
element: a **hash table**.
|
||||||
|
|
||||||
|
|
||||||
Travelling Salesman Problem
|
Travelling Salesman Problem
|
||||||
---------------------------
|
---------------------------
|
||||||
|
|
||||||
The Penrose tiling defines a **graph**, which connects a set of vertices with a set of edges. We can consider the vertices
|
The Penrose tiling segments defines a **graph**, which connects a set of
|
||||||
as cities and edges as roads between them.
|
vertices with a set of edges. We can consider the vertices as cities and edges
|
||||||
|
as roads between them.
|
||||||
|
|
||||||
Now we want to find the shortest possible route that visits each city exactly once and returns to the origin city. This
|
Now we want to find the shortest possible route that visits each city exactly
|
||||||
is the **Travelling Salesman Problem**. We use an **Ant Colony Optimization** algorithm to (try) to solve it.
|
once and returns to the origin city. This is the **Travelling Salesman
|
||||||
|
Problem**. We use an **Ant Colony Optimization** algorithm to (try) to solve it.
|
||||||
|
|
||||||
Because each city is not connected to every other cities, we need to find the shortest path between two cities. This is
|
Because each city is not connected to every other cities, we need to find the
|
||||||
done with the help of the **A-star** algorithm.
|
shortest path between two cities. This is done with the help of the **A-star**
|
||||||
|
algorithm.
|
||||||
|
|
||||||
The ant colony algorithm output a path that connect every cities, which is drawn on the image, but it also stores a
|
The ant colony algorithm output a path that connect every cities, which is drawn
|
||||||
so-called pheromones matrix, which can be drawn as edges with variable transparency/width.
|
on the image, but it also stores a so-called pheromones matrix, which can be
|
||||||
|
drawn as edges with variable transparency/width.
|
||||||
|
|
||||||
|
|
||||||
|
Penrose tiling
|
||||||
|
--------------
|
||||||
|
|
||||||
|
Because the L-system draws the Penrose tiling segments by segments, we need to
|
||||||
|
compute how each segment is related to the diamonds to rebuild the tiling
|
||||||
|
corresponding to all those edges.
|
||||||
|
|
||||||
|
Fortunately, computing a **Delaunay triangulation** of the Penrose vertices
|
||||||
|
brings back the Penrose graph (how cool is that!?) and stores plain shapes
|
||||||
|
(triangles) instead of unordered segments. This is done thanks to the
|
||||||
|
**Bowyer-Watson algorithm**.
|
||||||
|
|
||||||
|
But this triangulation contains edges that link the set of exterior vertices,
|
||||||
|
which are not in the Penrose graph. This is solved by computing the **convex
|
||||||
|
hull**, with the **Chan's algorithm**, and removing the triangles that contains
|
||||||
|
those edges from the triangulation.
|
||||||
|
|
||||||
|
|
||||||
TODO
|
TODO
|
||||||
----
|
----
|
||||||
|
|
||||||
More coolness:
|
More coolness:
|
||||||
- Compute the **Delaunay triangulation** from the Penrose graph vertices,
|
- Compute the **Voronoï diagram** from the triangulation,
|
||||||
- Compute the **Voronoï diagram** (Bowyer-Watson or Fortune's algorithm?) from the triangulation,
|
|
||||||
- Remove Voronoï edges that intersects with the Penrose graph,
|
- Remove Voronoï edges that intersects with the Penrose graph,
|
||||||
- **quad trees** may be useful somewhere to query neighbors points?,
|
- **quad trees** may be useful somewhere to query neighbors points?,
|
||||||
- The center of remaining segments is the center of the Penrose tiles,
|
- The center of remaining segments is the center of the Penrose tiles,
|
||||||
- Build back the neighborhood of those tiles from the Voronoï diagram,
|
- Build back the neighborhood of those tiles from the Voronoï diagram,
|
||||||
|
- Draw the neighborhood with **splines** across the center of diamonds
|
||||||
|
segments,
|
||||||
- Run a **cellular automata** on this Penrose tiling,
|
- Run a **cellular automata** on this Penrose tiling,
|
||||||
- Draw a **planner** on it.
|
- Draw a **planner** on it.
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue