আমি কীভাবে একটি বিন্দু এবং অক্ষ-সংযুক্ত আয়তক্ষেত্রের মধ্যে দূরত্ব গণনা করব?


29

আমার কাছে এক্স, ওয়াই অবস্থান, উচ্চতা এবং প্রস্থ এবং একটি এলোমেলোভাবে পজিশন পয়েন্ট সহ একটি 2 ডি আয়তক্ষেত্র রয়েছে।

নির্দিষ্ট দুরত্বের কাছাকাছি থাকলে এই পয়েন্টটি আয়তক্ষেত্রের সাথে সংঘর্ষ হতে পারে কিনা তা দেখার কোনও উপায় আছে? Point বিন্দুটির বাইরে একটি অদৃশ্য ব্যাসার্ধ কল্পনা করে বললাম আয়তক্ষেত্রের সাথে সংঘর্ষ হয়। এটি কেবল বর্গক্ষেত্র নয় বলে আমার সমস্যা আছে!

উত্তর:


26

যদি (x,y)আয়তক্ষেত্রের কেন্দ্র হয় তবে আয়তক্ষেত্রের (px,py)সীমানা থেকে বিন্দু থেকে চৌকো দূরতাকে এইভাবে গণনা করা যায়:

dx = max(abs(px - x) - width / 2, 0);
dy = max(abs(py - y) - height / 2, 0);
return dx * dx + dy * dy;

যদি সেই স্কোয়ার দূরত্বটি শূন্য হয়, এর অর্থ বিন্দুটি স্পর্শ করে বা আয়তক্ষেত্রের অভ্যন্তরে।


6
অন্য যে কেউ ভাবছেন, এর জন্য (x, y) আয়তক্ষেত্রের কেন্দ্র, কোণ নয়
গ্রেগ রোজমেরিওয়েজ

2
পুরানো মন্তব্যের জন্য দুঃখিত, তবে এই সমীকরণটি কি অনুমান করে যে আয়তক্ষেত্রটি অক্ষ-বিন্যস্ত?
বিটনিঞ্জা

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

বলুন, বিন্দুটি (4: 4), আয়তক্ষেত্রটি প্রস্থ / উচ্চতা (5: 5) সহ (5: 5) এ রয়েছে। আপনার কোডটি দাবী করবে যে পয়েন্টটি আয়তক্ষেত্রের স্পর্শ করেছে বা এর ভিতরে রয়েছে তবে এটি স্পষ্টতই বাইরে
এলআরএন

@ এলআরএন একটি আয়তক্ষেত্রকে কেন্দ্র করে (5: 5) প্রস্থ / উচ্চতা (5: 5) এর স্প্যান (2.5: 2.5) থেকে শুরু করে (7.5: 7.5) পর্যন্ত রয়েছে। বিন্দু (4: 4) সেই আয়তক্ষেত্রের অভ্যন্তরে।
সাম होচেভার

11

আমি ধরে নিলাম আপনার আয়তক্ষেত্রটি অক্ষ-সংযুক্ত।

আপনাকে কেবল পয়েন্টটি আয়তক্ষেত্রের "ক্ল্যাম্প" করতে হবে এবং তারপরে ক্ল্যাম্পড পয়েন্ট থেকে দূরত্বটি গণনা করতে হবে।

পয়েন্ট = (px, পাই), আয়তক্ষেত্র = (আরএক্স, আর, রউইথ, রাইট) // (উপরের বাম কোণে, মাত্রা)

function pointRectDist (px, py, rx, ry, rwidth, rheight)
{
    var cx = Math.max(Math.min(px, rx+rwidth ), rx);
    var cy = Math.max(Math.min(py, ry+rheight), ry);
    return Math.sqrt( (px-cx)*(px-cx) + (py-cy)*(py-cy) );
}

3

এর জন্য আপনাকে অবশ্যই বৃত্ত-আয়তক্ষেত্রের সংঘর্ষগুলি ব্যবহার করতে হবে। একটা ব্যাপার অনুরূপ স্ট্যাক ওভারফ্লো উপর প্রশ্ন।

আপনার বৃত্তের কেন্দ্রটি প্রশ্নাবলীতে পয়েন্ট হবে এবং ব্যাসার্ধটি আপনাকে যাচাই করতে চান তার দূরত্ব।


3

আপনি যদি একটি আয়তক্ষেত্রের প্রান্ত থেকে বিন্দু থেকে দূরত্বটি বের করার চেষ্টা করছেন, তবে আয়তক্ষেত্র দ্বারা নির্মিত নয়টি অঞ্চলের প্রত্যেকটির সাথে কাজ করা সবচেয়ে দ্রুততম উপায় হতে পারে:

function pointRectangleDistance(x, y, x1, y1, x2, y2) {
    var dx, dy;
    if (x < x1) {
        dx = x1 - x;
        if (y < y1) {
            dy = y1 - y;
            return Math.sqrt(dx * dx + dy * dy);
        }
        else if (y > y2) {
            dy = y - y2;
            return Math.sqrt(dx * dx + dy * dy);
        }
        else {
            return dx;
        }
    }
    else if (x > x2) {
        dx = x - x2;
        if (y < y1) {
            dy = y1 - y;
            return Math.sqrt(dx * dx + dy * dy);
        }
        else if (y > y2) {
            dy = y - y2;
            return Math.sqrt(dx * dx + dy * dy);
        }
        else {
            return dx;
        }
    }
    else {
        if (y < y1) {
            return y1 - y;
        }
        else if (y > y2) {
            return y - y2;
        }
        else {
            return 0.0; // inside the rectangle or on the edge
        }
    }
}

2

[মন্তব্যের ভিত্তিতে পরিবর্তিত উত্তর]

নীচের চিত্রের ধূসর আয়তক্ষেত্রটি যদি বিন্দুটির মধ্যে 10 টি ইউনিট হয় কিনা তা আপনি দেখতে চান, আপনি বিন্দুটির কোনও একটিতে আছে কিনা তা পরীক্ষা করে দেখুন

  1. লাল আয়তক্ষেত্র
  2. নীল আয়তক্ষেত্র
  3. সবুজ চেনাশোনাগুলির যে কোনও একটি (10 ব্যাসার্ধ)

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

inside=false;

bluerect.x=oldrect.x-10;
bluerect.y=oldrect.y;
bluerect.width=oldrect.width;
bluerect.height=oldrect.height+20;

if(  point.x >=bluerect && point.x <=redrect.x+bluerect.width &&
     point.y >=bluerect && point.y <=redrect.y+bluerect.height){
         //now point is side the blue rectangle
         inside=true;
}

redrect.x=oldrect.x;
redrect.y=oldrect.y-10;
redrect.width=oldrect.width+20;
redrect.height=oldrect.height;

if(  point.x >=redrect&& point.x <=redrect.x+redrect.width &&
     point.y >=redrect&& point.y <=redrect.y+redrect.height){
         //now point is side the redrectangle
         inside=true;
}


d1= distance(point, new point(oldrect.x, oldrect.y)) //calculate distance between point and (oldrect.x, oldrect.y)
d2= distance(point, new point(oldrect.x+10, oldrect.y))
d3= distance(point, new point(oldrect.x, oldrect.y+10))
d4= distance(point, new point(oldrect.x+10, oldrect.y+10))
if (d1 < 10 || d2 <10 || d3 < 10 || d4 <10){
    inside=true;
}

//inside is now true if the point is within 10 units of rectangle

এই পন্থাটি কিছুটা অপ্রয়োজনীয়। একটি অনুরূপ পদ্ধতি যা আয়তক্ষেত্র প্রতিসাম্য ব্যবহার করে 4 টি কোণে পরীক্ষা করা এড়াতে স্ট্যাকওভারফ্লোতে এখানে নথিভুক্ত করা হয়েছে


তির্যক দিকটি যেমন পয়েন্টগুলিতে একটি মিথ্যা ইতিবাচক উদাহরণ দেয় eg 11 ইউনিট দূরে।
এরিক বি

আপডেট হওয়া ছবিটি স্পষ্টতই ভুল, বাস্তবে এটি ত্রুটির ঘটনাটি চিত্রিত করে এবং এটিকে সঠিক প্রদর্শিত করে। সেই সবুজ পয়েন্টটি সহজেই 10 ইউনিটের বেশি দূরে থাকতে পারে এবং বাইরের আয়তক্ষেত্রের ভিতরে থাকতে পারে।
এরিক বি

আরে @ এরিকবি, আপনি যে ত্রুটিটি নির্দেশ করেছেন তা আমি স্থির করেছি, কীভাবে আপনার ডাউনটোটটি পূর্বাবস্থায় ফেরাবেন?
কেন

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

এই উত্তরটি সত্যই ভয়াবহ। 12 টি সংযোজন, 4 অবজেক্ট কনস্ট্রাকশন, 12 টেস্টস, 4 টি বর্গমূলের কোনও কাজের জন্য যা আসলে 3 লাইনের কোডের প্রয়োজন?
সাম হোচেভার

-2

আপনি এই জাতীয় কিছু ব্যবহার করতে পারেন: এখানে চিত্র বর্ণনা লিখুন


এই পদ্ধতিটি অহেতুক জটিল বলে মনে হচ্ছে। এই সমস্যাটি সমাধানের জন্য x1 এবং y1 সন্ধান করা প্রয়োজন।
এরিক বি

আসলে, এটি এমনকি একটি নির্দিষ্ট দূরত্বে সংঘর্ষের সন্ধানের প্রয়োজনীয়তাও পূরণ করে না। এটি বিন্দুটি আয়তক্ষেত্রের মধ্যে রয়েছে কিনা তা সনাক্ত করার কেবল একটি খারাপ উপায়।
এরিক বি

দূরত্বের একটি পরিমাপ ইতিমধ্যে স্পষ্টভাবে সেখানে। যদি (ডি 2 <10 * 10) measure / * পরিমাপের 10 ইউনিটের মধ্যে * /}
আলেকজান্ডারব্রেভিগ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.