2010-08-17 10 views
4

Supposons que nous ayons un ensemble de points avec la restriction que pour chaque point, toutes les coordonnées sont non négatives, et la somme des coordonnées est égale à 1. Cela limite les points à se trouvent dans un simplex en 3 dimensions, il est donc logique d'essayer de le recréer dans un espace à trois dimensions pour la visualisation.Projection des points de l'espace 4d dans l'espace 3D dans Mathematica

La carte que je cherche prendrait des points extrêmes (1,0,0,0), (0,1,0,0), (0,0,1,0) et (0,0, 0,1) aux sommets du tétraèdre régulier "bien positionné". En particulier, le centre du tétraèdre sera à l'origine, un sommet se trouverait sur l'axe z, une face parallèle à x, y plan, et un bord pour être parallèle à l'axe x.

Voici un code qui fait la même chose pour les points en 3 dimensions, mais il ne semble pas évident de l'étendre à 4. Fondamentalement, je cherche des équivalents 4-d de fonctions tosimplex (qui prend 4 dimensions en 3) et il est fromsimplex inverse

 
A = Sqrt[2/3] {Cos[#], Sin[#], Sqrt[1/2]} & /@ 
    Table[Pi/2 + 2 Pi/3 + 2 k Pi/3, {k, 0, 2}] // Transpose; 
B = Inverse[A]; 
tosimplex[{x_, y_, z_}] := Most[A.{x, y, z}]; 
fromsimplex[{u_, v_}] := B.{u, v, Sqrt[1/3]}; 

(* checks *) 
extreme = {{1, 0, 0}, {0, 1, 0}, {0, 0, 1}}; 
Graphics[Polygon[tosimplex /@ extreme]] 
fromsimplex[tosimplex[#]] == # & /@ extreme

réponse:

simple reformulation de la réponse de deinst en termes de matrices suivant donne. (1/sqrt [4] est comme 4ème coordonnée, car il est la distance au centre simplex)

 
A = Transpose[{{-(1/2), -(1/(2 Sqrt[3])), -(1/(2 Sqrt[6])), 
    1/Sqrt[4]}, {1/2, -(1/(2 Sqrt[3])), -(1/(2 Sqrt[6])), 
    1/Sqrt[4]}, {0, -(1/(2 Sqrt[3])) + Sqrt[3]/2, -(1/(2 Sqrt[6])), 
    1/Sqrt[4]}, {0, 0, Sqrt[2/3] - 1/(2 Sqrt[6]), 1/Sqrt[4]}}]; 
B = Inverse[A]; 
tosimplex[{x_, y_, z_, w_}] := Most[A.{x, y, z, w}]; 
fromsimplex[{t_, u_, v_}] := B.{t, u, v, 1/Sqrt[4]}; 

(* Checks *) 
extreme = Table[Array[Boole[# == i] &, 4], {i, 1, 4}]; 
Graphics3D[Sphere[tosimplex[#], .1] & /@ extreme] 
fromsimplex[tosimplex[#]] == # & /@ extreme 

Répondre

7

Vous voulez

(1,0,0,0) -> (0,0,0) 
    (0,1,0,0) -> (1,0,0) 
    (0,0,1,0) -> (1/2,sqrt(3)/2,0) 
    (0,0,0,1) -> (1/2,sqrt(3)/6,sqrt(6)/3)) 

Et il est une transformation linéaire de sorte que vous transformez

(x,y,z,w) - > (y + 1/2 * (z + w), sqrt(3) * (z/2 + w/6), sqrt(6) * w/3) 

Modifier Vous voulez que le centre à l'origine - il suffit de soustraire la moyenne des quatre points. Désolé

(1/2, sqrt(3)/6, sqrt(6)/12) 
+0

Nice ... l'esprit disant comment tu l'as eu si vite? –

+1

Pratique. Il y a une demi-page de dessins gribouillés de triangles etc. La seule partie délicate est la hauteur du tétraèdre, et une fois que vous obtenez le centre de la base, c'est juste de l'algèbre. – deinst

1

Une possibilité:

  1. Generate quatre (non orthoganal) 3-vecteurs, \vec{v}_i de la centre du tétraèdre vers chaque sommet.
  2. Pour chaque quatre positions x = (x_1 .. x_4) formez la somme vectorielle \Sum_i x_i*\vec{v}_i.

Bien sûr cette application n'est pas unique en général, mais vous condition que la somme du x_i à 1 choses contraint.

+0

attention de deviner comment obtenir les coordonnées de 4 vecteurs du centre du tétraèdre vers chaque sommet? ;) –