Une première approximation incomplète de ce qu'il faudrait écrire pour implémenter ROAM.
This commit is contained in:
parent
db846fe022
commit
503a9d1193
117
roam.c
117
roam.c
|
@ -1,4 +1,7 @@
|
||||||
/* Triangle T (apex,v₀, v₁)
|
/* Implémentation de ROAM
|
||||||
|
* http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.22.1811&rep=rep1&type=pdf
|
||||||
|
*
|
||||||
|
* Triangle T (apex, vLeft, vRight)
|
||||||
* . vApex
|
* . vApex
|
||||||
* /|\
|
* /|\
|
||||||
* / | \
|
* / | \
|
||||||
|
@ -34,99 +37,43 @@ typedef struct Vertex {
|
||||||
// Ajouter des champs ici.
|
// Ajouter des champs ici.
|
||||||
} Vertex;
|
} Vertex;
|
||||||
|
|
||||||
|
/* Normalement, cette structure suffit, les autres champs sont
|
||||||
|
* récupérables autrement. */
|
||||||
|
// typedef struct Triangle {
|
||||||
|
// Vertex vCenter;
|
||||||
|
// struct Triangle* tLeftChild;
|
||||||
|
// struct Triangle* tRightChild;
|
||||||
|
// } Triangle;
|
||||||
|
|
||||||
typedef struct Triangle {
|
typedef struct Triangle {
|
||||||
Vertex vCenter;
|
Vertex vCenter;
|
||||||
struct Triangle* tLeftChild;
|
struct Triangle* tLeftChild;
|
||||||
struct Triangle* tRightChild;
|
struct Triangle* tRightChild;
|
||||||
} Triangle;
|
} Triangle;
|
||||||
|
|
||||||
/* typedef struct FullTriangle { */
|
int get_z(x,y) {
|
||||||
/* Triangle* self; */
|
return 0;
|
||||||
/* Vertex* vApex; */
|
|
||||||
/* Vertex* vLeft; */
|
|
||||||
/* Vertex* vRight; */
|
|
||||||
/* Triangle* tLeftNeighbor; */
|
|
||||||
/* Triangle* tRightNeighbor; */
|
|
||||||
/* Triangle* tBaseNeighbor; */
|
|
||||||
/* } FullTriangle; */
|
|
||||||
|
|
||||||
typedef enum bool {
|
|
||||||
TRUE = (0==0),
|
|
||||||
FALSE = (0==1)
|
|
||||||
} bool;
|
|
||||||
|
|
||||||
typedef struct TraversalStep {
|
|
||||||
bool isLeftChild; // Can be stored inside a pointer (last two bits).
|
|
||||||
Vertex* discarded;
|
|
||||||
Triangle* triangle;
|
|
||||||
} TraversalStep;
|
|
||||||
|
|
||||||
typedef struct Traversal {
|
|
||||||
int current;
|
|
||||||
TraversalStep recursion[256]; // == max recursion depth.
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void triangle_split(Triangle* T) {
|
Triangle* triangle_new() {
|
||||||
if (base(T) is not of same level)
|
Triangle* t = malloc(sizeof(Triangle));
|
||||||
triangle_split(base(T));
|
// TODO
|
||||||
T->vCenter = get_z(coordonnées du centre (calculer en fonction du niveau de détail de la grille et ^2));
|
return t;
|
||||||
parent->thischild = create the triangle.
|
}
|
||||||
|
|
||||||
|
void triangle_split(Triangle* t) {
|
||||||
|
if (t->baseNeighbor != NULL)
|
||||||
|
// T and its base neighbor aren't of the same LOD.
|
||||||
|
if (t->baseNeighbor->baseNeighbor != t)
|
||||||
|
triangle_split(t->baseNeighbor);
|
||||||
|
Vertex c = {
|
||||||
|
// coordonnées du centre (calculer en fonction du niveau de détail de la grille et ^2)
|
||||||
|
.z = get_z(42, 42)
|
||||||
|
};
|
||||||
|
t->tLeftChild = triangle_new();
|
||||||
|
t->tRightChild = triangle_new();
|
||||||
|
// TODO : couper t->baseNeighbor en deux aussi.
|
||||||
}
|
}
|
||||||
|
|
||||||
void triangle_merge(Triangle* T) {
|
void triangle_merge(Triangle* T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
inline Vertex* triangle_getVCenter(Triangle* T) {
|
|
||||||
return &(T->vCenter);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline Vertex* triangle_getVApex(Triangle* T) {
|
|
||||||
return triangle_getVCenter(parent);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline Vertex* triangle_getVLeft(Triangle* T) {
|
|
||||||
return (parent->tLeftChild == T) ? triangle_getVApex(parent) : triangle_getVRight(parent);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline Vertex* triangle_getVRight(Triangle* T) {
|
|
||||||
return (parent->tLeftChild != T) ? triangle_getVApex(parent) : triangle_getVLeft(parent);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline Triangle* triangle_getTBaseNeighbor(Triangle* T) {
|
|
||||||
gp = T->parent->parent;
|
|
||||||
if (gp->right == T) {
|
|
||||||
return isDivided(gp->left) ? gp->left->left : gp->left;
|
|
||||||
} else {
|
|
||||||
return isDivided(gp->right) ? gp->right->right : gp->right;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
inline Triangle* triangle_getTLeftNeighbor(Triangle* T) {
|
|
||||||
Triangle p = T->parent;
|
|
||||||
if (p->right == T) {
|
|
||||||
return isDivided(p->left) ? p->left->left : p->left;
|
|
||||||
} else {
|
|
||||||
return isDivided(p->right) ? p->right->right : p->left;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
inline Triangle* triangle_getTRightNeighbor(Triangle* T) {
|
|
||||||
// same as triangle_getTLeftNeighbor, so it's wrong !
|
|
||||||
Triangle p = T->parent;
|
|
||||||
if (p->left == T) {
|
|
||||||
return isDivided(p->left) ? p->left->left : p->left;
|
|
||||||
} else {
|
|
||||||
return isDivided(p->right) ? p->right->right : p->left;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
inline Triangle* triangle_getTLeftChild(Triangle* T) {
|
|
||||||
return T->tLeftChild;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline Triangle* triangle_getTRightChild(Triangle* T) {
|
|
||||||
return T->tRightChild;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline Triangle* triangle_getTParent(Triangle* T) {
|
|
||||||
}
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user