2012-05-05 23 views
3

我问了一个快速问题Bezier curve algorithm in objective-c,似乎解决了我的问题。我在问这个新问题,因为我认为它的不同而不是重新使用旧的问题。在objective-c中的贝塞尔曲线算法需要调整

我有什么看起来像一个工作的贝塞尔曲线算法,但相比内置NSBezierPath版本有一些主要问题。看起来好像某些类型的曲线非常扭曲。

Example Issues

您可以从上图中看到的差异,红线是我的功能和颜色较浅的内置版本。我是而不是期待和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]; 
} 

所以我的问题是;是自定义算法的方式,还是只是缺少特定种类的线或其他的边缘情况?无论哪种方式,任何帮助修复算法将非常感激。重申一下,我是而不是寻找一个像素完美匹配,但我期待的曲线排列在一起。

回答

4

看看维基百科页面here似乎你的q1-q4系数是不正确的。它们不应该是对称的吗?

看来还to.x和b.x应该被交换:

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

Q1-Q4看起来是正确的我。但是'b'和'to'应该交换。赶上:) – thundersteele

+0

@thundersteele那么他不是在做B样条曲线,而是Bézier曲线? –

+0

也许我在这里很困惑,但是我看了一下你链接到的wiki页面,并且q1-q4对应于三次贝塞尔曲线公式中P0-P3的系数。 – thundersteele