ঘড়ির কাঁটার ক্রমে পয়েন্টের অ্যারে বাছাই করা


16

ঘড়ির কাঁটার ক্রমে 2D পয়েন্টের অ্যারে বাছাই করার জন্য কি এমন একটি অ্যালগরিদম আছে?
আমি বিশেষত আমার ক্ষেত্রে ডান ত্রিভুজটি নিয়ে কাজ করছি তাই কেবল 3 পয়েন্ট।

তবে আমি জানতে আগ্রহী যে এই জাতীয় একটি অ্যালগরিদম রয়েছে কিনা, যদি না হয় তবে আমার ত্রিভুজটির 3 টি পয়েন্টকে ঘড়ির কাঁটার ক্রমে ফেরত দেওয়ার সহজ উপায় কী?

সম্পাদনা: আমি বহুভুজের সেন্ট্রয়েডের তুলনায় ঘড়ির কাঁটার পয়েন্টগুলি গণনা করার চেষ্টা করছি, যা উত্তল।

আপডেট: নির্বাচিত উত্তরের উপর ভিত্তি করে আমি এটি প্রয়োগকরণ শেষ করেছিলাম, এটি কার্য সম্পাদন সমালোচনামূলক নয় এবং কেবল একবারে ঘটে যখন এটি কার্যকর হয়।

ArrayList<PVector> pointList = new ArrayList<PVector>();
pointList.add(A);
pointList.add(B);
pointList.add(C);
Collections.sort( pointList, new TriangleVectorComparator(origin) );

return pointList;

// Comparator
package triangleeditor;

import java.util.Comparator;

import processing.core.PVector;

public class TriangleVectorComparator implements Comparator<PVector>  {
    private PVector M; 
    public TriangleVectorComparator(PVector origin) {
        M = origin;
    }

    public int compare(PVector o1, PVector o2) {
        double angle1 = Math.atan2(o1.y - M.y, o1.x - M.x);
        double angle2 = Math.atan2(o2.y - M.y, o2.x - M.x);

        //For counter-clockwise, just reverse the signs of the return values
        if(angle1 < angle2) return 1;
        else if (angle2 < angle1) return -1;
        return 0;
    }

}

1
রিটার্ন এঙ্গেল 1 <অ্যাঙ্গেল 2 হতে পারে? 1: কোণ 2> কোণ 1? -1: 0;
ademar111190

2
এটি বিভিন্ন উপায়ে প্রকাশ করা যেতে পারে তবে আমি নেস্টেড টের্নারি অপারেটরগুলি এড়াতে ঝোঁক বিশেষত উদাহরণ দেওয়ার সময়।
onedayitwillmake

@nedayitwillmake আপনি যে উত্তরটি ব্যবহার করে শেষ করেছেন সে কোডটি কী কোনও উত্তরে রূপান্তর করতে পারবেন? এটি আসলে প্রশ্নের সাথে সম্পর্কিত নয়, তবে ভবিষ্যতের পাঠকদের কাছে এটি অত্যন্ত মূল্যবান।
আনকো

@ আঙ্কো আমি মনে করি আপনি ঠিক বলেছেন, তবে একই সঙ্গে আমি মনে করি এটি এইভাবে পাওয়া লোকদের পক্ষে সবচেয়ে সহজ হবে। এটি নিশ্চিত করতেও সহায়তা করে যে আমি সামহোসেবারের উত্তরটি প্রত্যাহার করি না যা আমার উপর ভিত্তি করে তৈরি হয়েছে।
onedayitwillmake

উত্তর:


19

আপনার প্রশ্ন যথেষ্ট সুনির্দিষ্ট নয়। বিন্দুর একটি অ্যারেটি কেবলমাত্র «ঘড়ির কাঁটার দিকে a বা« এন্টি-ক্লকওয়াইজ »রেফারেন্স পয়েন্টের তুলনায়। অন্যথায়, তিনটি পয়েন্টের যে কোনও অ্যারে সর্বদা সিডাব্লু বা সিসিডাব্লু হতে পারে। নিম্নলিখিত ছবিটি দেখুন: বাম দিকে, পয়েন্টগুলি ঘড়ির কাঁটার দিকে অর্ডার করা হয়েছে; ডানদিকে, একই একই পয়েন্টগুলি অ্যান্টিক্লকওয়াইজ অর্ডার করা হয়।

ঘড়ির কাঁটা বা অ্যান্টিক্লকওয়াইজ

আপনার ক্ষেত্রে, আমি বিশ্বাস করি যে রেফারেন্স পয়েন্ট হিসাবে পয়েন্টগুলির ব্যারিসেনটার ব্যবহার করা যুক্তিসঙ্গত।

অজানা সংখ্যক পয়েন্টের জন্য একটি ভাল পদ্ধতি নিম্নলিখিত হতে পারে:

  • P[0], P[1], ... P[n-1]সাজানোর জন্য পয়েন্টগুলির তালিকা হতে দিন
  • এম সমস্ত পয়েন্টের ব্যারিসেনটার হতে দিন
  • a[0], a[1], ... a[n-1]যেমন গণনাa[i] = atan2(P[i].y - M.y, P[i].x - M.x);
  • উদাহরণস্বরূপ তাদের aমানের সাথে সম্পর্কিত পয়েন্টগুলি সাজান qsort

তবে, আপনি নিশ্চিত হয়ে উঠতে পারেন যে একটি ভাল বাছাই করা অ্যালগরিদম অ্যাড-হক পদ্ধতির তুলনায় তিনটি ইনপুট মানগুলির সাথে খারাপ আচরণ করবে। ব্যবহার atan2করা এখনও বৈধ, তবে কেবল ব্যবহার করবেন না qsort


এটি নিখুঁতভাবে কাজ করেছে :)
onedayitwillmake

1
এই পদ্ধতির একটি নাম আছে?
onedayitwillmake

1
আমি বিশ্বাস করি এটিকে কেবল po মেরু কোণ দ্বারা বাছাই »বলা হয়» এটি গ্রাহাম স্ক্যানের একটি উপাদান , উদাহরণস্বরূপ।
সাম হোচেভার

qsortতুলনায় এখানে পারফরম্যান্স হিট ক্ষুদ্র atan2

ছোট সতর্কতা: এই সম্ভাব্য বিপর্যস্ত এবং বার্ন করুন (প্রোগ্রামিং ভাষা এবং লাইব্রেরী ব্যবহার উপর নির্ভর করে) পয়েন্ট কোন ঠিক হতে হবে যদি হবে barycentre (অথবা যাই হোক না কেন অন্য বিন্দু অভিযোজন আপনার ব্যবহার করুন)। আপনি দ্বিতীয় এবং তৃতীয় ধাপের মধ্যে এই জাতীয় পয়েন্টগুলি বাদ দিতে চাইতে পারেন।
মার্টিন সোজকা

3

আমি বিশ্বাস করি আপনি এখানে যা যা জিজ্ঞাসা করছেন তা হ'ল ত্রিভুজটির বাতাসের ক্রম, যা পরীক্ষার পক্ষে আসলে খুব সহজ।

যেহেতু আপনার ত্রিভুজটিতে কেবল তিনটি পয়েন্ট রয়েছে তাই আপনার ত্রিভুজটি ইতিমধ্যে হয় ঘড়ির কাঁটার দিকে বা ঘড়ির কাঁটার বিপরীতে ক্রমযুক্ত এবং তাই আপনাকে যা করতে হবে তা হল এটি দুটি যে কোনটি তা যাচাই করে, এবং যদি ঘুরছে তবে সূচকের ক্রমটিকে বিপরীত দিকে আপনি যা চান তা নয়

এখানে একটি সাধারণ ধারণাটি ধরে নেওয়া হচ্ছে যে একটি ত্রিভুজের তিনটি উল্লম্ব হ'ল একটি , বি এবং সি এবং আপনার একটি সাধারণ ভেক্টর বিয়োগ অপারেশন রয়েছে:

Vector2 AToB = b - a;
Vector2 BToC = c - b;
float crossz = AToB.x * BToC.y - AToB.y * BToC.x;
if ( crossz > 0.0f )
{
  // clockwise
}
else
{
  // counter-clockwise.  Need to reverse the order of our vertices.
}

নোট করুন যে আপনি কীভাবে আপনার + y অক্ষগুলি (উপরে বা নীচে) কেন্দ্রিক করেছেন তার উপর নির্ভর করে, "এই ঘড়ির কাঁটা" এবং "কাউন্টার-ক্লকওয়াইজ" কেসগুলি কীভাবে আমি এই নমুনা কোডটিতে মন্তব্যগুলিতে লেবেল করেছি তার থেকে বিপরীত হতে পারে।


বহুভুজ তৈরি করার জন্য আমাকে এই পয়েন্টগুলি বক্স 2 ডি (জাভা বাস্তবায়ন) এ পাস করতে হবে। যদিও এটি আমি যা চেয়েছিলাম তা নয়, খুব ভাল অন্তর্দৃষ্টি :)
onedayitwillmake

2

আপনি আরও তথ্য দিতে পারেন? আপনি পয়েন্টগুলির সিসিডাব্লু ক্রম চান, তবে কোন বিন্দুটি ক্রমের কেন্দ্র হওয়া উচিত?

যদি আপনার বিমানটিতে কেবল ত্রিভুজ (3 পয়েন্ট) থাকে তবে আপনি ম্যাট্রিক্স থেকে নির্ধারক গণনা করতে পারেন, যেখানে লাইনগুলি পয়েন্টের স্থানাঙ্ক হয় (3 য় স্থানাঙ্ক 1 হয়)। নির্ধারকটি যদি 0 হয় তবে পয়েন্টগুলি সিসিডাব্লু ক্রমে থাকে। যদি তা না হয় তবে আপনি উদাহরণস্বরূপ শেষ দুটি পয়েন্টের জন্য পৃথক করতে পারেন এবং আপনি সিসিডাব্লু অর্ডার পাবেন।

আপনার যদি A, B, C পয়েন্ট থাকে তবে আপনার ম্যাট্রিক্সটি দেখতে এমন দেখাচ্ছে:

|xA, yA, 1|
|xB, yB, 1|
|xC, yC, 1|

নির্ধারণকারী হ'ল: xA * yB + xB * yC + xC * yA - yB * xC - yC * xA - yA * xB। তারপরে আপনি এটি শূন্যের সাথে তুলনা করতে পারেন। যদি এটি 0 হয় তবে, A, B, C রিটার্ন পয়েন্ট করুন, এটি, সি, বি ফিরে করুন return

যদি আপনার পয়েন্টগুলির সেট থাকে এবং আপনি জানেন তবে তারা উত্তল বহুভুজ তৈরি করে (সমস্ত উত্তল হলের অংশ), এবং তাদের আদেশ পেতে চান, আপনি গ্রাহাম স্ক্যান বা জার্ভিসের মার্চ ব্যবহার করতে পারেন (এগুলি অনেকগুলি পয়েন্ট থেকে উত্তল হাল খুঁজে পেতে আলগোরিদিমগুলি রয়েছে, তবে এটি এখানে কাজ করা উচিত :))


জাচারমার্জ যা বলেছিল তা পূর্ণ করতে যদি আপনি কেবল নির্দিষ্ট বিন্দুর চারদিকে ঘড়ির কাঁটার ক্রমে আপনার পয়েন্টগুলি সাজান করতে চান তবে আপনি সেই নির্দিষ্ট বিন্দু থেকে তাদের কোরস্প্যান্ডিং কোণের সাথে সমস্ত পয়েন্টগুলি সঞ্চয় করে এমন বিন্যাসের মধ্যে একটি অ্যারে তৈরি করতে পারেন এবং তারপরে বাছাই করুন যে অ্যারে।
Ali1S232
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.