2011-10-05 7 views
2

Poursuite du projet I previously described Je suis en train de créer une animation montrant le mouvement entre une liste de villes. Mon code actuel affiche une liste de villes et crée un ensemble de grands arcs de cercle reliant les villes. La liste des villes fait partie d'une chronologie, donc après avoir visité une ville, l'animation passera pour être centrée sur la suivante. À mon avis, cela signifie que le ViewVector devrait être ajusté pour montrer les points entre une ville de départ et une ville de départ. Le résultat ressemblerait probablement à une carte en vol pour un vol long-courrier accéléré considérablement. pourrait ressembler à ce qui suit produit manuellement une seule image fixe:Transition ViewVector entre deux coordonnées sphériques sur un globe

enter image description here

Je comprends maintenant comment positionner le ViewVector au-dessus de la dernière ville, mais je suis tout à fait incertain sur la façon de déplacer la caméra en douceur entre deux coordonnées sphériques points. Mon code actuel est ci-dessous:

SC[{lat_, lon_}] := {Cos[lon \[Degree]] Cos[lat \[Degree]], 
    Sin[lon \[Degree]] Cos[lat \[Degree]], Sin[lat \[Degree]]}; 

GreatCircleArc[{lat1_, lon1_}, {lat2_, lon2_}] := 

Module[{u = SC[{lat1, lon1}], v = SC[{lat2, lon2}], a}, 
    a = VectorAngle[u, v]; 
    Table[Evaluate[RotationTransform[\[Theta], {u, v}][u]], {\[Theta], 
0, a, a/Ceiling[10 a]}]] 

CityGraphic[name_] := {Opacity[0.85], Black, PointSize[Medium], White, 
    PointSize[0.045], Point[1.01 SC[CityData[name, "Coordinates"]]]} 

CityGraph[places_, age_] := 
    Graphics3D[{ 
Opacity[0.75], 
Sphere[{0, 0, 0}, 0.99 ], 
Map[Line[ 
    Map[SC, 
    CountryData[#, "SchematicCoordinates"], {-2}]] &, 
CountryData["Countries"]], 
Map[CityGraphic, places], 
Text[Style[age, FontFamily -> "Helvetica"], 
1.02 SC[CityData[First[places], "Coordinates"]]], 
White, Line 
[Apply[GreatCircleArc, 
    Partition[Map[CityData[#, "Coordinates"] &, places], 2, 1], {1}]] 
}, 
    ViewVector -> { 
4 SC[CityData[First[places], "Coordinates"]], {0, 0, 0}}, 
    Boxed -> False, 
    SphericalRegion -> True, 
    ImageSize -> {640, 480} 
    ]; 
CityGraph[{"Tokyo", "Dublin", "Cape Town", "Seattle", "Denver"}, "04"] 

Répondre

5

Chez les personnes infographies utilisent souvent Quaternions pour interpoler en douceur entre les différentes directions d'observation de la caméra. Mathematica a un Quaternion package que vous pouvez utiliser pour l'arithmétique Quaternion de base. Une conversion entre les quaternions et les angles d'Euler est décrite here.

Le processus d'interpolation est décrit here.

+0

+1. Intéressant, jamais pensé à ça. Pour un point sur une sphère, cela doit être lié à l'homomorphisme de 'SU (2)' à 'SO (3)'. –

Questions connexes