2009-03-13 6 views
1

J'essaie de tracer certaines données par horodatage dans un NSOpenGLView. Je souhaite également superposer certains éléments Cocoa non-openGL au-dessus des données, tels que les zones de surlignage. Ma difficulté est d'aligner les systèmes de coordonnées.Transformations de coordonnées Cocoa/OpenGL

Les horodatages de mes données sont en secondes depuis l'époque. Les valeurs vont de -2 à 2. Je peux tracer les données brutes sans trop de difficulté dans OpenGL en faisant gluOrtho(startTime, endTime, -2, 2). La difficulté vient quand j'essaie de mélanger ceci avec la mise à l'échelle et le dessin de Cocoa. Par souci de simplicité, j'utiliserai l'exemple d'une ligne pour simplifier les choses. Voici une ligne tracée (avec OpenGL) (2/18/09 at 13:00:08, -1.5)-(2/18/09 13:00:13, 1.7) ou (1234980008, -1.5)-(1234980013, 1.7) en quelques secondes:

Scale=1 http://ccg.cc.gt.atl.ga.us/~anjiro/tmp/scale1.png

Pour l'amour de la discussion, disons que je veux maintenant utiliser Cocoa pour superposer une ligne, exactement le même , en plus de la ligne OpenGL. Je préférerais pouvoir le faire avec exactement les mêmes coordonnées, à savoir (1234980008, -1.5) -> (1234980013, 1.7).

Voilà donc la première question. Maintenant, je veux voir plus de détails, donc je veux à l'échelle:

Scale=2 http://ccg.cc.gt.atl.ga.us/~anjiro/tmp/scale2.png

Je veux toujours dessiner ma même ligne de cacao, mais je dois aussi savoir, en coordonnées données, ce qui est visible dans cette fenêtre, donc je ne dois pas tirer de données supplémentaires.

J'ai essayé une variété de solutions, mais je n'arrive pas à faire quoi que ce soit au travail. Puis-je faire ceci? Si c'est le cas, comment? Si non, que devrais-je faire à la place?

Répondre

1

Je suppose que vous savez déjà que vous obtenez le rectangle de la vue en utilisant - [les limites NSView]. Par conséquent, vous obtenez les correspondances suivantes:

  • STARTTIME < -> bounds.origin.x
  • endTime < -> bounds.origin.x + bounds.size.width
  • (-2) < -> bounds.origin.y
  • (+2) < -> bounds.origin.y + bounds.size.height

Si je ne me trompe pas, cette méthode doit convertir un NSOp le point Engl à un point de vue:

- (NSPoint) pointWithTime:(long)time value:(float)value 
{ 
    NSPoint point; 

    point.x = [self bounds].origin.x 
     + [self bounds].size.width * ((time - startTime)/(endTime - startTime)); 
    point.y = [self bounds].origin.y 
     + [self bounds].size.height * ((value - minValue)/(maxValue - minValue)); 

    return point; 
} 

(avec minValue = -2 et maxValue = 2.)

Pour la deuxième partie de votre question: utilisez la rect fourni au - [NSView drawRect :] méthode pour savoir quelle partie de la vue doit être actualisée. Définissez les détails dans le Guide de dessin Cocoa qui est loquace sur ce point. La méthode peut être appelée plusieurs fois pour dessiner différentes parties de la vue.

+0

Merci pour la réponse; Malheureusement, selon ce post de la liste de diffusion: http://tinyurl.com/bttty7, le rectangle des limites n'a aucun effet sur NSOpenGLViews. – Dan

Questions connexes