Làm thế nào để tôi nội suy xung quanh một hình chữ nhật?


11

Tôi muốn tạo ra một hình ảnh động lạ mắt trong đó một điểm di chuyển xung quanh một hình chữ nhật. Tôi muốn tìm vị trí của điểm tại một thời điểm t.

Hình chữ nhật được đưa ra bởi X, Y, WidthHeight.

một hình chữ nhật, với một đường dẫn theo chiều kim đồng hồ xung quanh nó

Có một thuật toán cho điều này?

Tôi đã sử dụng sin/ coscho các vòng kết nối. Cách tiếp cận tương đương cho hình chữ nhật là gì?


1
Không phải là một câu trả lời đầy đủ, do đó một nhận xét. Tôi không nghĩ bạn có thể chia số tiền mua này 1/4 nếu bạn không có hình tứ giác, nhưng hình chữ nhật. Nhưng những gì bạn có thể làm, nếu bạn biết thời gian tối đa cần phải đi xung quanh là: Tính chu vi s và sử dụng công thức s / a = v để tính tốc độ của bạn v.
M0rgenstern

Câu trả lời:


15

Tôi sẽ giả sử t của bạn đi từ 0 đến 1 . (Nếu không, chỉ cần nhân lên để nhân rộng nó một cách thích hợp.)

nội suy hình chữ nhật

Chỉ ra tỷ lệ ( 0 - 1 ) mỗi bên là chu vi. ( chiều dài bên / tổng chu vi )

Để tìm thấy bao nhiêu của mỗi bên được lấp đầy trong các thời điểm t , hãy lặp đi lặp lại qua các bên, trừ đi tỷ lệ của chúng cho đến khi t bị cạn kiệt thành một giá trị âm. Rìa cuối cùng (khiến t trở nên âm) được lấp đầy bởi một tỷ lệ (chiều dài cạnh + còn lại) / chiều dài cạnh . Phần còn lại không được lấp đầy.

Để có được vị trí vectơ chính xác tại t , nhân mỗi vectơ vectơ với tỷ lệ của cạnh đó được điền và thêm chúng.

Điều này làm việc cho bất kỳ đa giác thực sự!

nội suy đa giác tùy ý


2

Sin và cos của t lần lượt là tọa độ y và x của một điểm trên đường tròn tạo thành một góc t với trục x. Không cần điều đó trong một hình chữ nhật! Một hình chữ nhật được làm bằng bốn dòng. Nếu tđi từ 0đến 1, nó đạt đến điểm (px,py)tại t==0và đến (qx,qy)tại t==1với đường được cho bởi:

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

nếu thay vì 01, thời gian của bạn đi từ t0đến t1, bạn có thể bình thường hóa thời gian trước và sau đó áp dụng công thức trên.

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

Bây giờ, đối với bạn hình chữ nhật, chia thành bốn trường hợp với một ifcạnh cho mỗi cạnh bao gồm một trong những khoảng thời gian và áp dụng một chuyển động dòng.

Lưu ý rằng nếu hình chữ nhật của bạn được căn chỉnh theo trục, bạn sẽ luôn có giá trị x hoặc giá trị y không đổi. Chẳng hạn, với t giữa 0a/4(và giả sử (X, Y) ở dưới cùng bên trái),

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

Điều này cũng tương đương với:

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

1

Tôi không biết có một thuật toán thực tế cho việc này không, nhưng tôi đã tự tạo một thuật toán (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;
}

Bạn nên chuyển đổi các biến xybiến để có được hình động của bạn lớn hay nhỏ như bạn muốn (bằng cách nhân) và nơi bạn muốn (thêm vào / trừ từ x và y).

Tôi đã không kiểm tra mã này, nhưng tôi nghĩ nó sẽ hoạt động. Điều này cũng sẽ làm việc cho bất kỳ đa giác với bất kỳ số điểm (bạn cũng có thể sử dụng một chút mã để tạo đa giác).


1

Được :

a=total time

perimeter = WIDTH *2 + HEIGTH * 2;

Cho thời gian T1làm thế nào để có được Ptrên chu vi (giả sử vị trí trực tràng ở 0,0)?

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

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

bây giờ một số hình học và toán học sơ cấp dễ dàng (hy vọng bạn dành cho tôi) để có được P.xP.ytừdistT1

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.