मैं एक आयत के आसपास कैसे प्रक्षेपित करूं?


11

मैं एक फैंसी एनीमेशन बनाना चाहता हूं जहां एक बिंदु एक आयत के चारों ओर घूमता है। मैं एक समय में बिंदु की स्थिति को खोजना चाहता हूं t

आयत द्वारा दिया जाता है X, Y, Widthऔर Height

एक आयत, जिसके चारों ओर एक दक्षिणावर्त पथ है

क्या इसके लिए कोई एल्गोरिदम है?

मैंने हलकों के लिए sin/ उपयोग किया है cos। आयतों के समतुल्य दृष्टिकोण क्या है?


1
पूर्ण उत्तर नहीं, इसलिए टिप्पणी। मुझे नहीं लगता कि आप इस खरीद को 1/4 विभाजित कर सकते हैं यदि आपके पास क्वाड नहीं है, लेकिन एक आयत है। लेकिन आप क्या कर सकते हैं, अगर आपको पता है कि अधिकतम समय लगना चाहिए, तो यह है: परिधि की गणना करें और अपनी गति v की गणना करने के लिए सूत्र s / a = v का उपयोग करें।
M0rgenstern

जवाबों:


15

मुझे लगता है कि आपका टी 0 से 1 तक जाता है । (यदि नहीं, तो इसे उचित रूप से स्केल करने के लिए गुणा करें।)

आयत प्रक्षेप

यह पता लगाएं कि प्रत्येक पक्ष का अनुपात ( 0 - 1 ) क्या है । ( साइड लंबाई / कुल परिधि )

यह जानने के लिए कि समय टी में , हर तरफ कितना "भरा हुआ" है , पक्षों के माध्यम से पुनरावृत्त करें, उनके अनुपात को घटाएं जब तक कि टी एक नकारात्मक मूल्य से कम न हो जाए। वह अंतिम किनारा (जिसके कारण टी नेगेटिव जाता है) (साइड लेंथ + शेष) / साइड लेंथ के अनुपात से भरा जाता है । बाकी भरे नहीं हैं।

टी पर सटीक वेक्टर स्थिति प्राप्त करने के लिए , प्रत्येक पक्ष के वेक्टर को उस पक्ष के अनुपात से गुणा करें जो भरा है, और उन्हें जोड़ें।

यह वास्तव में किसी भी बहुभुज के लिए काम करता है!

मनमाना बहुभुज प्रक्षेप


2

T की साइन और कोसाइन क्रमशः x- एक्स के साथ एक कोण t बनाने वाले सर्कल पर एक बिंदु के y और x समन्वय हैं। आयत में उसके लिए कोई ज़रूरत नहीं है! एक आयत चार लाइनों से बना होता है। यदि tसे चला जाता है 0के लिए 1, यह स्थिति तक पहुँचने (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 मान होगा जो स्थिर है। उदाहरण के लिए, टी के बीच 0और a/4(और दबाने के लिए (एक्स, वाई) नीचे बाईं ओर है),

(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

मुझे नहीं पता कि इसके लिए कोई वास्तविक एल्गोरिथ्म है, लेकिन मैंने खुद को बनाया (जावा):

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चर को बदलना चाहिए (जैसा कि आप गुणा करके) और जहाँ आप चाहते हैं (x और y से जोड़ना / घटाना)।

मैंने इस कोड का परीक्षण नहीं किया है, लेकिन मुझे लगता है कि इसे काम करना चाहिए। यह किसी भी बहुभुज के लिए किसी भी अंक के साथ काम करना चाहिए (आप बहुभुज उत्पन्न करने के लिए कोड का थोड़ा भी उपयोग कर सकते हैं)।


1

दिया हुआ :

a=total time

perimeter = WIDTH *2 + HEIGTH * 2;

परिधि पर T1आने का समय P(0,0 पर सही स्थिति मानकर) दिया गया?

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

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

अब कुछ आसान प्राथमिक scool ज्यामिति और गणित (कि आशा है कि आप मुझे छोड़ने) प्राप्त करने के लिए P.xऔर P.yसेdistT1

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.