Я не могу понять, как оптимизировать чертеж 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 точек. Есть ли возможность (изменение границ и, в конечном счете, масштабирование пути каким-либо образом), чтобы отображать только первую часть графика в правильных границах?
Мне не удалось получить результат, потому что, если я изменяю границы, масштаб меняется, и я не могу исправить проблему с шириной линии.
Спасибо за ваше предложение. Я определенно попытаюсь следовать этому подходу. Но, вероятно, мое описание было немного обманчивым, поэтому позвольте мне попытаться перефразировать. В первый раз, когда вызывается мой метод drawRect, я могу создать путь bezier fullGraph, содержащий весь граф (более 30 тыс. Строк, я знаю, что это слишком много), и я изменяю границы представлений в соответствии с моими единицами очков. Но сейчас я не хочу отображать весь график. Я только хочу показать, скажем, первые две строки. И при следующих вызовах я хочу увеличить координату x, чтобы отобразить большую часть и так далее. – user1175172
Проблема в том, что для каждого вызова drawrect я пытаюсь изменить только границы представлений для соответствия той части графика, которую я хочу отобразить. Но после изменения границ ширина линии огромна. И я не могу понять, как его уменьшить. – user1175172