2012-01-28 6 views
3

Я не могу понять, как оптимизировать чертеж NSView, который содержит NSBezierPath.NSBezierPath Graph

Позвольте мне попытаться объяснить, что я имею в виду. У меня есть линейный график, составленный примерно на 40 тыс. Точек, который я хочу сделать. У меня есть все точки, и это легко для меня, чтобы сделать один раз полным графа, используя следующий код:

NSInteger npoints=[delegate returnNumOfPoints:self]; //get the total number of points 
aRange=NSMakeRange(0, npoints); //set the range 
absMin=[delegate getMinForGraph:self inRange:aRange]; //get the Minimum y value 
absMax=[delegate getMaxForGraph:self inRange:aRange]; //get the Maximum y value 
float delta=absMax-absMin; //get the height of bound 
float aspectRatio=self.frame.size.width/self.frame.size.heigh //compensate for the real frame 
float xscale=aspectRatio*(absMax-absMin); // get the width of bound 
float step=xscale/npoints; //get the unit size 
[self setBounds:NSMakeRect(0.0, absMin, xscale, delta)]; //now I can set the bound 
NSSize unitSize={1.0,1.0}; 
unitSize= [self convertSize:unitSize fromView:nil]; 
[NSBezierPath setDefaultLineWidth:MIN(unitSize.height,unitSize.width)]; 
fullGraph=[NSBezierPath bezierPath]; 
[fullGraph moveToPoint:NSMakePoint(0.0, [delegate getValueForGraph:self forPoint:aRange.location])]; 
//Create the path 
for (long i=1; i<npoints; i++) 
    { 
     y=[delegate getValueForGraph:self forPoint:i]; 
     x=i*step; 
     [fullGraph lineToPoint:NSMakePoint(x,y)]; 
} 
[[NSColor redColor] set]; 
[fullGraph stroke]; 

Так что теперь у меня есть весь граф хранится в виде NSBezierPath в реальных координатах, что я могу погладить. Но давайте предположим, что теперь я хочу отобразить график, добавляющий по одному моменту времени как можно быстрее.

Я не хочу нарисовать весь набор точек каждый раз. Я хочу использовать, если возможно, полный график и визуализировать только небольшую часть. Предположим, что я хочу отображать в том же фрейме только первые 1000 точек. Есть ли возможность (изменение границ и, в конечном счете, масштабирование пути каким-либо образом), чтобы отображать только первую часть графика в правильных границах?

Мне не удалось получить результат, потому что, если я изменяю границы, масштаб меняется, и я не могу исправить проблему с шириной линии.

ответ

1

Вы можете создать новый путь только с новыми данными, гладить его, а затем добавить, что к существующей графе:

NSBezierPath* newPath = [NSBezierPath bezierPath]; 
//... draw the new lines in newPath ... 
[newPath stroke]; 
[fullGraph appendBezierPath:newPath]; 
+0

Спасибо за ваше предложение. Я определенно попытаюсь следовать этому подходу. Но, вероятно, мое описание было немного обманчивым, поэтому позвольте мне попытаться перефразировать. В первый раз, когда вызывается мой метод drawRect, я могу создать путь bezier fullGraph, содержащий весь граф (более 30 тыс. Строк, я знаю, что это слишком много), и я изменяю границы представлений в соответствии с моими единицами очков. Но сейчас я не хочу отображать весь график. Я только хочу показать, скажем, первые две строки. И при следующих вызовах я хочу увеличить координату x, чтобы отобразить большую часть и так далее. – user1175172

+0

Проблема в том, что для каждого вызова drawrect я пытаюсь изменить только границы представлений для соответствия той части графика, которую я хочу отобразить. Но после изменения границ ширина линии огромна. И я не могу понять, как его уменьшить. – user1175172

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