사각형 주위를 어떻게 보간합니까?


11

점이 사각형 주위를 이동하는 멋진 애니메이션을 만들고 싶습니다. 한 번에 포인트의 위치를 ​​찾고 싶습니다 t.

사각형이 주어진다 X, Y, WidthHeight.

시계 방향 경로가있는 사각형

이에 대한 알고리즘이 있습니까?

내가 사용했습니다 sin/ cos원하십시오. 사각형에 대한 동등한 접근 방법은 무엇입니까?


1
완전한 답변이 아니므로 의견. 쿼드가 아닌 직사각형이 있으면이 구매를 1/4로 나눌 수 있다고 생각하지 않습니다. 그러나 당신이 할 수있는 것은, 당신이 돌아 다니는 최대 시간을 안다면 : 둘레를 계산하고 공식 s / a = v를 사용하여 속도를 계산하십시오.
M0rgenstern

답변:


15

귀하의 t0 에서 1 로 가정합니다 . (그렇지 않으면 배율을 적절히 곱하여 곱하십시오.)

직사각형 보간

각 변의 둘레 비율 ( 01 )을 계산하십시오. ( 가로 / 세로 )

시간 t 에서 얼마나 많은 각면이 "채워지는"지를 찾기 위해,면이 반복되어 t 가 음의 값으로 고갈 될 때까지 비율을 빼십시오 . 마지막 가장자리 ( t 가 음이되게 함)는 (측면 길이 + 나머지) / 측면 길이 의 비율로 채워집니다 . 나머지는 채워지지 않습니다.

t 의 정확한 벡터 위치를 얻으려면 각 변의 벡터에 채워진 변의 비율을 곱한 다음 더하십시오.

이것은 실제로 모든 다각형에서 작동합니다!

임의의 다각형 보간


2

t의 사인 및 코사인은 각각 x 축과의 각도 (t)를 형성하는 원 위의 점의 y 및 x 좌표이다. 직사각형에는 필요하지 않습니다! 사각형은 네 줄로 구성됩니다. 경우 t에서 이동 01, 그것은 지점에 도달 (px,py)에서 t==0과에 (qx,qy)t==1에 의해 주어진 라인 :

(l(x),l(y)) = (t*qx + (1-t)*px, t*qy + (1-t)*py)

0및 대신에 1시간이에서 t0로 이동하면 먼저 시간 t1을 정규화 한 다음 위의 수식을 적용 할 수 있습니다.

(l(x),l(y)) = (  ((t-t0)/(t1-t0))*qx + ((t1-t)/(t1-t0))*px, ((t-t0)/(t1-t0))*qy + ((t1-t)/(t1-t0))*py  )

이제 직사각형의 경우 if시간 범위 중 하나를 포함하는 각 모서리에 대해 네 가지 경우로 나누고 선 이동을 적용하십시오.

사각형이 축 정렬되면 항상 x 값 또는 y 값이 일정하다는 것을 알 수 있습니다. 예를 들어, 사이의 t에 대한 0a/4(상정 및 (X, Y)은 좌측 하단이다)

(l(x),l(y)) = ((4*t/a)*(X+Width) + (1-4*t/a)*(X), Y+Height)

다음과 같습니다.

(l(x),l(y)) = (X + (1-4*t/a)*(Width), Y+Height)

1

이에 대한 실제 알고리즘이 있는지 모르겠지만 직접 Java를 만들었습니다.

int points = 4; // for a rectangle
double progress = 0.0; // 0.0 -> 1.0 (with 1.0 being 100%)
double pp = points * progress; // This calculation would otherwise be done multiple times

int p1 = Math.floor(pp);
int p2 = Math.ceil(pp);

while (p1 >= points) p1 -= points;
while (p2 >= points) p2 -= points;

double tmp = 2 * Math.PI / points;

int p1x = Math.cos(tmp * p1);
int p1y = Math.sin(tmp * p1);
int p2x = Math.cos(tmp * p2);
int p2y = Math.sin(tmp * p2);

double p = pp - Math.floor(pp);

int x = (1.0 - p) * p1x + p * p2x; // between -1.0 and 1.0
int y = (1.0 - p) * p2x + p * p2y; // between -1.0 and 1.0

if (p == 0.0) { // prevent a weird glitch when p = 0.0 (I think this is a glitch)
    x = p1x;
    y = p1y;
}

애니메이션을 원하는만큼 (곱하여), 원하는 곳 (x와 y에서 더하기 / 빼기)으로 만들려면 xy변수를 변환해야합니다 .

이 코드를 테스트하지는 않았지만 작동해야한다고 생각합니다. 이것은 여러 포인트가있는 다각형에서도 작동합니다 (다수의 코드를 사용하여 다각형을 생성 할 수도 있음).


1

주어진 :

a=total time

perimeter = WIDTH *2 + HEIGTH * 2;

주어진 시간 에 둘레 T1를 얻는 방법 P(0에서 rect 위치를 가정)?

T1=T1%a; //use mod to have T1<a

distT1 = (T1*Perimeter)/a; //distance traveled in time T1

지금은 (당신이 나를 살려 희망) 몇 가지 쉬운 차 scool의 기하학과 수학 구하는 P.xP.y에서distT1

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.