2016-11-05 2 views
1

내 숙제 베 지어 곡선을 그릴 폴 드 Casteljau 알고리즘을 사용하려고를 사용하여 목표 C에서 베 지어 곡선을 만들고,하지만 완벽하지 것 같다, 여기에 코드는는 폴 드 Casteljau 알고리즘

- (void)recursive_bezier :(double)x1 :(double)y1 
 
         :(double)x2 :(double)y2 
 
         :(double)x3 :(double)y3 
 
         :(double)x4 :(double)y4 
 
{ 
 

 
    count = count+1; 
 
    // Calculate all the mid-points of the line segments 
 
    //---------------------- 
 
    double x12 = (x1 + x2)/2; 
 
    double y12 = (y1 + y2)/2; 
 
    double x23 = (x2 + x3)/2; 
 
    double y23 = (y2 + y3)/2; 
 
    double x34 = (x3 + x4)/2; 
 
    double y34 = (y3 + y4)/2; 
 
    double x123 = (x12 + x23)/2; 
 
    double y123 = (y12 + y23)/2; 
 
    double x234 = (x23 + x34)/2; 
 
    double y234 = (y23 + y34)/2; 
 
    double x1234 = (x123 + x234)/2; 
 
    double y1234 = (y123 + y234)/2; 
 
    
 
    
 
    if(isFlat) 
 
    { 
 
    // // Draw and stop 
 
    // //---------------------- 
 
    [self drawLine:x1 :y1 :x4 :y4]; 
 
    
 
    } 
 
    else 
 
    { 
 
    // Continue subdivision 
 
    //---------------------- 
 
    if (count == 5) { 
 
     isFlat=true; 
 
    } 
 

 
    [self recursive_bezier:x1 :y1 :x12 :y12 :x123 :y123 :x1234 :y1234]; 
 
    [self recursive_bezier:x1234 :y1234 :x234 :y234 :x34 :y34 :x4 :y4]; 
 
    
 
    
 
    } 
 
} 
 

 
- (void)drawLine :(double)x1 :(double)y1 
 
       :(double)x4 :(double)y4{ 
 
    countDraw = countDraw+1; 
 
    NSLog(@"============%d============",countDraw); 
 
    NSLog(@"x1 = %f y1 = %f",x1, y1); 
 
    NSLog(@"x4 = %f y4 = %f",x4, y4); 
 
    
 
    UIBezierPath *path = [UIBezierPath bezierPath]; 
 
    [path moveToPoint:CGPointMake(x1, y1)]; 
 
    
 
    [path addLineToPoint:CGPointMake(x4, y4)]; 
 
    
 
    CAShapeLayer *shapeLayer = [CAShapeLayer layer]; 
 
    shapeLayer.path = [path CGPath]; 
 
    shapeLayer.strokeColor = [[UIColor blueColor] CGColor]; 
 
    shapeLayer.lineWidth = 2.0; 
 
    shapeLayer.fillColor = [[UIColor clearColor] CGColor]; 
 
    
 
    [self.view.layer addSublayer:shapeLayer]; 
 

 
}

enter image description here

은 오른쪽이 계산되지 않은 사람이 왜 저를 도와 드릴 방법과 곡선이 부드럽게 만들기 위해?

추신 : 내가 문제는 isFlat이 true로 설정되면, 더 이상의 세그먼트도 최상위 수준에 적절하게 분할되지 않을 것입니다 Bezier Curve Algorithm

+0

"숙제하는 것"보다는 상대적으로 효율적이고 효율적으로 수행해야하는 코드를 작성하는 데 관심이있는 프로그래머입니다. 숙제에 * 재귀를 사용해야합니까? 왜냐하면'for' 루프로 이것을하는 것이 훨씬 더 효율적이기 때문입니다. (재귀는 시간과 메모리를 낭비하는 호출 스택을 낭비합니다. 여기서는 전체적으로 * 불필요합니다) –

+0

이 숙제는 재귀 적이어야합니다. :) – xeravim

+0

이것이 재귀마다 끔찍한 방법이라는 것을 교사에게 알려주십시오.) –

답변

4

에 알고리즘을 얻었다. 이것은 재귀 호출의 특정 레벨과 관련된 정보이기 때문에 전체적으로 전역적인 것이 아닙니다. 코드 실행을 단계별로 수행하면보다 명확해야합니다.

더 좋은 방법은 recursive_bezier에 정수 매개 변수로 count을 선언하고 호출 할 때 최상위 레벨에서 0을 전달하고 재귀 호출시 count + 1을 전달하는 것입니다. isFlat 변수를 없애고 count >= 5을 테스트하면됩니다.

+1

OMG! 완전한! 재귀적인 작업이 어떻게 작동하는지 잊어 버렸지 만,이 덕분에 모든 문제가 해결되었습니다. 고마워 친구! – xeravim