আমি কীভাবে বলতে পারি যে কোনও বস্তু সংযুক্ত পথের চারদিকে CW বা সিসিডাব্লু চলাচল করছে কিনা?


19

বলুন আমাদের ঝাঁকুনিযুক্ত আকার রয়েছে:

shape0

এবং দুটি প্রাণী এর বাহ্যরেখার সাথে চলমান।

তারপরে আমরা কোণগুলি বাইরে টেনে পুরোপুরি আকারটি মসৃণ করি।

আমরা এটি পেয়েছি:

মসৃণ

এখন দেখতে পাওয়া যায় যে কমলা সিডাব্লু এবং সবুজ সিসিডাব্লু চলছে। আমি কীভাবে বলতে পারি যে তারা আকৃতিটি বাদ না দিয়ে কোনও দিকে এগিয়ে চলেছে?

নতুন চিত্র

এখানে চিত্র বর্ণনা লিখুন


এখানে আমার 2 সেন্ট রয়েছে: i.imgur.com/zrBdw.png
কেন্ডল ফ্রে

উত্তর:


27

অনন্তের জন্য একটি লাইন আঁকুন এবং জীবটি যে অংশটি পড়েছেন সেটিকে গণনা না করে আপনি আকারটি (এমনকি বা বিজোড়) কতবার অতিক্রম করেছেন তা গণনা করুন। তারপরে প্রাণীটি এই লাইনের বামে বা ডানে যাচ্ছে কিনা তা পরীক্ষা করে দেখুন।

উদাহরণ

এই উদাহরণস্বরূপ, আমরা আকারটি দুইবার (তাই এমনকি) অতিক্রম করি এবং আমরা বাম দিকে যাই। ফলাফল এই টেবিল থেকে তাত্ক্ষণিক:

   # Crosses | even  | odd
  Direction  |       |
-------------+-------+------
    left     | CCW   |  CW
    right    |  CW   | CCW

সিউডোকোডে:

x, y = position of creature
vx, vy = direction of creature movement
crossings = 0
for each x1, y1, x2, y2 in shape segments:
    if (x1 < x and x <= x2) or (x2 < x and x <= x1):
        if y - y1 > (x - x1) * (y2 - y1) / (x2 - x1):
            ++crossings
if (crossings & 1) == (vx < 0):
    return CW
else
    return CCW

আপনি কি লাইনের জীবকে এগিয়ে চলছেন?
Ali1S232

@ গাজু: না, সুতরাং>> এর পরিবর্তে> = লাইনে 6.. আমি এই সম্পর্কে একটি নোট যুক্ত করব। তবে নোট করুন যে আপনি লাইনটি অন্তর্ভুক্ত করতে পারেন, এবং কেবল সারণির সামগ্রীগুলিকে বিপরীত করতে পারেন।
সাম হোচেভার

1
আমি এই পদ্ধতির উপর ভিত্তি করে একটি উত্তর দেওয়ার, এবং আমি যে উত্তর দিয়েছিলাম তার মধ্যে টস করছিলাম। আমি আনন্দিত যে আমাদের উভয় পদ্ধতির এখানে প্রতিনিধিত্ব করা হয়েছে। এইটি ধারণামূলকভাবে সহজ এবং খুব মার্জিত, তবে লাইন সেগমেন্ট ছেদ পরীক্ষা পরীক্ষা করা দরকার, যা দৃ make় করতে জটিল হতে পারে।
ট্রেভর পাওয়েল

পছন্দ করুন দূরের প্রান্তটি সন্ধান করা বিভ্রান্তিকর হতে পারে। আমি প্রথমে প্রান্তের সবচেয়ে দূরবর্তী শীর্ষটি অনুসারে এবং তারপরে আমি আকৃতির কেন্দ্র থেকে এবং দুটি প্রান্তের কেন্দ্র (দুটি যেটি ভার্টেক্স ভাগ করে নিয়েছি) দিয়ে একটি রেখা আঁকতে এবং লাইনগুলির কোনও একটি অন্য প্রান্তটি পেরিয়ে যাওয়ার পথে দেখেছি কিনা তা পরীক্ষা করে দেখেছি এই প্রান্তগুলির একটি পেরোনোর ​​পরে অনন্ত এটি
ঠিকঠাকভাবে

5

এটি আপনার আকারের ডেটা কাঠামো থেকে আপনি কী তথ্য পেয়েছেন তার উপর নির্ভর করে, তবে কোনও আকারের বাহ্যরেখা বরাবর একটি সিভিডাব্লু চলমান সি ডাব্লু সর্বদা ডানদিকে আকৃতির অভ্যন্তর থাকবে এবং সৃজনশীল সিসিডাব্লুতে আকারের অভ্যন্তর থাকবে এটি বাম


অনেক সহজ সমাধান, এবং আমার প্রথম চিন্তা।
পরিবর্ধিত করুন

আপনি কীভাবে জানবেন যে আকৃতির ভিতরে কোন দিকটি রয়েছে? আমি বোঝাতে চাইছি আকারের ভিতরে একটি প্রান্তে অগ্রসর হওয়া হয় আপনার বাম দিকে বা ডানদিকে। আপনি কিভাবে জানেন যে এটি কোন উপায়?
Ali1S232

একটি খুব মার্জিত সমাধান, তবে সাধারণভাবে সত্য নয়। দ্বি-মাত্রিক আকার তৈরি করতে একটি টেবিলের উপর সমতল একটি ডোনাট কল্পনা করুন। আপনি এই আকারের প্রান্তটি ধরে হাঁটতে পারেন, আপনার বাম দিকে আকৃতির অভ্যন্তরটি রাখতে পারেন এবং আপনি যেখানে শুরু করেছিলেন তার উপর নির্ভর করে একটি ঘড়ির কাঁটা বা একটি ঘড়ির কাঁটার দিকের ল্যাপ তৈরি করতে পারেন।
টমাস

4
  1. আপনার আকারের কেন্দ্রবিন্দু গণনা করুন।
  2. কেন্দ্র থেকে আপনার আকৃতির সবচেয়ে দূরের প্রান্তটি চয়ন করুন।
    • (সর্বাধিক দূরত্বে প্রান্তটি বাছাই করা নিশ্চিত করে যে আপনি আকৃতির উল্টানো, অবতল অংশ থেকে শুরু করবেন না, যার ফলে পুরো আকারের জন্য ঘড়ির কাঁটা / অ্যান্টিલોকওয়াইজ দৃ determination়প্রতিজ্ঞার পিছনে ফিরে আসবে)
  3. এই প্রান্তটি দিয়ে ঘড়ির কাঁটার দিকটি নির্ধারণ করুন
    • (এটির একটি সাধারণ বাস্তবায়নটি আকৃতির কেন্দ্র থেকে নির্বাচিত প্রান্তের প্রতিটি প্রান্তের সাথে কোণগুলির তুলনা করে involve
  4. ধাপের 2 টিতে আপনি যে প্রান্তটি বেছে নিয়েছেন, প্রান্তটি শুরু করে প্রান্তের একটি তালিকা তৈরি করে, আকারের সমস্ত প্রান্তগুলিতে বিভক্ত করুন। প্রতিটি প্রান্তের জন্য, ঘড়ির কাঁটার ক্রমে এটির দুটি শীর্ষে সঞ্চয় করুন।
    • (যদি সময়ের সাথে সাথে আপনার আকৃতি পরিবর্তন না হয় তবে আপনি পরে ব্যবহারের জন্য এই প্রান্ত তালিকাটি সংরক্ষণ করতে পারেন, তাই আপনাকে প্রতিটি ফ্রেমে প্রথম চারটি ধাপ করতে হবে না)
    • (আপনার কাছে ইতিমধ্যে প্রান্তের তালিকা থাকতে পারে so যদি তাই হয় তবে আপনি এই একই তালিকায় এই ঘড়ির কাঁটার দিকের ভার্টেক্স ক্রম সংরক্ষণ করতে পারেন))
  5. কোনও সত্তা ঘড়ির কাঁটার দিকে বা অ্যান্টিকলক দিকে অগ্রসর হচ্ছে কিনা তা নির্ধারণ করতে:
    • সত্তাটি কোন প্রান্তটি বরাবর চলছে তা নির্ধারণ করুন।
    • প্রান্তটির ঘড়ির কাঁটা থেকে শুরু করা>> শেষ প্রান্ত থেকে আপনি যে পদক্ষেপ 4 এ ফিরে নির্ধারণ করেছেন সে থেকে ভেক্টরের বিরুদ্ধে চলাচলের সত্তার দিকের কোনও বিন্দু পণ্যটি করুন।
    • যদি ডট পণ্যের ফলাফলটি শূন্যের চেয়ে বড় হয় তবে সত্তাটি ঘড়ির কাঁটার দিকে এগিয়ে চলেছে। শূন্যের চেয়ে কম মানে অ্যান্টলিকওয়াইজ।

খুব চতুর উত্তর
উলফডন

আমি একটু প্রশ্ন পেয়েছি? ধরে নিচ্ছি যে তার আকারের শীর্ষাংশগুলি সর্বাধিক বামদিকের সিডাব্লুডাব্লু থেকে শুরু হয়েছে, আপনার উত্তরের ভিত্তিতে আমি কীভাবে বলতে পারি যে 10-> based বা 9-> 10 (শূন্য ভিত্তিক) থেকে ঘড়ির কাঁটার দিকে এগিয়ে চলেছে?
Ali1S232

আপনি সর্বাধিক দূরত্বে প্রান্তটি দিয়ে শুরু করুন এবং সেই প্রান্তটি দিয়ে কী দিকটি ঘড়ির কাঁটার দিক দিয়ে সন্ধান করুন। ধরা যাক যে প্রান্ত A হ'ল প্রান্তটি 'এ' থেকে 'বি' থেকে ঘড়ির কাঁটা। তারপরে যদি আমরা বি প্রান্তে চলে যাই (যার উল্লম্ব 'বি' এবং 'সি' রয়েছে), আমরা জানি যে 'বি' খ থেকে 'সি' পর্যন্ত ঘড়ির কাঁটার দিকে। একইভাবে, এজ সিটি 'সি' থেকে 'ডি' পর্যন্ত ঘড়ির কাঁটাতে চলেছে। একবার যখন আমরা এক প্রান্ত থেকে সঠিক ঘড়ির কাঁটা দিকটি জানতে পারি (পদক্ষেপের 1-3), আকৃতির প্রান্তগুলির চারপাশে সেই ঘড়ির কাঁটার দিকটি অবিরত রেখে আমরা প্রতিটি প্রান্তের জন্য সঠিক 'ঘড়ির কাঁটা' দিকটি নির্ধারণ করতে পারি, এটির প্রান্তটি কোথায় রয়েছে তা না দেখে, সুতরাং উত্তাপ ঠিক আছে।
ট্রেভর পাওয়েল

আপনি A কী ঘড়ির কাঁটার দিকটি 'a' থেকে 'b' বা 'ঘ' থেকে 'ক' থেকে 'ক' তে চলেছেন তা আপনি কীভাবে বলতে পারেন? আমি মনে করি আপনি সেই অংশটি মিস করেছেন।
Ali1S232

@ গাজু এটি প্রথম পদক্ষেপের প্রথম পয়েন্ট।
ট্রেভর পাওয়েল

2

বহুভুজের কোন দিকটি সংজ্ঞায়িত করা হয়েছে, কোন দিকটি এটির দ্বারকে ঘিরে আছে তা আপনাকে জানতে হবে।

আপনি যদি এটি জানেন না, তবে বহুভুজের ক্ষেত্রফল গণনা করে এটি কার্যকর করতে পারেন:

float Polygon::area() {
    float result = 0.0f;

    for(int a = 0; a < vertexCount; a ++) {
        int b = (a+1) % vertexCount;
        result += vertices[a].x * vertices[b].y;
        result -= vertices[a].y * vertices[b].x;
    }

    return result * .5f;
}

চিহ্ন ফলাফল (ইতিবাচক বা নেতিবাচক) আপনাকে বলতে হবে এটা ঘড়ির কাঁটার দিকে বা ঘড়ির কাঁটার কিনা করুন। আপনার পক্ষে এটি কোন দিকের জন্য এটি চেষ্টা করে দেখার দরকার কারণ এটি আপনার সমন্বিত সিস্টেমের উপর নির্ভর করে।

আকৃতিটি যদি ঘড়ির কাঁটার দিকে থাকে:

  • আকারে এগিয়ে যাওয়া একটি প্রাণী ঘড়ির কাঁটার দিকে এগিয়ে চলেছে , এবং
  • জীব যাচ্ছে অনগ্রসর আকৃতি গোলাকার যাচ্ছে বামাবর্তে

যদি আকৃতিটি অ্যান্টলক্লোভাইড হয়:

  • একটি প্রাণী আকারের চারদিকে এগিয়ে চলেছে এবং অ্যান্টলোকের দিকে চলছে
  • একটি প্রাণী আকৃতির পিছনে যাচ্ছে ঘড়ির কাঁটার দিকে যাচ্ছে ।

0

দেখে মনে হচ্ছে ট্রেভর ইতিমধ্যে এই প্রশ্নটি coveredেকে রেখেছে, তবে এটিই আমার সমাধান:

  1. আপনার আকারটি বোঝায় এমন ক্ষেত্রটি গণনা করুন

    area = 0
    foreach (edge in shape)
        area += edge.begin.x * edge.end.y - edge.begin.y * edge.end.x
  2. উপরের মতো গণনা করা অঞ্চল ব্যবহার করে আপনি সহজেই বলতে পারবেন আকারটি নিজেই ঘড়ির কাঁটার দিকে আছে কিনা। এটি কেবল ঘড়ির কাঁটার দিকে যদি ক্ষেত্র শূন্যের নীচে থাকে।

  3. অবজেক্ট (গুলি) একইভাবে চলমান কিনা তা পরীক্ষা করুন যেভাবে উল্লম্ব ক্রম বা বিপরীত দিকে চলছে।


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