NSBezierPath Graph

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

Позвольте мне попытаться объяснить, что я имею в виду. У меня есть линейный график, построенный примерно на 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];
Другие вопросы по тегам