1

我试图在 NSOpenGLView 中按时间戳绘制一些数据。我还想在数据上方覆盖一些非 OpenGL 的 Cocoa 元素,例如高亮框。我的困难在于让坐标系对齐。

自纪元以来,我的数据时间戳以秒为单位。值从 -2 到 2。我可以通过在 OpenGL 中轻松绘制原始数据gluOrtho(startTime, endTime, -2, 2)。当我尝试将其与缩放和 Cocoa 绘图相结合时,困难就来了。

为简单起见,我将使用线条的示例。(2/18/09 at 13:00:08, -1.5)这是从to(2/18/09 13:00:13, 1.7)(1234980008, -1.5)to(1234980013, 1.7)以秒为单位绘制的一条线(使用 OpenGL) :

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

为了便于讨论,假设我现在想使用 Cocoa 在 OpenGL 线的顶部覆盖一条完全相同的线。我希望能够使用完全相同的坐标,即(1234980008, -1.5) -> (1234980013, 1.7).

所以这是第一个问题。现在我想看到更多细节,所以我想缩放:

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

我仍然想绘制相同的 Cocoa 线,但我还需要知道,在数据坐标中,此窗口中可见什么,因此我不必绘制额外的数据。

我尝试了多种解决方案,但无法完全发挥作用。我可以这样做吗?如果是这样,怎么做?如果没有,我应该怎么做?

4

1 回答 1

1

我猜你已经知道你使用 -[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。)

对于您问题的第二部分:使用提供给 -[NSView drawRect:] 方法的矩形来了解要刷新视图的哪一部分。在 Cocoa Drawing Guide 中设置详细信息,该指南对这一点很啰嗦。该方法可能会被多次调用以绘制视图的不同部分。

于 2009-03-13T20:46:36.237 回答