Jak interpolować wokół prostokąta?


11

Chcę zrobić fantazyjną animację, w której punkt przemieszcza się wokół prostokąta. Chcę znaleźć pozycję punktu na raz t.

Prostokąt jest przez X, Y, Widthi Height.

prostokąt, wokół którego znajduje się ścieżka zgodna z ruchem wskazówek zegara

Czy jest na to algorytm?

Użyłem sin/ cosdo kręgów. Jakie jest równoważne podejście do prostokątów?


1
Nie jest to pełna odpowiedź, dlatego komentarz. Nie sądzę, że możesz podzielić ten zakup na 1/4, jeśli nie masz kwadratu, ale prostokąt. Ale co możesz zrobić, jeśli znasz maksymalny czas potrzebny na obejście: Oblicz obwód s i użyj wzoru s / a = v, aby obliczyć prędkość v.
M0rgenstern

Odpowiedzi:


15

Zakładam, że twoje t wynosi od 0 do 1 . (Jeśli nie, pomnóż go, aby odpowiednio skalować.)

interpolacja prostokąta

Dowiedz się, jaka proporcja ( 0 - 1 ) każdej strony obwodu. ( długość boku / całkowity obwód )

Aby dowiedzieć się, ile z każdej strony jest „wypełnione” w czasie t , iteruj przez strony, odejmując ich proporcje, aż t zostanie wyczerpane do wartości ujemnej. Ta ostatnia krawędź (która spowodowała, że t ma wartość ujemną) jest wypełniona proporcją (długość boku + pozostała część) / długość boku . Reszta nie jest wypełniona.

Aby uzyskać dokładną pozycję wektora w t , pomnóż wektor każdej strony przez proporcję tej strony, która jest wypełniona, i dodaj je.

To działa właściwie na każdym wielokącie!

dowolna interpolacja wielokątów


2

Sinus i cosinus t są odpowiednio współrzędnymi y i x punktu na okręgu tworzącym kąt t z osią x. Nie ma takiej potrzeby w prostokącie! Prostokąt składa się z czterech linii. Jeśli tidzie od 0celu 1, to osiągnie punkt (px,py)na t==0i (qx,qy)na t==1z linii podanych przez:

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

jeśli zamiast 0i 1, czas płynie od t0do t1, możesz najpierw znormalizować czas, a następnie zastosować powyższą formułę.

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

Teraz, dla twojego prostokąta, podziel na cztery przypadki, ifdla każdej krawędzi, która pokrywa jeden z przedziałów czasu i zastosuj ruch linii.

Zauważ, że jeśli prostokąt jest wyrównany względem osi, zawsze będzie miała wartość x lub wartość y, która jest stała. Na przykład, dla t pomiędzy 0i a/4(a załóżmy (X, Y) to lewy dolny róg),

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

Co równa się również:

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

1

Nie wiem, czy istnieje rzeczywisty algorytm do tego, ale sam go stworzyłem (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;
}

Powinieneś przekształcić zmienne xi y, aby uzyskać animację tak dużą lub małą, jak chcesz (mnożąc) i gdzie chcesz (dodając / odejmując od xiy).

Nie testowałem tego kodu, ale myślę, że powinien działać. Powinno to również działać dla dowolnego wielokąta z dowolną liczbą punktów (możesz również użyć odrobiny kodu do wygenerowania wielokąta).


1

Dany :

a=total time

perimeter = WIDTH *2 + HEIGTH * 2;

Biorąc pod uwagę czas, T1jak dostać się Pna obwodzie (zakładając prostą pozycję na 0,0)?

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

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

teraz trochę łatwej geometrii i matematyki na scool (mam nadzieję, że mnie oszczędzicie) do zdobycia P.xi P.yoddistT1

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.