iPhoneでグラフを描こうとしているのですが、グラフの更新を早くしたいので、どうしてもやりたいのはグラフをaUIImageView
に描画してから、drawメソッドを繰り返したら古い描画をクリアして再描画することです.
これが私のコードです:
- (void)redraw {
canvas.image = nil;
UIGraphicsBeginImageContext(self.view.frame.size);
[canvas.image drawInRect:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound);
CGContextSetLineWidth(UIGraphicsGetCurrentContext(), 5.0);
CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), 1.0, 0.0, 0.0, 1.0);
CGContextBeginPath(UIGraphicsGetCurrentContext());
CGContextMoveToPoint(UIGraphicsGetCurrentContext(), 0, canvas.frame.size.height/2);
for (float i=0; i<500; i+=0.01) {
[self y:i];
CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), ((i*200)-200), (y*200)+canvas.frame.size.height/2);
}
CGContextStrokePath(UIGraphicsGetCurrentContext());
canvas.image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
}
このコードは、一度呼び出されたときに希望どおりに機能します。次の曲線を示します。
しかし、タイマーを追加すると、redraw
奇妙なことが起こり始めます。アプリの起動時に上の図に示されている曲線が表示されますが、すぐにこの曲線に変わります (同じ曲線で、x 軸に沿ってより伸び、y 軸に沿って上に (技術的には下に) 伸びているように見えます):
と:
- (void)y:(float)x {
y = sin(x - 1)*pow((x - 1), 0.5)*cos(2*(x - 1))*sin(0.5*(x - 1))*cos(x - 1)*sin(2*(x - 1))*pow(cos(x-1), -1);
}