我正在尝试在NSOpenGLView中按时间戳绘制一些数据。我还想在数据上方叠加一些非openGL Cocoa元素,例如突出显示框。我的困难在于让坐标系统排成一行。
我的数据的时间戳是从纪元以来的秒数。值从-2到2运行。我可以通过执行gluOrtho(startTime, endTime, -2, 2)
在OpenGL中绘制原始数据而不会有太多困难。当我尝试将它与缩放和Cocoa绘图混合时,困难就来了。
为简单起见,我将使用一行的例子。以下是从(2/18/09 at 13:00:08, -1.5)
到(2/18/09 13:00:13, 1.7)
,或(1234980008, -1.5)
到(1234980013, 1.7)
的秒数(使用OpenGL)绘制的行:
Scale=1 http://ccg.cc.gt.atl.ga.us/~anjiro/tmp/scale1.png
为了便于讨论,我想现在要使用Cocoa在OpenGL线上叠加一条完全相同的线。我希望能够使用完全相同的坐标,即(1234980008, -1.5) -> (1234980013, 1.7)
。
这是第一个问题。现在我想看到更多细节,所以我想缩放:
Scale=2 http://ccg.cc.gt.atl.ga.us/~anjiro/tmp/scale2.png
我仍然希望绘制相同的Cocoa系列,但我还需要知道,在数据坐标中,此窗口中显示的内容是什么,所以我不必绘制额外的数据。
我尝试了各种解决方案,但无法完成任何工作。我可以这样做吗?如果是这样,怎么样?如果没有,我该怎么做呢?
答案 0 :(得分:1)
我猜您已经知道使用 - [NSView bounds]获取视图的矩形。 因此,您会得到以下对应关系:
如果我没弄错,这个方法应该将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:]方法提供的 rect 来了解要刷新视图的哪个部分。在“可可绘图指南”中详细说明了这一点。可以多次调用该方法来绘制视图的不同部分。