2017-09-28 4 views
0

아래 이미지를 참조하십시오. image below 이 경로 객체는 각면에 4 개의 베 지어 곡선을 사용하여 만듭니다. 현재 큐브 브러지 커브를 사용하여 만든이 패스 객체의 경계를 가져 오려고 할 때 문제가 발생합니다. 당신이 볼 수 있듯이, 위쪽과 아래쪽면은 경계를 완전히 부정확하게 만드는 커브를 벗어나는 제어점을가집니다.커브 내에 제어점이있는 베 지어 곡선

내 질문은 모든 제어점을 곡선 위 또는 레벨에있는 이미지와 같이 지그 소 퍼즐 조각을 만드는 것이 가능하다는 것입니다. (커브를 만들고 그 완벽한 거울을 만들고, 커브 경계 내의 모든 점)

+0

경로 복사본을 평평하게하고 그 경계를 사용할 수 있습니다. 제어점을 움직이면 커브가 많이 바뀔 것입니다! – TaW

+0

문제가 경계를 계산하지 않습니다. 나는 이미 그 일을 병합함으로써 완성했다. 나는이 경로를 마스크로 사용하기 위해 자바/안드로이드 기능을 사용하고 퍼즐을 생성하기 위해 퍼즐 그림을 오버레이합니다. 그 기능은 이러한 한계를 사용하여이 문제를 겪게됩니다. 가능한 경우 경계 내에서 제어점을 이동하는 것이 가장 쉬운 방법입니다. 해결 방법은 없습니까? – pats

답변

1

제어점을 사용하여 경계를 계산하지 마십시오. 최소한 경계가 필요하고 지정된 클리핑 사각형에서 잠재적 인 가시성을 빠르게 확인하지 않으려면 최소한. This 멋진 사이트는 bounding box을 포함하여 일반적인 베 지어 곡선 계산에 많은 도움이 될 수 있습니다.

또는 제어점이 곡선에있는 스플라인으로 전환하지만 곡선이 제어점에 의해 부과 된 경계를 넘어서면 반대 효과가 발생할 수 있습니다.

+0

답변 해 주셔서 감사합니다. 나는 실제 범위를 추정하기 위해 이미 algo를 구현했습니다. 하지만 나는이 경로를 마스크로 사용하기 위해 java/android funcitonality를 사용하고 퍼즐을 생성하기 위해 퍼즐 그림을 오버레이합니다. 그 기능은 이러한 한계를 사용하여이 문제를 겪게됩니다. 가능한 경우 경계 내에서 제어점을 이동하는 것이 가장 쉬운 방법입니다. 해결 방법은 없습니까? – pats

+0

폴리 라인이있는 커브를 근사합니다. 또는 각 방향의 가장 바깥 쪽 점에 커브를 분할하여 제어점이 더 이상 바깥에 오지 않도록 할 수 있습니다. 곡선을 근사 할 수 있다면 그 점을 찾는 것이 어렵지 않아야합니다. 그 밖의 모든 것에 대해서는 링크가 답을 제공해야합니다. – Joey

0

BEZIER 3 차 제어 포인트를 보간 입방으로 쉽게 변환 할 수 있습니다. 그냥이 역으로 그래서

:

/*        bezier = interpol 
1 |       ( x0)=X1; 
t |     (3.0*x1)-(3.0*x0)=(0.5*(X2-X0)); 
tt |   (3.0*x2)-(6.0*x1)+(3.0*x0)=(3.0*(X2-X1))-(X2-X0)-(0.5*(X3-X1)); 
ttt|( x3)-(3.0*x2)+(3.0*x1)-( x0)=(0.5*(X2-X0))+(0.5*(X3-X1))+(2.0*(-X2+X1)); 
1 |       ( y0)=Y1; 
t |     (3.0*y1)-(3.0*y0)=(0.5*(Y2-Y0)); 
tt |   (3.0*y2)-(6.0*y1)+(3.0*y0)=(3.0*(Y2-Y1))-(Y2-Y0)-(0.5*(Y3-Y1)); 
ttt|( y3)-(3.0*y2)+(3.0*y1)-( y0)=(0.5*(Y2-Y0))+(0.5*(Y3-Y1))+(2.0*(-Y2+Y1)); 
*/ 

// input: x0,y0,..x3,y3 ... Bezier control points 
// output: X0,Y0,..X3,Y3 ... interpolation control points 
    double x0,y0,x1,y1,x2,y2,x3,y3,m=1.0/9.0; 
    X0=x0-(x1-x0)/m; Y0=y0-(y1-y0)/m; 
    X1=x0;   Y1=y0; 
    X2=x3;   Y2=y3; 
    X3=x3+(x3-x2)/m; Y3=y3+(y3-y2)/m; 

희망 나는 어떤 대수 실수를하지 않았다. 셰이프가 변경되지 않은 상태에서 모든 컨트롤 포인트를 직접 커브로 이동합니다. BBOX 계산을 위해서는 사용 파라미터 t=<0,1>이 그들 사이에 보간되어 있으므로 (X1,Y1)(X2,Y2)만을 사용해야한다는 것에주의하십시오 !!!.

그러나 제어 포인트가없는 극단을 가질 수 있기 때문에 부정확 할 수도 있습니다. (BBOX가해야 할 것보다 조금 작다) 경우에는 어떤 단계 (0.1)로 커브의 점 집합 (예 : 10 입방)으로 모양을 다시 샘플링하고 BBOX를 수행 할 수 있습니다 전철기. 훨씬 정확하지만 느린 것입니다 ...

0

베 지어 커브의 한 가지 속성은 커브를 분할 할 때 매끄러운 커브와 CV 사이의 거리가 줄어 듭니다.

위와 아래에 CV를 수정하는 한 가지 방법은 De Casteljau 알고리즘을 사용하여 관련 베 지어를 두 베 지어로 분할하는 것입니다.

당신은 알고리즘이 작업을 수행 할 수 있습니다 :

  • 꽉 경계 상자와 CV 기반 경계 상자를 찾을 수 있습니다.
  • 의 차이가 허용 오차보다 큰 경우
  • 분할이 개 베 지어 곡선 각
  • 반복에 관련 베 지어 곡선의 모든

결국 최대/최소 이력서 및 관련 베 지어 곡선을 찾기 너의 관용에 부딪 힐거야.매우 빡빡한 허용 오차 또는 까다로운 데이터가있는 경우에는 그때까지 많은 베 지어가있을 수 있습니다.