আমি একটি আয়তক্ষেত্রের চারপাশে কীভাবে বিভক্ত করব?


11

আমি একটি অভিনব অ্যানিমেশন তৈরি করতে চাই যেখানে পয়েন্টটি একটি আয়তক্ষেত্রের চারপাশে ভ্রমণ করে। আমি একবারে পয়েন্টের অবস্থানটি খুঁজতে চাই t

আয়তক্ষেত্র দেওয়া হয় X, Y, Widthএবং Height

একটি আয়তক্ষেত্র, এর চারদিকে ঘড়ির কাঁটা পথ path

এর জন্য কি অ্যালগরিদম আছে?

আমি sin/ cosচেনাশোনাগুলির জন্য ব্যবহার করেছি । আয়তক্ষেত্রগুলির জন্য সমতুল্য পদ্ধতির কী?


1
একটি সম্পূর্ণ উত্তর নয়, সুতরাং একটি মন্তব্য। আমি মনে করি না আপনি এই কিনে 1/4 বিভক্ত করতে পারেন যদি আপনার কাছে কোয়াড না থাকে তবে একটি আয়তক্ষেত্র থাকে। তবে আপনি কী করতে পারেন, যদি আপনার চারপাশে যেতে সর্বোচ্চ সময়টি জানা উচিত তবে তা হল: পরিধিটি গণনা করুন এবং আপনার গতি v গণনা করতে s / a = v সূত্রটি ব্যবহার করুন
এম0rgenstern

উত্তর:


15

আমি ধরে নিচ্ছি আপনার টি 0 থেকে 1 পর্যন্ত চলেছে । (যদি তা না হয় তবে সঠিকভাবে এটি স্কেল করতে কেবল গুণ করুন))

আয়তক্ষেত্র বিরতি

প্রতিটি পাশের পরিধিটি কতটি অনুপাত ( 0 - 1 ) নির্ধারণ করুন। ( পার্শ্ব দৈর্ঘ্য / মোট পরিধি )

প্রতিটি পক্ষের কত সময় " টি " পূরণ করা হয় তা টিয়ের জন্য , পক্ষগুলির মাধ্যমে পুনরাবৃত্তি করুন, টি-টি একটি নেতিবাচক মানের অবধি না হওয়া অবধি তাদের অনুপাত বিয়োগ করে । সেই শেষ প্রান্তটি (যার ফলে টি নেতিবাচক হতে পারে) (পাশের দৈর্ঘ্য + অবশিষ্ট) / পাশের দৈর্ঘ্যের একটি অনুপাত দ্বারা পূর্ণ হয় । বাকীগুলো পূরণ হয় না।

টি তে সঠিক ভেক্টর অবস্থান পেতে , প্রতিটি পাশের ভেক্টরটি যে দিকটি ভরা হয়েছে তার অনুপাত অনুসারে গুণিত করুন এবং সেগুলি যুক্ত করুন।

এটি আসলে যে কোনও বহুভুজের জন্য কাজ করে!

যথেচ্ছ বহুভুজ ইন্টারপোলেশন


2

টি এর সাইন এবং কোসাইন যথাক্রমে x- অক্ষের সাথে একটি কোণ টি গঠন করে বৃত্তের বিন্দুর 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জন্য, প্রতিটি প্রান্তের জন্য একটি চারটি ক্ষেত্রে বিভক্ত করুন যা সময়ের ব্যবধানের একটিকে আবরণ করে এবং একটি লাইন চলাচল প্রয়োগ করে।

লক্ষ্য করুন যে আপনার আয়তক্ষেত্রটি অক্ষ-সংযুক্ত থাকলে আপনার সর্বদা এক্স-মান বা y মান থাকে যা ধ্রুবক। উদাহরণস্বরূপ, মধ্যে T জন্য 0এবং a/4(এবং ত (x, y) নীচে বাঁদিকের হয়),

(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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.