|
4 | 4 |
|
5 | 5 | The **flip** operation flips an inner edge adjacent to two triangles. This selected edge is then deleted and replaced by an edge on the opposite diagonal. The following diagram shows the steps involved in flipping strand d. |
6 | 6 |
|
7 | | -<img src="img/actions/flip.png" width="300"/> |
| 7 | +<img src="img/actions/flip.png" width="600"/> |
8 | 8 |
|
9 | 9 | However, in some configurations, flip action can lead to problematic configurations. That's why we choose to constraint flip action in these situations : |
10 | 10 |
|
11 | 11 | * **Boundary darts :** When a dart is on boundary of the mesh, we should'nt flip the edge. We can check this condition by looking if the dart to flip has a twin dart. |
12 | | -* **Adjacency too high :** When nodes C and D already have an adjacency higher than 10, flip is possible. |
13 | | -* **Configuration who tends to imply edge reversal**: To detect these situations, we look a the type of quad formed by the two adjacent faces, it means the **quad ADBC**. |
| 12 | +* **Adjacency too high :** When nodes C and D already have an adjacency higher than 10, flip is not possible. |
| 13 | +* **Configuration who tends to imply edge reversal**: To detect these situations, we look a the type of quad formed by the two adjacent faces, i.e. **quad ADBC**. |
14 | 14 | * **concave quad:** When the quad is concave, flip operation necessarily lead to an edge reversal. We constraint it. |
15 | | -Exemple: |
| 15 | + In the figures below, we can see when flipping dart 18 a face reversal. |
16 | 16 |
|
17 | | - * **triangular quad:** Avoid because it will create a flat triangle. |
18 | | -Exemple: |
| 17 | + <img src="img/actions/flip_c_bef.png" width="350"/> |
| 18 | + <img src="img/actions/flip_c_after.png" width="350"/> |
| 19 | + |
| 20 | + * **triangular quad:** This configuration should be avoided, as it results in the creation of a degenerate (flat) triangle. As illustrated in the figures below, flipping dart 0 leads to a flattened face between nodes 2, 0, and 7. |
| 21 | + * |
| 22 | + <img src="img/actions/flip_before_tri.png" width="350"/> |
| 23 | + <img src="img/actions/flip_after_tri.png" width="350"/> |
19 | 24 |
|
20 | 25 | **The only configuration we accept is convexe quads** |
21 | 26 |
|
| 27 | +## Split |
| 28 | + |
| 29 | + The **split** operation split an inner edge adjacent to two triangles. A node is added in the middle of the edge and two faces are created. |
| 30 | + |
| 31 | +<img src="img/actions/split.png" width="600"/> |
| 32 | + |
| 33 | +However, in some configurations, split action can also lead to problematic configurations. That's why we choose to constraint split action in these situations : |
| 34 | + |
| 35 | +* **Boundary darts :** When a dart is on boundary of the mesh, we decide to prohibit it. It can be possible if we add another boundary node, but we choose to not touch mesh boundaries. We can check this condition by looking if the dart to split has a twin dart. |
| 36 | +* **Adjacency too high :** When nodes C and D already have an adjacency higher than 10, split is not possible. |
| 37 | +* **Configuration who tends to imply null darts**: As other actions are restricted to not allow flat faces, or reversed faces, split action can be performed on each configuration, see figure xxx. |
| 38 | + |
| 39 | +<img src="img/actions/split_concave.png" width="340"/> |
| 40 | +<img src="img/actions/split_triangular.png" width="350"/> |
| 41 | + |
| 42 | +## Collapse |
| 43 | + |
| 44 | +The **collapse** operation deletes an inner edge and also implies the deletion of its two adjacent faces F1 and F2. |
| 45 | + |
| 46 | +<img src="img/actions/collapse.png" width="750"/> |
| 47 | + |
| 48 | +However, in some configurations, collapse action can also lead to problematic configurations. That's why we choose to constraint collapse action in these situations : |
| 49 | + |
| 50 | +* **Boundary darts :** When a dart is on boundary of the mesh, we decide to prohibit it. We choose to not touch mesh boundaries. We can check this condition by looking if the dart to split has a twin dart. |
| 51 | +* **Adjacency too high :** When nodes A already has an adjacency higher than 10, collapse is not possible. |
| 52 | +* **Configuration who tends to imply edge reversal**: To detect these situations, we look a the type of darts in the surrounding. When there are some darts with concave surrounding, collapse action can lead to edge reversal. |
| 53 | + |
| 54 | + |
| 55 | +<img src="img/actions/collapse_reversal_before.png" width="400"/> |
| 56 | +<img src="img/actions/collapse_reversal_after.png" width="360"/> |
| 57 | + |
| 58 | +--- |
| 59 | + |
| 60 | +# Quadrangular Actions |
| 61 | + |
| 62 | +## Flip |
| 63 | + |
| 64 | +<img src="img/actions/flip_quad.png" width="600"/> |
| 65 | + |
| 66 | +The **flip** action can be decomposed as follows: |
| 67 | + |
| 68 | +- Check whether the dart `d` exists. |
| 69 | +- Update the **beta1** relations. |
| 70 | +- Update the links from nodes `n1` and `n2`, if they were previously linked to the flipped dart. |
| 71 | +- Update the links from faces `F1` and `F2`, if they were previously linked to the flipped dart. |
| 72 | +- Update the node links for `d` and `d2`. |
| 73 | +- Update the face links depending on the orientation (darts which change of face): |
| 74 | + - If **counterclockwise**: update links for `d1` and `d21`. |
| 75 | + - If **clockwise**: update links for `d2111` and `d111`. |
| 76 | +- Update the scores of the nodes. |
| 77 | + |
| 78 | +## Split |
| 79 | + |
| 80 | +<img src="img/actions/split_quad.png" width="600"/> |
| 81 | + |
| 82 | +The **split** action can be decomposed as follows: |
| 83 | + |
| 84 | +- Check whether the dart `d` exists. |
| 85 | +- Create a new node **n10** in the middle of [n1,n2] |
| 86 | +- Update node links of `d` and `d21`, they are now linked to `n10` |
| 87 | +- Create a new face with yellow darts |
| 88 | +- Update the **beta2** relations (`d1112`, `d111`,`d212`, `d21`). |
| 89 | +- Update the scores of the nodes. |
| 90 | + |
| 91 | +## Collapse |
| 92 | + |
| 93 | +<img src="img/actions/collapse_quad.png" width="600"/> |
| 94 | + |
| 95 | +The **collapse** action can be decomposed as follows: |
| 96 | + |
| 97 | +- Check whether the dart `d` exists. |
| 98 | +- Save the score of node `n1` for later computation. |
| 99 | +- If `n3` is not on the boundary, move its coordinates to the midpoint between `n3` and `n1`. |
| 100 | +- Check if nodes `n2` and `n4` are linked to the dart being deleted. If so, reassign their links to existing darts (node `n3` will be checked later). |
| 101 | +- Delete the face associated with `d`, along with its related darts. |
| 102 | +- Reassign all darts previously linked to `n1` so they now point to `n3`. |
| 103 | +- Link the dart associated with `n3` to an existing node. |
| 104 | +- Update the **beta2** relations (`d2`/`d12`, `d112`/`d1112`). |
| 105 | +- Recalculate the scores of the affected nodes. |
0 commit comments