2010-08-01 20 views
1

Le problème général est de projeter un polygone sur un plan est largement résolu, mais je me demandais si quelqu'un pourrait faire quelques suggestions pour mon cas particulier. J'ai un polygone planaire P dans l'espace 3 et je voudrais le projeter sur le plan à travers l'origine orthogonale au vecteur unité u. Les sommets de P et les coordonnées de u sont les seules données que je possède (toutes étant la base standard de R^3).Projection du polygone sur plan en utilisant GSL en C/C++

Cependant, je ne veux pas seulement les coordonnées projetées. Je voudrais en fait trouver une base orthonormale du plan orthogonal à u et trouver ensuite les coordonnées des sommets projetés dans cette nouvelle base.

La base elle-même n'a pas d'importance tant qu'elle est orthonormée. Donc vraiment j'ai besoin de faire deux choses dans le cadre de la bibliothèque scientifique GNU:

(1) Trouver deux vecteurs de base orthonormés pour le plan homogène orthogonal au vecteur unitaire u.

(2) Trouver les coordonnées dans cette base de la projection des sommets de P sur le plan.

Des idées sur la façon de le faire en utilisant gsl?

Répondre

2

Je n'ai pas utilisé le format GSL, mais il suffit d'utiliser le produit scalaire, le produit croisé et la normalisation pour obtenir le résultat.

(1) prise en charge tout vecteur r qui ne soit pas un multiple de u. Soit v = le produit croisé normalisé de r et . Soit w = le produit croisé de et v. Vos vecteurs de base orthonormés sont v et w.

(2) Pour projeter un sommet un à ce plan, il est (un dot v) * v + (un point w) * w . (Le v coordonnée est un point v, le w coordonnée est un pointw)

Pour vous aider à réfléchir sur la façon dont cela fonctionne, choisissez u = < 1,0 , 0> et r = < 3,0,5> pour démarrer et visualiser les vecteurs 3-d.

+0

Merci beaucoup! –

1

Il manque une information à la question, à savoir la direction de l'un des vecteurs de base. La question dit que les vecteurs de base doivent être orthonormés (c'est-à-dire de longueur unitaire et perpendiculaires l'un à l'autre) et bien sûr perpendiculaires à u (puisqu'ils sont dans un plan perpendiculaire à u), mais qu'ils restent libres de tourner .

+0

Oui, vous avez raison. Il y a de la liberté dans le choix de la base. Tout ce dont j'avais besoin était * une * base, pas une seule. –

1

Pour calculer des vecteurs v et w pour que u, v, w sont une base orthonormée:

void make_basis3(const double* u, double* v, double* w) 
{ double h[3]; 
double d; 
double s = (u[0] > 0.0) ? 1.0 : -1.0; 
double f = s/(s+u[0]); 
h[0] = u[0]+s; h[1] = u[1]; h[2] = u[2]; 
d = f*h[1]; v[0] = -d*h[0]; v[1] = 1.0-d*h[1]; v[2] = -d*h[2]; 
d = f*h[2]; w[0] = -d*h[0]; w[1] = -d*h[1]; w[2] = 1.0-d*h[2]; 
} 

Ici u est supposé être de longueur 1.

Qu'est-ce qui se passe ici est que la les premières lignes calculent un vecteur h tel que la matrice du chef de famille basée sur h (c'est-à-dire Q = I - 2 * h * h '/ h' * h où 'est transposée) cartes u (+ -1,0,0) et les deux dernières lignes appliquent cette matrice à (0,1,0) pour obtenir v et à (0,0,1) pour obtenir w. Puisque Q est orthogonal et symétrique, u, v, w est une base orthonormale.

Je pense que cette méthode est préférable à l'utilisation de produits croisés parce que: plus courte, plus efficace, moins sensible aux erreurs d'arrondi et généralisée aux dimensions plus élevées. Si P est un point, P.v et P.u sont les coordonnées de P projetées sur le plan orthogonal à u, à travers l'origine.