পয়েন্টটি একটি লাইনের ডান বা বাম দিকে আছে কিনা তা কীভাবে বলা যায়


130

আমার একটা পয়েন্ট আছে আমি তাদের 2 টি পৃথক সেটে আলাদা করতে চাই। এটি করার জন্য, আমি দুটি পয়েন্ট ( এবং ) চয়ন করি এবং তাদের মধ্যে একটি কাল্পনিক লাইন আঁকি। এখন আমি এই পয়েন্টটি সমস্ত পয়েন্টের কাছে রাখতে চাই যা এই রেখাটি থেকে একটি সেটে এবং অন্য সেটে এই লাইন থেকে ডানদিকে রয়েছে।

বামে বা ডান সেটটিতে যে কোনও পয়েন্ট z এর জন্য আমি কীভাবে বলতে পারি ? আমি আজাবের মধ্যে কোণটি গণনা করার চেষ্টা করেছি - 180 এর চেয়ে কম কোণগুলি ডানদিকে রয়েছে, বাম দিকে 180 এর চেয়ে বেশি - তবে আর্ককোসের সংজ্ঞার কারণে, গণনাকৃত কোণগুলি সর্বদা 180 than এর চেয়ে কম থাকে ° 180 than এর চেয়ে বেশি কোণগুলি গণনা করার কোনও সূত্র আছে (বা ডান বা বাম দিকটি বেছে নিতে কোনও অন্য সূত্র)?


ডান বা বাম সংজ্ঞা দেওয়া হয় কিভাবে? ক) পি 1 থেকে পি 2 বা বি পর্যন্ত দেখার শর্তে) বিমানে লাইনের বাম বা ডান দিক
phkahler

2
আপনার প্রশ্নের দ্বিতীয় অংশে স্পষ্ট করার জন্য, আপনি সঠিক কোণটি গণনা করতে acos () এর পরিবর্তে atan2 () ব্যবহার করতে পারেন। তবে এরিক বেইনভিলে উল্লেখ করেছেন যে ক্রস পণ্য ব্যবহার করা এটির সর্বোত্তম সমাধান।
dionyziz

নীচের অনেকগুলি সমাধান কাজ করে না কারণ আপনি যদি a এবং b পয়েন্ট বিনিময় করেন তবে তারা বিপরীত উত্তর দেয় (আমরা যে পয়েন্টগুলি আমাদের লাইনটি সংজ্ঞায়িত করতে ব্যবহার করছি)। আমি ক্লোজুরে একটি সমাধান দিচ্ছি যা তৃতীয় পয়েন্টের সাথে তুলনা করার আগে প্রথমে দুটি পয়েন্টকে ডিক্সিকোগ্রাফিকভাবে সাজান।
বেগুনি জ্যাকেট

উত্তর:


202

ভেক্টর নির্ধারকের চিহ্নটি ব্যবহার করুন (AB,AM), M(X,Y)কোয়েরি পয়েন্টটি কোথায় :

position = sign((Bx - Ax) * (Y - Ay) - (By - Ay) * (X - Ax))

এটি 0লাইনটিতে, এবং +1একপাশে, -1অন্যদিকে।


10
একটি জিনিস সম্পর্কে সচেতন থাকার সাথে +1 সুন্দর: বিন্দুটি লাইনের খুব কাছাকাছি থাকলে রাউন্ডিং ত্রুটি উদ্বেগ হতে পারে। বেশিরভাগ ব্যবহারের জন্য সমস্যা নয় , তবে এটি সময়ে সময়ে লোককে কামড়ায়।
স্টিফেন ক্যানন

16
আপনি যদি নিজেকে এমন পরিস্থিতিতে খুঁজে পান যেখানে এই পরীক্ষার গোলটে ত্রুটি আপনাকে সমস্যা দেখা দিচ্ছে, আপনি জন শেউচুকের "কম্পিউটারের জ্যামিতির জন্য ফাস্ট রোস্ট প্রেডিকেটস" সন্ধান করতে চাইবেন।
স্টিফেন ক্যানন

14
স্পষ্টকরণের জন্য, এটি লাইন (বা) এবং লাইন (ভ) থেকে (ম) থেকে বিন্দু পর্যন্ত ক্রস পণ্যটির জেড-উপাদানগুলির সমান same আপনার প্রিয় ভেক্টর-শ্রেণিতে: অবস্থান = চিহ্ন ((বা)) ক্রস (মা) [২])
লার্সমোয়া

3
এএন্ড বি অদলবদল একই লাইন রাখবে না, তবে এর চিহ্নটি পরিবর্তন করবে positions?
জয়েন

6
হ্যাঁ. A, B ওরিয়েন্টেশনটি সংজ্ঞায়িত করে, যেমন "আপনার দিকে বাম দিকে A এ দাঁড়ানো এবং B এর দিকে তাকাতে" থাকে।
এরিক বাইনভিল

224

একটি ক্রস পণ্য ব্যবহার করে যা এই কোড ব্যবহার করে দেখুন :

public bool isLeft(Point a, Point b, Point c){
     return ((b.X - a.X)*(c.Y - a.Y) - (b.Y - a.Y)*(c.X - a.X)) > 0;
}

যেখানে a = লাইন পয়েন্ট 1; = লাইন পয়েন্ট 2; সি = পয়েন্ট বিরুদ্ধে চেক।

সূত্র যদি 0 এর সমান হয় তবে পয়েন্টগুলি কলিনিয়ার হয়।

লাইনটি যদি অনুভূমিক হয়, তবে বিন্দু লাইনের উপরে থাকলে এটি সত্য হয়।


6
লাইন যদি উল্লম্ব হয়?
তোফিক আহমেদ

9
আপনি ডট পণ্য মানে?
বায়ান হুয়াং

13
@ লিজপ্রজিএমআর: না, এটি একটি ক্রস পণ্য, সমানভাবে 2 ডি ম্যাট্রিক্সের নির্ধারক। সারি (ক, খ) এবং (সি, ডি) দ্বারা সংজ্ঞায়িত 2 ডি ম্যাট্রিক্স বিবেচনা করুন। নির্ধারক বিজ্ঞাপন - বিসি। উপরের ফর্মটি 2 পয়েন্ট দ্বারা চিহ্নিত একটি রেখাকে একটি ভেক্টরে রূপান্তরিত করছে, (ক, খ), এবং তারপরে পয়েন্টএ এবং পয়েন্টসি (সি, ডি) পেতে অন্য ভেক্টরকে সংজ্ঞায়িত করছে: (ক, খ) = (পয়েন্টবি.এক্স - পয়েন্টএ.এক্স, পয়েন্টবি.ই - পয়েন্টএই.আই) (সি, ডি) = (পয়েন্টসি.এক্স - পয়েন্টএ.এক্স, পয়েন্টসি.ই - পয়েন্টএ.ই) নির্ধারক সুতরাং পোস্টে তার বর্ণিত ঠিক যেমনটি রয়েছে।
অ্যান্ডি

6
আমি মনে করি এটি ক্রস পণ্য বা বিন্দু পণ্য কিনা তা নিয়ে বিভ্রান্তি কারণ এটি দুটি মাত্রায়। এটা তোলে হয় ক্রস পণ্য, দ্বিমাত্রিক: mathworld.wolfram.com/CrossProduct.html
brianmearns

4
এটি মূল্যবান কিসের জন্য, এটি কিছুটা সহজ করা যেতে পারে return (b.x - a.x)*(c.y - a.y) > (b.y - a.y)*(c.x - a.x);তবে সংকলক সম্ভবত যেভাবেই এটি অনুকূল করে তুলবে।
নিকু স্টির্কা

44

আপনি নির্ধারকের সাইন তাকান

| x2-x1  x3-x1 |
| y2-y1  y3-y1 |

এটি একদিকে পয়েন্টগুলির জন্য ইতিবাচক এবং অন্যদিকে নেতিবাচক হবে (এবং রেখার পয়েন্টগুলির জন্য শূন্য)।


1
এই উত্তরটি প্রসারিত করা হচ্ছে, লোকেরা ক্রস পণ্যটি কেমন তা জানেন না। পরবর্তী ভিজ্যুয়াল স্টেপটি হল ((x2-x1) * (y3-y1)) - ((y2 - y1) * (x3-x1))
ফ্র্যাঙ্কি রিভেরা

10

ভেক্টরটি (y1 - y2, x2 - x1)লাইনটির জন্য লম্ব, এবং সর্বদা ডানদিকে নির্দেশ করা হয় (বা সর্বদা বাম দিকে নির্দেশ করা হয়, যদি আপনি বিমানের অবস্থানটি খনি থেকে আলাদা হয়)।

তারপরে আপনি সেই ভেক্টরের ডট পণ্যটি গণনা করতে পারেন এবং (x3 - x1, y3 - y1)নির্ধারণ করতে পারেন যে বিন্দুটি লম্বের একই অংশে লম্ব ভেক্টর (বিন্দু পণ্য> 0) হিসাবে রয়েছে কিনা ।


5

রেখার আবের সমীকরণটি ব্যবহার করে , বিন্দু অনুসারে বাছাই করার জন্য একই y- স্থানাঙ্করে রেখার এক্স-স্থানাংক পান।

  • যদি বিন্দুর x> লাইনের x থাকে তবে বিন্দুটি লাইনের ডানদিকে থাকে।
  • যদি বিন্দুটির x <লাইনের x, বিন্দুটি রেখার বাম দিকে থাকে।
  • যদি বিন্দুটির x == লাইনের x, বিন্দুটি লাইনে থাকে।

এটি ভুল, কারণ আপনি প্রথম উত্তরে অ্যাগনোরের মন্তব্য থেকে দেখতে পাচ্ছেন, আমরা নির্ধারণ করতে চাই না যে বিন্দুটি ডিআরেক্টেড লাইন AB এর বাম বা ডানদিকে রয়েছে, অর্থাৎ আপনি যদি এ-তে দাঁড়িয়ে আছেন এবং খুঁজছেন বি এর দিকে এটি আপনার বাম দিকে বা ডানদিকে?
dionyziz

1
@ ডিওনিজিজ - হু? আমার উত্তর AB এর মাধ্যমে লাইনে কোনও "দিকনির্দেশ" বরাদ্দ করে না। আমার উত্তর ধরে "বাম" কর্ডিনেট সিস্টেমের -x দিক। গৃহীত উত্তরটি একটি ভেক্টর এবি সংজ্ঞায়িত করতে এবং ক্রস পণ্যটি ব্যবহার করে বাম সংজ্ঞা দেওয়া বেছে নিয়েছে । মূল প্রশ্নটি "বাম" দ্বারা কী বোঝায় তা নির্দিষ্ট করে না।
এমবিকেশ

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

এটি পুরোপুরি আমি যা খুঁজছিলাম। আমি জানতে চাই না যে এ বি এর উপরে বা নীচে আছে কিনা আমি কেবল জানতে চাই যে এটি রেখার (নেতিবাচক এক্স দিক) বামে রয়েছে কিনা!
জয়েন

5

আপনার যদি একটি উলম্ব রেখা আছে তা প্রথমে পরীক্ষা করুন:

if (x2-x1) == 0
  if x3 < x2
     it's on the left
  if x3 > x2
     it's on the right
  else
     it's on the line

তারপরে, opeাল গণনা করুন: m = (y2-y1)/(x2-x1)

তারপর, বিন্দু ঢাল ফর্ম ব্যবহার করে লাইনের একটি সমীকরণ তৈরি করুন: y - y1 = m*(x-x1) + y1। আমার ব্যাখ্যার স্বার্থে, এটিকে -ালু-বাধা ফর্মটি সহজ করুন (আপনার অ্যালগরিদমে প্রয়োজনীয় নয়):y = mx+b

এখন প্লাগ ইন (x3, y3)জন্য xএবং y। এখানে কী হওয়া উচিত সে সম্পর্কে কিছু সিউডোকোড এখানে দেওয়া হয়েছে:

if m > 0
  if y3 > m*x3 + b
    it's on the left
  else if y3 < m*x3 + b
    it's on the right
  else
    it's on the line
else if m < 0
  if y3 < m*x3 + b
    it's on the left
  if y3 > m*x3+b
    it's on the right
  else
    it's on the line
else
  horizontal line; up to you what you do

3
ব্যর্থ: উল্লম্ব লাইনের জন্য invalidাল গণনা অবৈধ। অন্তহীন যদি / অন্য জিনিস। নিশ্চিত নয় যে ওপিটি বাম / ডান বলতে বোঝায় কিনা - যদি এটির দিকে তাকানো হয় তবে 90 ডিগ্রিটি ঘোরানো হলে এই কোডটি অর্ধেক কেটে যাবে যেহেতু "উপরে" ডান বা বাম হবে।
phkahler

1
এই উত্তরে বেশ কয়েকটি সমস্যা রয়েছে। উল্লম্ব লাইনগুলি শূন্য দ্বারা একটি বিভাজন ঘটায়। সবচেয়ে খারাপ, এটি ব্যর্থ হয় কারণ এটি লাইনের slাল ইতিবাচক বা নেতিবাচক কিনা তা নিয়ে চিন্তা করে না।

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

5

আমি এটি জাভাতে প্রয়োগ করেছি এবং একটি ইউনিট পরীক্ষা চালিয়েছি (নীচের উত্স)। উপরের সমাধানগুলির কোনওটিই কাজ করে না। এই কোড ইউনিট পরীক্ষা পাস। যদি কেউ একটি ইউনিট পরীক্ষা পায় যা পাস করে না তবে দয়া করে আমাকে জানান।

কোড: দ্রষ্টব্য: nearlyEqual(double,double)দুটি সংখ্যা খুব কাছাকাছি থাকলে সত্যটি ফেরত দেয়।

/*
 * @return integer code for which side of the line ab c is on.  1 means
 * left turn, -1 means right turn.  Returns
 * 0 if all three are on a line
 */
public static int findSide(
        double ax, double ay, 
        double bx, double by,
        double cx, double cy) {
    if (nearlyEqual(bx-ax,0)) { // vertical line
        if (cx < bx) {
            return by > ay ? 1 : -1;
        }
        if (cx > bx) {
            return by > ay ? -1 : 1;
        } 
        return 0;
    }
    if (nearlyEqual(by-ay,0)) { // horizontal line
        if (cy < by) {
            return bx > ax ? -1 : 1;
        }
        if (cy > by) {
            return bx > ax ? 1 : -1;
        } 
        return 0;
    }
    double slope = (by - ay) / (bx - ax);
    double yIntercept = ay - ax * slope;
    double cSolution = (slope*cx) + yIntercept;
    if (slope != 0) {
        if (cy > cSolution) {
            return bx > ax ? 1 : -1;
        }
        if (cy < cSolution) {
            return bx > ax ? -1 : 1;
        }
        return 0;
    }
    return 0;
}

এখানে ইউনিট পরীক্ষা:

@Test public void testFindSide() {
    assertTrue("1", 1 == Utility.findSide(1, 0, 0, 0, -1, -1));
    assertTrue("1.1", 1 == Utility.findSide(25, 0, 0, 0, -1, -14));
    assertTrue("1.2", 1 == Utility.findSide(25, 20, 0, 20, -1, 6));
    assertTrue("1.3", 1 == Utility.findSide(24, 20, -1, 20, -2, 6));

    assertTrue("-1", -1 == Utility.findSide(1, 0, 0, 0, 1, 1));
    assertTrue("-1.1", -1 == Utility.findSide(12, 0, 0, 0, 2, 1));
    assertTrue("-1.2", -1 == Utility.findSide(-25, 0, 0, 0, -1, -14));
    assertTrue("-1.3", -1 == Utility.findSide(1, 0.5, 0, 0, 1, 1));

    assertTrue("2.1", -1 == Utility.findSide(0,5, 1,10, 10,20));
    assertTrue("2.2", 1 == Utility.findSide(0,9.1, 1,10, 10,20));
    assertTrue("2.3", -1 == Utility.findSide(0,5, 1,10, 20,10));
    assertTrue("2.4", -1 == Utility.findSide(0,9.1, 1,10, 20,10));

    assertTrue("vertical 1", 1 == Utility.findSide(1,1, 1,10, 0,0));
    assertTrue("vertical 2", -1 == Utility.findSide(1,10, 1,1, 0,0));
    assertTrue("vertical 3", -1 == Utility.findSide(1,1, 1,10, 5,0));
    assertTrue("vertical 3", 1 == Utility.findSide(1,10, 1,1, 5,0));

    assertTrue("horizontal 1", 1 == Utility.findSide(1,-1, 10,-1, 0,0));
    assertTrue("horizontal 2", -1 == Utility.findSide(10,-1, 1,-1, 0,0));
    assertTrue("horizontal 3", -1 == Utility.findSide(1,-1, 10,-1, 0,-9));
    assertTrue("horizontal 4", 1 == Utility.findSide(10,-1, 1,-1, 0,-9));

    assertTrue("positive slope 1", 1 == Utility.findSide(0,0, 10,10, 1,2));
    assertTrue("positive slope 2", -1 == Utility.findSide(10,10, 0,0, 1,2));
    assertTrue("positive slope 3", -1 == Utility.findSide(0,0, 10,10, 1,0));
    assertTrue("positive slope 4", 1 == Utility.findSide(10,10, 0,0, 1,0));

    assertTrue("negative slope 1", -1 == Utility.findSide(0,0, -10,10, 1,2));
    assertTrue("negative slope 2", -1 == Utility.findSide(0,0, -10,10, 1,2));
    assertTrue("negative slope 3", 1 == Utility.findSide(0,0, -10,10, -1,-2));
    assertTrue("negative slope 4", -1 == Utility.findSide(-10,10, 0,0, -1,-2));

    assertTrue("0", 0 == Utility.findSide(1, 0, 0, 0, -1, 0));
    assertTrue("1", 0 == Utility.findSide(0,0, 0, 0, 0, 0));
    assertTrue("2", 0 == Utility.findSide(0,0, 0,1, 0,2));
    assertTrue("3", 0 == Utility.findSide(0,0, 2,0, 1,0));
    assertTrue("4", 0 == Utility.findSide(1, -2, 0, 0, -1, 2));
}

2

পয়েন্টগুলি ধরে নিলে (এক্স, আই) (বিএক্স, বাই) এবং (সেক্স, সি), আপনাকে গণনা করতে হবে:

(বিএক্স - এক্স) * (সাই - আই) - (লিখেছেন - আয়) * (সিক্স - এক্স)

এটি শূন্যের সমান হবে যদি বিন্দু C এবং B দ্বারা চিহ্নিত বিন্দুতে থাকে এবং পাশের উপর নির্ভর করে একটি আলাদা চিহ্ন থাকতে পারে sign এটি কোন দিকটি আপনার (x, y) স্থানাঙ্কগুলির ওরিয়েন্টেশনের উপর নির্ভর করে তবে আপনি এ, বি এবং সি এর জন্য পরীক্ষার মানগুলিকে এই সূত্রটিতে প্লাগ করতে পারেন negativeণাত্মক মানগুলি বামে বা ডানে কিনা তা নির্ধারণ করতে।


2

আমি পদার্থবিদ্যার দ্বারা অনুপ্রাণিত একটি সমাধান সরবরাহ করতে চেয়েছিলাম।

লাইন বরাবর প্রয়োগ করা একটি বাহিনীটি কল্পনা করুন এবং আপনি পয়েন্টটি সম্পর্কে ফোর্সের টর্কটি পরিমাপ করছেন। যদি টর্কটি ধনাত্মক (বিপরীত দিকের দিকের) হয় তবে বিন্দুটি লাইনের "বাম দিকে" থাকে তবে টর্কটি নেতিবাচক হলে বিন্দুটি লাইনের "ডান" থাকে।

সুতরাং বল ভেক্টর যদি লাইনটি নির্ধারণ করে এমন দুটি পয়েন্টের স্প্যানের সমান হয়

fx = x_2 - x_1
fy = y_2 - y_1

আপনি (px,py)নিম্নলিখিত পরীক্ষার চিহ্নের উপর ভিত্তি করে একটি পয়েন্টের পাশের জন্য পরীক্ষা করেন

var torque = fx*(py-y_1)-fy*(px-x_1)
if  torque>0  then
     "point on left side"
else if torque <0 then
     "point on right side"  
else
     "point on line"
end if

1

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

যদি cx> p1x এবং cy> p1y ==> এর অর্থ সি সি <p2x এবং সাই <p2y ==> সি এর উপরের এবং পি 4 এর বাম দিকে রয়েছে

উপসংহার, সি আয়তক্ষেত্রের ভিতরে আছে।

ধন্যবাদ :)


1
(1) জবাব দেওয়া চেয়ে আলাদা উত্তর? "বাউন্ডিং বক্স" পরীক্ষার মতো শোনায়, যখন একটি আয়তক্ষেত্র উভয় অক্ষের সাথে একত্রিত হয়। (২) আরও বিশদে: 4 টি পয়েন্টের মধ্যে সম্ভাব্য সম্পর্ক সম্পর্কে ধারণা তৈরি করে। উদাহরণস্বরূপ, একটি আয়তক্ষেত্র নিন এবং এটি 45 ডিগ্রি ঘোরান, যাতে আপনার একটি হীরা থাকে। সেই হীরাতে "শীর্ষ-বাম দিক" বলে কোনও জিনিস নেই। বামতম পয়েন্টটি শীর্ষস্থানীয় বা নীচের অংশে সবচেয়ে বেশি নয়। এবং অবশ্যই, 4 পয়েন্ট এমনকি অপরিচিত আকার গঠন করতে পারে। উদাহরণস্বরূপ, 3 পয়েন্ট এক দিক থেকে দূরে এবং অন্য দিকের 4 র্থ পয়েন্ট হতে পারে। চেষ্টা করে যাও!
টুলমেকারস্টেভ

1

রুবিতে @ এভিবির উত্তর

det = Matrix[
  [(x2 - x1), (x3 - x1)],
  [(y2 - y1), (y3 - y1)]
].determinant

যদি detএর ইতিবাচক হয় তবে এটি নীচে নেতিবাচক হলে। যদি 0 হয় তবে এর লাইনে।


1

এখানে ক্লোজারে লিখিত ক্রস প্রোডাক্ট লজিক ব্যবহার করে আবার একটি সংস্করণ দেওয়া আছে।

(defn is-left? [line point]
  (let [[[x1 y1] [x2 y2]] (sort line)
        [x-pt y-pt] point]
    (> (* (- x2 x1) (- y-pt y1)) (* (- y2 y1) (- x-pt x1)))))

ব্যবহারের উদাহরণ:

(is-left? [[-3 -1] [3 1]] [0 10])
true

কোনটি বলতে হবে যে বিন্দু (0, 10) (-3, -1) এবং (3, 1) দ্বারা নির্ধারিত লাইনের বাম দিকে অবস্থিত।

দ্রষ্টব্য: এই প্রয়োগটি এমন একটি সমস্যা সমাধান করে যা অন্য কেউ (এখনও অবধি) করে না! লাইনটি নির্ধারণ করে এমন পয়েন্টগুলি দেওয়ার সময় বিষয়গুলি অর্ডার করুন । অর্থাৎ, এটি একটি "নির্দেশিত রেখা", নির্দিষ্ট অর্থে a সুতরাং উপরের কোড সহ, এই অনুরোধটি ফলাফলও তৈরি করে true:

(is-left? [[3 1] [-3 -1]] [0 10])
true

কোডের এই স্নিপেটের কারণেই:

(sort line)

অবশেষে, অন্যান্য ক্রস পণ্য ভিত্তিক সমাধানগুলির মতো, এই দ্রবণটি একটি বুলিয়ান দেয়, এবং তাত্ক্ষণিকতার জন্য তৃতীয় ফলাফল দেয় না। তবে এটি এমন একটি ফলাফল দেবে যা বোঝা যায়, যেমন:

(is-left? [[1 1] [3 1]] [10 1])
false

0

নেট দ্বারা সরবরাহিত সমাধানগুলির অনুভূতি পাওয়ার বিকল্প উপায় হ'ল কিছু জ্যামিতির অন্তর্নিহিততা বোঝা।

আসুন পিকিআর = [পি, কিউ, আর] এমন পয়েন্ট যা একটি প্লেন গঠন করে যা লাইন [পি, আর] দ্বারা ২ টি পাশ বিভক্ত হয় । আমরা পিকিআর বিমানের দুটি পয়েন্ট , এ, বি একই দিকে আছে কিনা তা খুঁজে বের করতে হবে।

পিকিআর বিমানের যে কোনও বিন্দু টি 2 ভেক্টর দ্বারা প্রতিনিধিত্ব করা যেতে পারে: v = PQ এবং u = RQ, হিসাবে:

টি '= টিকিউ = আমি * ভি + জে * ইউ

এখন জ্যামিতির প্রভাব:

  1. i + j = 1: টি পিআর লাইনে
  2. i + j <1: স্কোয়ারে টি
  3. i + j> 1: স্নাক-এ টি
  4. i + j = 0: টি = কিউ
  5. i + j <0: স্কয়ারে এবং কিউ ছাড়িয়ে টি

i+j: <0 0 <1 =1 >1 ---------Q------[PR]--------- <== this is PQR plane ^ pr line

সাধারণভাবে,

  • i + j টি Q বা লাইন [পি, আর] এবং কতটা দূরে রয়েছে তার একটি পরিমাপ
  • সাইন ইন করুন আমি ঞ-1 + + প্রকাশ করে T 'র sideness।

I এবং j এর অন্যান্য জ্যামিতির তাত্পর্য (এই সমাধানের সাথে সম্পর্কিত নয়):

  • i , j হ'ল একটি নতুন সমন্বিত সিস্টেমে টি এর জন্য স্কেলার যেখানে v, আপনি নতুন অক্ষ এবং Q নতুন উত্স;
  • i , j কে যথাক্রমে পি, আর এর জন্য টান দেওয়ার শক্তি হিসাবে দেখা যেতে পারে । আরও বড় আই , আরও দূরে টি আর ( পি থেকে বৃহত টান ) থেকে দূরে ।

সমীকরণগুলি সমাধান করে i, j এর মান পাওয়া যায়:

i*vx + j*ux = T'x
i*vy + j*uy = T'y
i*vz + j*uz = T'z

সুতরাং বিমানটিতে আমাদের দুটি পয়েন্ট, এ, বি দেওয়া হয়েছে:

A = a1 * v + a2 * u B = b1 * v + b2 * u

যদি ক, খ একই দিকে থাকে তবে এটি সত্য হবে:

sign(a1+a2-1) = sign(b1+b2-1)

নোট করুন যে এটি এই প্রশ্নের ক্ষেত্রেও প্রযোজ্য: সমুদ্রের [P, Q, R] এর একই পাশের A, B , যা:

টি = আমি * পি + জে * কিউ + কে * আর

এবং আমি + জে + কে = 1 দ্বারা বোঝা যাচ্ছে যে টি প্লেনে রয়েছে [পি, কিউ, আর] এবং আই + জে + কে -1 এর চিহ্নটি তার বিস্তৃতকরণকে বোঝায়। এটি থেকে আমাদের রয়েছে:

A = a1 * P + a2 * Q + a3 * R B = b1 * P + b2 * Q + b3 * R

এবং এ, বি সমতল [P, Q, R] এর একপাশে থাকলে

sign(a1+a2+a3-1) = sign(b1+b2+b3-1)

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