2009-03-13 3 views
1

Я пытаюсь построить некоторые данные по метке времени в NSOpenGLView. Я также хочу наложить некоторые элементы non-openGL Cocoa над данными, например, выделение ящиков. Моя трудность заключается в том, чтобы система координат выстраивалась в линию.Преобразования координат какао/OpenGL

Временные метки моих данных находятся за считанные секунды с эпохи. Значения от -2 до 2. Я могу построить необработанные данные без особых трудностей в OpenGL, выполнив gluOrtho(startTime, endTime, -2, 2). Трудность возникает, когда я пытаюсь смешать это с масштабированием и рисунком какао.

Для простоты я использую пример строки. Здесь линия график (с поддержкой OpenGL) от (2/18/09 at 13:00:08, -1.5) к (2/18/09 13:00:13, 1.7) или (1234980008, -1.5) к (1234980013, 1.7) в секундах:

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

Ради ОБСУЖДЕНИЕ, давайте скажем, я хочу теперь использовать какао для наложения линии, точно так же, , поверх строки OpenGL. Я предпочел бы иметь возможность делать это с точно такими же координатами, а именно (1234980008, -1.5) -> (1234980013, 1.7).

Итак, это первый вопрос. Теперь я хочу, чтобы увидеть больше деталей, поэтому я хочу, чтобы масштабировать:

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

Я все еще хочу обратить мое же какао линию, но мне также нужно знать, в координатах данных, что видно в этом окне, поэтому мне не нужно привлекать дополнительные данные.

Я пробовал различные решения, но не могу получить ничего, чтобы работать. Я могу сделать это? Если да, то как? Если нет, что мне делать вместо этого?

ответ

1

Я думаю, вы уже знаете, что вы получаете прямоугольник представления, используя - [рамки NSView]. Таким образом, вы получаете следующие Correspondances:

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

Если я не ошибаюсь, этот метод должен преобразовать NSOp Engl точки к точке зрения:

- (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; 
} 

(с MinValue = -2 и MaxValue = 2.)

Для второй части вопроса: использовать прямоугольник, даваемых - [NSView DrawRect :], чтобы узнать, какая часть представления должна быть обновлена. Задайте подробные сведения в руководстве по рисованию какао, которое является болтливым в этом вопросе. Метод можно вызвать несколько раз, чтобы нарисовать разные части представления.

+0

Спасибо за ответ; к сожалению, в соответствии с этим списком рассылки: http://tinyurl.com/bttty7, прямоугольник границ не влияет на NSOpenGLViews. – Dan

Смежные вопросы