在Objective-C贝塞尔曲线算法需要一个调整(Bezier curve algorithm i

2019-06-24 04:46发布

我问一个简单的问题在Objective-C贝塞尔曲线算法 ,似乎解决了我的问题。 我问这新的问题,因为我觉得它足够的不同,而不是重新利用旧的。

我有什么似乎是一个工作Bezier曲线算法,但相比时,建于NSBezierPath版本有一些重大问题。 看起来好像某些类型的曲线都非常扭曲。

您可以从上面的图片看到的差异,红线是我的功能和颜色较浅的内置版本。 我希望和exat匹配,像素像素,但你可以看到红线熄灭的方式当然有时。

我列出的第一种方法就是调用了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];
}

所以我的问题是; 是自定义算法的方式关闭或只是缺少特定类型的线,还是其他什么东西的边缘呢? 无论哪种方式,在算法固定任何帮助将是非常赞赏。 要重申的是,我不是在寻找一个像素完美的比赛,但我期待的曲线阵容在一起。

Answer 1:

纵观维基百科页面这里似乎你对Q1-Q4的系数是不正确的。 难道他们不应该是对称的?

这似乎也to.x和BX应该被交换:

qx = q1*from.x + q2*a.x + q3*to.x + q4*b.x;
qy = ...


文章来源: Bezier curve algorithm in objective-c needs a tweak