私の問題を解決するように見えた客観的 c のベジエ曲線アルゴリズムについて簡単な質問をしました。古いものを転用するのではなく、十分に異なると思うので、この新しい質問をしています。
ベジエ曲線アルゴリズムが機能しているように見えますが、組み込みNSBezierPath
バージョンと比較すると、いくつかの大きな問題があります。特定のタイプの曲線が非常に歪んでいるように見えます。
上の画像から違いがわかります。赤い線は私の機能で、明るい色は組み込みバージョンです。ピクセルごとに完全に一致するとは思っていませんが、ご覧のとおり、赤い線がコースから外れることがあります。
私がリストしている最初のメソッドは、2 つのベジエ メソッドを呼び出すもので、入力が両方のバージョンで同じであることを示しています。
- (void)MakeBezier
{
int x1 = [self getMegaNumber:2];
int y1 = self.frame.size.height - [self getMegaNumber:2];
int x2 = [self getMegaNumber:2];
int y2 = self.frame.size.height - [self getMegaNumber:2];
int x3 = [self getMegaNumber:2];
int y3 = self.frame.size.height - [self getMegaNumber:2];
int x4 = [self getMegaNumber:2];
int y4 = self.frame.size.height - [self getMegaNumber:2];
int cnt = [self getMegaNumber:2];
NSBezierPath *bezierPath = [[NSBezierPath alloc] init];
[bezierPath setLineWidth:1.0f];
[bezierPath moveToPoint:NSMakePoint(x1, y1)];
[bezierPath curveToPoint:NSMakePoint(x4, y4) controlPoint1:NSMakePoint(x2, y2) controlPoint2:NSMakePoint(x3, y3)];
// Draw path to image with build in NSBezierPath
[self drawPath:bezierPath fill:NO];
// Draw path with custom algorithm
[self drawBezierFrom:NSMakePoint(x1, y1) to:NSMakePoint(x4, y4) controlA:NSMakePoint(x2, y2) controlB:NSMakePoint(x3, y3) sections:cnt color:4];
}
この次のメソッドは、サンプル イメージで赤い線を描画するために使用されるカスタム アルゴリズムです。
- (void)drawBezierFrom:(NSPoint)from to:(NSPoint)to controlA:(NSPoint)a controlB:(NSPoint)b sections:(NSUInteger)cnt color:(NSUInteger)color
{
float qx, qy;
float q1, q2, q3, q4;
int lastx = - 1, lasty;
int plotx, ploty;
float t = 0.0;
while (t <= 1)
{
q1 = t*t*t*-1 + t*t*3 + t*-3 + 1;
q2 = t*t*t*3 + t*t*-6 + t*3;
q3 = t*t*t*-3 + t*t*3;
q4 = t*t*t;
qx = q1*from.x + q2*a.x + q3*to.x + q4*b.x;
qy = q1*from.y + q2*a.y + q3*to.y + q4*b.y;
plotx = round(qx);
ploty = round(qy);
if (lastx != -1)
[self drawLineFrom:NSMakePoint(lastx, lasty) to:NSMakePoint(plotx, ploty) color:color];
else
[self drawLineFrom:NSMakePoint(from.x, from.y) to:NSMakePoint(plotx, ploty) color:color];
lastx = plotx;
lasty = ploty;
t = t + (1.0/(cnt + 0.0f));
}
[self drawLineFrom:NSMakePoint(lastx, lasty) to:NSMakePoint(to.x, to.y) color:color];
}
私の質問は次のとおりです。カスタム アルゴリズムが外れているのか、それとも特定の種類の行のエッジ ケースが欠落しているだけなのか。いずれにせよ、アルゴリズムを修正するための助けは非常に高く評価されます。繰り返しますが、私はピクセルの完全な一致を探しているわけではありませんが、曲線が一緒に並ぶことを期待しています.