Bagaimana cara interpolasi di sekitar persegi panjang?


11

Saya ingin membuat animasi mewah di mana titik bergerak di sekitar persegi panjang. Saya ingin menemukan posisi titik pada suatu waktu t.

Persegi panjang yang diberikan oleh X, Y, Widthdan Height.

persegi panjang, dengan jalur searah jarum jam di sekitarnya

Apakah ada algoritma untuk ini?

Saya telah menggunakan sin/ cosuntuk lingkaran. Apa pendekatan yang setara untuk persegi panjang?


1
Bukan jawaban yang lengkap, karena itu komentar. Saya tidak berpikir Anda dapat membagi pembelian ini 1/4 jika Anda tidak memiliki quad, tetapi persegi panjang. Tetapi apa yang dapat Anda lakukan, jika Anda tahu waktu maksimum yang harus diambil untuk berkeliling adalah: Hitung keliling dan gunakan rumus s / a = v untuk menghitung kecepatan Anda v.
M0rgenstern

Jawaban:


15

Saya akan menganggap t Anda berubah dari 0 menjadi 1 . (Jika tidak, cukup gandakan untuk mengukurnya dengan tepat.)

interpolasi persegi panjang

Cari tahu berapa proporsi ( 0 - 1 ) setiap sisi dari perimeter. ( panjang sisi / perimeter total )

Untuk menemukan berapa banyak dari setiap sisi "diisi" pada waktu t , beralih melalui sisi, kurangi proporsinya sampai t habis untuk nilai negatif. Tepi terakhir (yang menyebabkan t menjadi negatif) diisi oleh proporsi (panjang sisi + tersisa) / panjang sisi . Selebihnya tidak terisi.

Untuk mendapatkan posisi vektor yang tepat di t , kalikan vektor setiap sisi dengan proporsi sisi yang diisi, dan tambahkan.

Ini bekerja untuk poligon apa pun sebenarnya!

interpolasi poligon sewenang-wenang


2

Sinus dan cosinus t masing-masing adalah koordinat y dan x dari suatu titik pada lingkaran yang membentuk sudut t dengan sumbu x. Tidak perlu untuk itu dalam persegi panjang! Sebuah persegi panjang terbuat dari empat garis. Jika tpergi dari 0ke 1, itu mencapai titik (px,py)di t==0dan (qx,qy)di t==1dengan garis yang diberikan oleh:

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

jika alih-alih 0dan 1, waktu Anda beralih dari t0ke t1, Anda dapat menormalkan waktu terlebih dahulu dan kemudian menerapkan rumus di atas.

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

Sekarang, untuk Anda empat persegi panjang, bagi dalam empat kasus dengan satu ifuntuk setiap tepi yang mencakup salah satu rentang waktu dan menerapkan gerakan garis.

Perhatikan bahwa jika persegi panjang Anda selaras sumbu, Anda akan selalu memiliki nilai x atau nilai y yang konstan. Misalnya, untuk t antara 0dan a/4(dan seandainya (X, Y) adalah kiri bawah),

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

Yang juga sama dengan:

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

1

Saya tidak tahu apakah ada algoritma yang sebenarnya untuk ini, tapi saya membuat sendiri (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;
}

Anda harus mengubah variabel xdan yuntuk mendapatkan animasi Anda besar atau kecil seperti yang Anda inginkan (dengan mengalikan) dan di mana Anda inginkan (menambah / mengurangi dari x dan y).

Saya belum menguji kode ini, tetapi saya pikir itu harus bekerja. Ini juga harus bekerja untuk poligon apa pun dengan sejumlah titik (Anda juga bisa menggunakan sedikit kode untuk menghasilkan poligon).


1

Diberikan:

a=total time

perimeter = WIDTH *2 + HEIGTH * 2;

Diberi waktu T1bagaimana cara mendapatkan Pperimeter (dengan asumsi posisi rect pada 0,0)?

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

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

sekarang beberapa geometri scool primer mudah dan matematika (yang harap Anda luang saya) untuk mendapatkan P.xdan P.ydaridistT1

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.