Какао / OpenGL преобразования координат - PullRequest
1 голос
/ 13 марта 2009

Я пытаюсь построить некоторые данные по метке времени в NSOpenGLView. Я также хочу наложить некоторые элементы не-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) в секундах:

Масштаб = 1 http://ccg.cc.gt.atl.ga.us/~anjiro/tmp/scale1.png

Ради обсуждения, допустим, я хочу теперь использовать Какао для наложения линии, точно такой же, поверх строки OpenGL. Я бы предпочел иметь возможность делать это с точно такими же координатами, а именно (1234980008, -1.5) -> (1234980013, 1.7).

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

Масштаб = 2 http://ccg.cc.gt.atl.ga.us/~anjiro/tmp/scale2.png

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

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

1 Ответ

1 голос
/ 13 марта 2009

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

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

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

- (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.)

Для второй части вашего вопроса: используйте rect , предоставленный методу - [NSView drawRect:], чтобы узнать, какая часть представления должна быть обновлена. Установите детали в Руководстве по Рисованию Какао, которое бесцеремонно об этом пункте. Этот метод может вызываться несколько раз для рисования различных частей вида.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...