2012-05-05 1 views
3

빠른 문제는 Bezier curve algorithm in objective-c으로 문의하여 문제를 해결할 수있었습니다. 나는이 새로운 질문을하고 싶다. 나는 이전의 것을 재사용하는 것이 아니라 충분히 다른 것으로 생각한다.objective-c의 베 지어 곡선 알고리즘은 미세 조정이 필요합니다.

나는 베지에 곡선 알고리즘처럼 보이지만, NSBezierPath 버전에 내장 된 것과 비교하면 몇 가지 중요한 문제가 있습니다. 특정 유형의 커브가 매우 왜곡되어있는 것처럼 보입니다. 당신은 위의 이미지에서 차이를 볼 수 있습니다

Example Issues

은 빨간색 선은 제 기능을하고 밝은 색상이 버전에 내장되어 있습니다. 나는 이 아니며 픽셀을위한 픽셀을 예상하고 있지만, 빨간색 선이 보일수록 시간이 지날수록 코스에서 벗어나는 것을 알 수 있습니다.

두 번째 베 지어 메서드를 호출하는 첫 번째 방법은 입력이 두 버전과 동일하다는 것을 보여줍니다.

- (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 ​​스플라인을하고있는 것이 아닙니까? –

+0

어쩌면 혼란 스러울 지 모르지만 링크 된 위키 페이지를 보았습니다. q1-q4는 입방 형 베 지어 곡선의 수식에서 P0-P3의 계수에 해당합니다. – thundersteele