3

私の問題を解決するように見えた客観的 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];
}

私の質問は次のとおりです。カスタム アルゴリズムが外れているのか、それとも特定の種類の行のエッジ ケースが欠落しているだけなのか。いずれにせよ、アルゴリズムを修正するための助けは非常に高く評価されます。繰り返しますが、私はピクセルの完全な一致を探しているわけではありませんが、曲線が一緒に並ぶことを期待しています.

4

1 に答える 1

4

ここのウィキペディアのページを見ると、q1-q4 の係数が正しくないようです。それらは対称であるべきではありませんか?

また、 to.x と bx を交換する必要があるようです:

qx = q1*from.x + q2*a.x + q3*to.x + q4*b.x;
qy = ...
于 2012-05-05T22:17:33.013 に答える