NSBezierPath Graph - PullRequest
       48

NSBezierPath Graph

3 голосов
/ 28 января 2012

Я не могу понять, как оптимизировать чертеж 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 Ответ

1 голос
/ 28 января 2012

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

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