Bir dikdörtgenin etrafında nasıl enterpolasyon yapabilirim?


11

Bir noktanın bir dikdörtgenin etrafında dolaştığı süslü bir animasyon yapmak istiyorum. Her seferinde noktanın konumunu bulmak istiyorum t.

Dikdörtgen verilir X, Y, Widthve Height.

etrafında saat yönünde bir yol olan bir dikdörtgen

Bunun için bir algoritma var mı?

Çevreler için sin/ kullandım cos. Dikdörtgenler için eşdeğer yaklaşım nedir?


1
Tam bir cevap değil, bu yüzden bir yorum. Ben dörtlü, ancak bir dikdörtgen yoksa bu satın 1/4 bölebilirsiniz sanmıyorum. Ancak, yapabileceğiniz maksimum zamanı biliyorsanız, çevresi s'yi hesaplayın ve s / a = v formülünü kullanarak hızınızı hesaplayın. V
M0rgenstern

Yanıtlar:


15

Ben senin varsayıyoruz t gider 0'a kadar 1 . (Değilse, uygun şekilde ölçeklemek için çarpın.)

dikdörtgen enterpolasyonu

Her bir tarafın çevresinin hangi oranının ( 0 - 1 ) olduğunu bulun. ( yan uzunluk / toplam çevre )

T zamanında her bir tarafın ne kadarının "doldurulduğunu" bulmak için , kenarları tekrarlayın, t negatif bir değere kadar tükenene kadar oranlarını çıkarın . Bu son kenar ( t'nin negatif olmasına neden olan ), (yan uzunluk + kalan) / yan uzunluk oranıyla doldurulur . Gerisi dolu değil.

En kesin vektör konumunu elde etmek için t , dolu o tarafa oranı ile çarpın her iki tarafın vektör ve bunları ekleyin.

Bu aslında herhangi bir çokgen için işe yarıyor!

keyfi çokgen enterpolasyonu


2

T sinüsü ve kosinüsü, x ekseni ile bir t açısı oluşturan daire üzerindeki bir noktanın sırasıyla y ve x koordinatıdır. Buna bir dikdörtgen içinde gerek yok! Bir dikdörtgen dört satırdan oluşur. Eğer tgider 0için 1, bu noktaya ulaşmak (px,py)en t==0ve (qx,qy)en t==1verdiği çizgiyle:

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

yerine eğer 0ve 1, zaman gider t0için t1, bu ilk defa normalleştirmek ve sonra yukarıdaki formülü uygulayabilirsiniz.

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

Şimdi, dikdörtgen için, ifher durumda bir zaman aralığını kapsayan bir ile dört durumda bölün ve bir çizgi hareketi uygulayın.

Dikdörtgenin eksene göre hizalandıysa, daima x değerine veya sabit olan y değerine sahip olacağınıza dikkat edin. Örneğin, 0ve arasındaki t için a/4(ve (X, Y) 'nin sol alt olduğunu varsayalım),

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

Şunlara da eşittir:

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

1

Bunun için gerçek bir algoritma olup olmadığını bilmiyorum, ama kendim (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;
}

Animasyonunuzu istediğiniz kadar (çarparak) ve istediğiniz yere (x ve y'ye ekleme / çıkarma) dönüştürmek için xve ydeğişkenlerini dönüştürmelisiniz .

Bu kodu test etmedim, ama bence işe yaramalı. Bu, herhangi bir sayıda noktaya sahip herhangi bir çokgen için de çalışmalıdır (çokgeni oluşturmak için kodun bir kısmını da kullanabilirsiniz).


1

Verilen:

a=total time

perimeter = WIDTH *2 + HEIGTH * 2;

Çevre T1nasıl zaman verilir P(rekt pozisyonu 0,0 olarak kabul edilir)?

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

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

Şimdi (beni yedek umut) bazı kolay birincil scool geometri ve matematik elde etmek P.xve P.ygelendistT1

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.