2012-02-29 6 views
10

베 지어 곡선 경로에서 이미지를 위에서 아래로 이동하려고하지만이 경로에서 x/y 점과 기울기를 계산하는 방법을 알 수 없습니다. 경로는 다음 그림과 같습니다베 지어 곡선 경로에서 객체 이동

enter image description here

I 포인트, 엔드 포인트 및 두 개의 제어 지점을 시작합니다.

Path path = new Path(); 
Point s = new Point(150, 5); 
Point cp1 = new Point(140, 125); 
Point cp2 = new Point(145, 150); 
Point e = new Point(200, 250); 
path.moveTo(s.x, s.y); 
path.cubicTo(cp1.x, cp1.y, cp2.x, cp2.y, e.x, e.y); 

답변

11

이 화학식 단순히 [x,y]=(1–t)^3*P0+3(1–t)^2*t*P1+3(1–t)t^2*P2+t^3*P3되는 큐빅 베 지어 곡선이다. 이를 통해 방정식을 평가하여 각 포인트를 풀 수 있습니다. 당신이 경로를 따라 스프라이트를 이동하기를 원한다면, 그래서

/* t is time(value of 0.0f-1.0f; 0 is the start 1 is the end) */ 
Point CalculateBezierPoint(float t, Point s, Point c1, Point c2, Point e) 
{ 
    float u = 1 – t; 
    float tt = t*t; 
    float uu = u*u; 
    float uuu = uu * u; 
    float ttt = tt * t; 

    Point p = new Point(s.x * uuu, s.y * uuu); 
    p.x += 3 * uu * t * c1.x; 
    p.y += 3 * uu * t * c1.y; 
    p.x += 3 * u * tt * c2.x; 
    p.y += 3 * u * tt * c2.y; 
    p.x += ttt * e.x; 
    p.y += ttt * e.y; 

    return p; 
} 

을 당신은 단순히 값 0에서 t 값을 설정합니다 - 얼마나 멀리 아래쪽에 따라 1 : 자바에서는이이처럼 할 수 당신이되고 싶은 경로. 예 :

int percentMovedPerFrame = 1;// Will complete path in 100 frames 
int currentPercent = 0; 
update() { 
    if (currentPercent < 100) { 
     this.pos = CalculateBezierPoint(currentPercent/100.0f, this.path.s, this.path.c1, this.path.c2, this.path.e); 
     currentPercent += percentMovedPerFrame 
    } 
} 
+0

안녕하세요 ... 나는 수동으로 경로에 이미지. 나는 터치 이벤트에 이미지를 옮기고 싶다. 어떻게 그 코드를 수정할 수 있을까 ?? –

+0

내 이미지에 대한 래스터 화 루틴을 작성하고 싶지 않으면 내 코드를 수동으로 사용할 수 있습니다. –

4

제어점이 2 개 밖에없는 경우 베 지어 곡선은 선형 선입니다.

3 인 경우 2 차 곡선을 사용합니다. 4 개의 제어점은 3 차 곡선을 정의합니다.

베 지어 곡선은 "시간"에 의존하는 함수입니다. 0.0에서 1.0 사이입니다. 방정식에 0을 입력하면 곡선의 시작 부분에 값이 표시됩니다. 1.0을 입력하면 끝 부분의 값입니다.

베 지어 곡선은 첫 번째 및 마지막 제어점을 보간하므로 시작점과 끝점이됩니다. 곡선을 생성하는 데 사용중인 패키지 또는 라이브러리를주의 깊게 살펴보십시오.

커브의 접선 벡터로 이미지의 방향을 지정하려면 커브 방정식을 구별해야합니다 (위키에서 큐빅 베 지어 곡선 방정식을 찾을 수 있음). 그러면 이미지의 방향을 지정하는 접선 벡터가 생깁니다.

+0

2 및 3 제어점을 사용하여 베 지어 곡선의 2 차 방정식을 찾는 방법에 대한 힌트를 얻을 수 있습니까? –

+0

다음을보십시오 : http://en.wikipedia.org/wiki/B%C3%A9zier_curve 선형, 2 차 및 입방에 대한 방정식을 보여줍니다. – PixelPerfect3

+0

또한 예제에서 4 개의 제어점이 있음에 유의하십시오. 시작 및 종료 지점도 제어 지점으로 간주됩니다. 곡선을 평가하려면 wiki의 'Cubic Bézier curves'섹션에서 마지막 공식을 사용하십시오. 예 : 예에서 P0 = s, P1 = cp1, P2 = cp2, P3 = e B (0) = s 및 B (1) = e. – Dirk

16

Android는 사용자가 원하는 것을 성취 할 수있는 API를 제공합니다. android.graphics.PathMeasure 클래스를 사용하십시오. getLength()는 경로의 픽셀 단위의 총 길이를 가져오고 getPosTan()은 지정된 거리에서 커브의 X, Y 위치를 검색하는 데 유용합니다.

예를 들어, getLength()가 200을 반환하고 곡선의 중간에있는 점의 X, Y 위치를 알고 싶다면 distance = 100으로 getPosTan()을 호출하십시오.

기타 정보 : http://developer.android.com/reference/android/graphics/PathMeasure.html

+0

http://stackoverflow.com/questions/18651025/how-to-move-image-on-curve-on-touch-event-in-android이 질문에 나를 도와주세요 –

3

입방 형 베젤의 매개 변수 형식에서 매개 변수를 변경해도 선형 결과가 생성되지 않습니다. 즉, t = 0.5로 설정해도 커브를 따라 중간 지점 인 점은 제공되지 않습니다. 곡률 (제어점에 의해 정의 됨)에 따라 경로를 따라 비선형 성이 있습니다.

0

베 지어 곡선 Bezier curve calculator의 정적 값 포인트를 계산해야하는 모든 사람들에게 좋은 소식입니다. 특히 네 번째 사분면 (즉, X 줄과 -Y 줄 사이)을 사용할 경우 특히 그렇습니다.그럼 당신은 완전히 안드로이드 좌표 시스템에 부정적인 가치에 mod하고 그것을 매핑 할 수 있습니다.

관련 문제