পয়েন্ট যদি কোনও দেহকে প্রবেশ করে তবে বক্স 2 ডি পরীক্ষা করুন


10

কোনও বিন্দু কোনও দেহকে ছেদ করছে কিনা তা পরীক্ষা করার কোনও উপায় আছে কি?

উদাহরণস্বরূপ, আসুন বলতে দিন যে পৃথিবীতে একটি সংস্থা রয়েছে (100,100) অবস্থানে say

(100,100) বিন্দুটি সেই দেহটিকে ছেদ করে কিনা তা পরীক্ষা করার কোনও উপায় আছে কি?

আরেকটি উদাহরণ "PHUN" নামক একটি গেমের সাথে সম্পর্কিত। PHUN এ আপনি ক্লিক করতে পারেন এবং মৃতদেহগুলি চারপাশে টেনে আনতে পারেন। মাউস পয়েন্ট কোনও দেহকে ছেদ করছে কিনা তা আপনি কীভাবে পরীক্ষা করবেন?

উত্তর:


5

কলিনের উত্তরের মতো, বি 2 ওয়ার্ল্ড.কুয়েরি () একটি দরকারী ফাংশন, আপনি যদি কেবলমাত্র একটিমাত্র পয়েন্ট coverাকতে আবাব সেট করে থাকেন তবে আপনি সেই পয়েন্টের ওভার্যাপল্যাপ করতে পারে এমন বস্তুর একটি তালিকা পেতে পারেন । তবে গতির উদ্বেগের কারণে এটি কেবল একটি ওভারল্যাপের জন্য বাউন্ডিং বক্স (এএবিবি) পরীক্ষা করে যা সর্বদা সম্পূর্ণ সঠিক নয়।

কোনও ফিক্সচার (আকৃতি, পুরানো সংস্করণগুলিতে) সঠিকভাবে যাচাই করতে, b2Fixture.TestPoint () ফাংশনটি ব্যবহার করুন। কোনও শরীরে একাধিক ফিক্সচার থাকতে পারে, এটি নিশ্চিত হওয়ার জন্য আপনাকে পুরো তালিকাটি লুপ করতে হবে। এই 2 টি ফাংশনটির সংমিশ্রণটি আপনাকে পছন্দ করতে চাইলে ফুনের কার্যকারিতা পুনরায় তৈরি করার অনুমতি দেবে।


2

b2QueryCallbackকোন ফিক্সচারগুলিতে কোনও বিন্দু রয়েছে তা অনুসন্ধান করার জন্য একবার নজর দিন এবং b2MouseJointবস্তুগুলি মাউস অনুসরণ করার জন্য ব্যবহার করে । আমার কিছু নমুনা কোড রয়েছে তবে এখনই আপনার জন্য এটি সহজ করার সময় নেই। আপনার যদি এটির প্রয়োজন হয় তবে আমি এটি পরে সরবরাহ করতে পারি।


2

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

বিকল্প পাঠ
(উত্স: co.uk )

সবুজ বিন্দু হ'ল মাউসের অবস্থানগুলি, লাল আকারের অভ্যন্তরে জানার পয়েন্ট।

প্রান্তের কেস রয়েছে - যদি পয়েন্টগুলিতে যোগ হওয়া লাইনটি একটি প্রান্তের সাথে মিলিত হয়, উদাহরণস্বরূপ - তবে এটি আপনাকে সেখানে 90% পথ পাবে।


0

আমি জানি এই প্রশ্নটি পুরানো তবে আমার মনে হচ্ছে এটি একটি সাধারণ, কোড ভিত্তিক উত্তর অনুপস্থিত। সুতরাং এটি এখানে:

    /// <summary>
    /// Return if a given position is inside the physical body.
    /// </summary>
    /// <param name="body">Body to test.</param>
    /// <param name="position">Position to check if inside the body.</param>
    /// <returns>If given point is inside the physical body.</returns>
    public bool TestPointCollision(FarseerPhysics.Dynamics.Body body, Vector2 position)
    {
        // get body transformation
        FarseerPhysics.Common.Transform trans;
        body.GetTransform(out trans);

        // iterate fixtures to see if any of them hit the point
        foreach (var fix in body.FixtureList)
        {
            if (fix.Shape.TestPoint(ref trans, ref position))
                return true;
        }

        // if there are no hits, return false
        return false;
    }

মনে রাখবেন যে এটি সরল বক্স 2 ডি নয় তবে ফারসিয়ার (এবং সি # তে), তবে এটির ঠিক একই API থাকা উচিত।

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