একটি ষড়ভুজ ক্লিকবক্স সনাক্ত করা


17

আমি একটি খেলা যে জড়িত যাচ্ছে কাজ করছি খাবি hexagons।

বর্তমানে, আমি একটি ষড়ভুজ চিত্রটি ব্যবহার করছি যা আমি ব্যবহার করছি (সমস্ত পক্ষই একই দৈর্ঘ্য ... এটি 50px বাই 50px চিত্রের সাথে ফিট করে)।

আমি সি # তে কিছুটা নতুন এবং এক্সএনএ-তে আসলেই নতুন, তবে বিন্দু এবং কোণগুলির উপর ভিত্তি করে যদি বিবৃতি দেওয়া যায় তবে আমি কল করতে পারি এমন কোন সহজ পদ্ধতি আছে?


গেমদেব.স্ট্যাকেক্সেঞ্জাওয়েজ / প্রশ্নগুলি / 6363২২/২ দেখুন যা হেক্স ক্লিক সনাক্তকরণ কার্যকর করে।
টিম হল্ট

4
আমি পুরোপুরি গুগলড "হাঁপা হেক্সাগন" আমার মতো ছিলাম, "এ কেমন ধরণের ষড়যন্ত্র ?!" অনুমান করুন আমি খুব ধীর দিন পার করছি।
MichaelHouse

2
হুম আপনি যদি ষড়ভুজের চেয়ে হাঁপাতে ক্লিক করেন তবে কি হবে?
টিম হল্ট

1
আপনার প্রয়োজনের উপর নির্ভর করে, একটি সরল চেনাশোনা এটি করতে পারে যদি এটি কেবলমাত্র একটি ক্লিক অঞ্চলের জন্য। অন্যথায় আপনাকে বহুভুজন কৌশল সম্পর্কিত যেমন একটি বাতাসের সমষ্টি বা সুমসুচ ব্যবহার করতে হবে।
ফিলিপেকে

হেক্স ম্যাপটি নির্বিচারে আবর্তিত না করা অবধি, বহুভুজের উপর বিন্দু হ'ল মেজর ওভারকিল। 1000x1000 হেক্সেসের মানচিত্রে আপনি কী করবেন? প্রত্যেকটি পরীক্ষা করে দেখুন? RE: চেনাশোনাগুলি, তারা কাজ করবে না। তিনটি হেক্সের মধ্যবর্তী জংশন শীর্ষে আপনার কাছে তিনটি চেনাশোনা ওভারল্যাপিং থাকবে। সম্পূর্ণ হেক্সসের মধ্যে থাকা ছোট ছোট চেনাশোনাগুলির ফাঁকগুলি থাকবে যেখানে লাইট ক্লিকগুলি কোনও বৃত্তে থাকবে না।
টিম হল্ট

উত্তর:


18

একটি ষড়ভুজ হল কাটা কোণগুলির সাথে একটি আয়তক্ষেত্র। আমি যেভাবে এটি দেখেছি এবং শুনেছি সভ্যতার ধারাবাহিকতাটি অर्थোগোনাল মানচিত্রের সাথে এটি করে তা হ'ল একটি সাদা স্থান (অर्थোগোনাল বা ষড়ভুজ) এবং একটি লাল, সবুজ, নীল এবং হলুদ দিয়ে একটি বিটম্যাপ তৈরি করা is কোণ। (বা আপনি যে রঙ পছন্দ করুন।)

ষড়ভুজ: হেক্স মুখোশবাএখানে চিত্র বর্ণনা লিখুন

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

তারপরে, কার্সারটি কোন আয়তক্ষেত্রটি শেষ হয়েছে তা নির্ধারণ করুন এবং সেই স্থানে পিক্সেলের রঙটি পরীক্ষা করুন। যদি এটি সাদা হয় তবে তারা সেই জায়গার উপর ঘুরে বেড়াচ্ছে। একে অপরের রঙকে একটি অফসেটে ম্যাপ করা হয় এবং তারা তার পরিবর্তে সেই ষড়জাগরণের উপর ঘুরে বেড়াচ্ছে। এই উপায়টি দক্ষ, সামান্য জ্যামিতি নেয় এবং যেকোন যথেচ্ছ পরীক্ষামূলক স্থানের জন্য ব্যবহার করা যেতে পারে।


কেবলমাত্র একটি নোট: একটি ষড়ভুজটির 6 টি সমান দৈর্ঘ্যের দিক রয়েছে। আপনার উপস্থাপিত চিত্রগুলির কোনওটিতেই হেক্সাগন নেই। পরিবর্তে, তারা 6 পার্শ্বযুক্ত বহুভুজ ধারণ করে। তা ছাড়া এই পদ্ধতিটিও কাজ করে। বৃহত্তর হেক্সাগনগুলির জন্য এটি হেক্সাগনের সীমানা গণনা করার চেয়ে সম্ভবত ধীরে ধীরে, কারণ এই পদ্ধতিতে বৃহত্তর হেক্সাগনগুলির জন্য আরও স্থান প্রয়োজন (যদি আপনি প্রতি পিক্সেল যথার্থতা রাখতে চান)। ছোট হেক্সাগনগুলির জন্য (এবং হার্ডওয়্যারের উপর নির্ভর করে) এই পদ্ধতিটি সম্ভবত সীমানাগুলি গণনা করার চেয়ে দ্রুত।
ওলহভস্কি

9
একটি ষড়ভুজ হ'ল যে কোনও 6 পার্শ্বযুক্ত বহুভুজ। আপনি কি চিন্তা করা হয় একটি হল সমবাহু ষড়ভূজ (আসলে, আপনি সম্ভবত একটি করার চিন্তা করছেন নিয়মিত ষড়ভূজ, যা সমবাহু হল এক ধরনের এবং সমকোণী ষড়ভূজ)
Random832

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

2
@ ওলোভস্কি - আমি এখানে একটি নিখুঁত ষড়্ভুজ মুখোশ তৈরি করি নি কারণ আমি কাজ করার সময় আমার কয়েক মিনিটের বিরতিতে কমিউনিটি সার্ভিস হিসাবে প্রশ্নের উত্তর দিচ্ছি, এবং আসলে কোনও ভিডিও গেম লিখছি না। ওপি কম গণিতের সাথে সমাধানের সন্ধান করছিল, এবং আমি ভাবলাম এটি পরিষ্কার ছিল তাই আমি ভেবেছিলাম ভাগ করে নেব, কারণ এটি এমন কিছু যা আমি অবশ্যই নিজেরাই ভাবেননি।
dlras2

18

ষড়ভুজ হিট পরীক্ষা করে এমন কোনও এক্সএনএ পদ্ধতি নেই।

এই নিবন্ধটি ব্যাখ্যা করে যে কীভাবে কোনও ফাংশন লিখতে হয় যা পরীক্ষা করে, এবং আপনাকে ফাংশন দেয়:

কোনও পয়েন্ট হেক্সাগনের অভ্যন্তরে রয়েছে কিনা তা কীভাবে পরীক্ষা করবেন

এখানে এই নিবন্ধ থেকে একটি সংক্ষিপ্তসার: ষড়ভুজ ক্লিক বাক্স

এবং পরীক্ষাটি করে এমন ফাংশনটি এরকম হয়:

  1. ষড়ভুজের চারদিকে বাউন্ডিং বক্সটি পরীক্ষা করুন, এটি ছেদ না করলে তাড়াতাড়িই।
  2. উপরের মতো দেখায় পয়েন্টটি স্থানীয় কোয়াড্রেন্টে রূপান্তর করুন।
  3. isInsideস্থানীয় কোয়াড্রেন্টের জন্য নিম্নলিখিত পরীক্ষা করুন ।

public function isInside(pos:Vec2Const):Boolean
{
    const q2x:Number = Math.abs(pos.x - _center.x);       
    const q2y:Number = Math.abs(pos.y - _center.y);
    if (q2x > _hori || q2y > _vert*2) 
        return false;
    return 2 * _vert * _hori - _vert * q2x - _hori * q2y >= 0;
}

সম্পূর্ণ বিশদ জন্য নিবন্ধটি দেখুন।


এখানে আরও কিছু দরকারী সম্পর্কিত উত্স রয়েছে:


1

এখানে আমি একটি পদ্ধতি পেয়েছি যা যে কোনও বহুভুজের ভিতরে ক্লিকগুলি সনাক্ত করতে ব্যবহার করা যেতে পারে:

public bool PointInPolygon( Vector2 p, Vector2[] poly )
    {
        Vector2 p1, p2;
        bool inside = false;

        if( poly.Length < 3 )
        {
            return inside;
        }

        Vector2 oldPoint = new Vector2( poly[poly.Length - 1].X, poly[poly.Length - 1].Y );

        for( int i = 0; i < poly.Length; i++ )
        {
            Vector2 newPoint = new Vector2( poly[i].X, poly[i].Y );

            if( newPoint.X > oldPoint.X )
            {
                p1 = oldPoint;
                p2 = newPoint;
            }
            else
            {
                p1 = newPoint;
                p2 = oldPoint;
            }

            if( ( newPoint.X < p.X ) == ( p.X <= oldPoint.X )
                && ( (long)p.Y - (long)p1.Y ) * (long)( p2.X - p1.X )
                 < ( (long)p2.Y - (long)p1.Y ) * (long)( p.X - p1.X ) )
            {
                inside = !inside;
            }

            oldPoint = newPoint;
        }

        return inside;
    }

আপনাকে আপনার ষড়ভুজের কোণগুলি একটি ভেক্টর 2 অ্যারে (পলি) এবং ক্লিক করা অবস্থান (পি) পদ্ধতিতে দেওয়া দরকার।

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