c# यह बताने के लिए कि क्या एक बिंदु रेखा के दाएं या बाएं तरफ है





5 Answers

इस कोड को आजमाएं जो क्रॉस उत्पाद का उपयोग करता है:

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;
}

जहां एक = रेखा बिंदु 1; बी = रेखा बिंदु 2; सी = बिंदु के खिलाफ जांच करने के लिए।

यदि सूत्र 0 के बराबर है, तो अंक कॉलिनर हैं।

यदि रेखा क्षैतिज है, तो यह बिंदु सही हो जाती है यदि बिंदु रेखा से ऊपर है।

c# math geometry convex-hull

मेरे पास अंक का एक सेट है। मैं उन्हें 2 अलग-अलग सेटों में अलग करना चाहता हूं। ऐसा करने के लिए, मैं दो बिंदु ( और बी ) चुनता हूं और उनके बीच एक काल्पनिक रेखा खींचता हूं। अब मैं उन सभी बिंदुओं को रखना चाहता हूं जो इस लाइन से एक सेट में छोड़े गए हैं और जो कि इस सेट से दूसरे सेट में हैं।

मैं किसी दिए गए बिंदु z के लिए कैसे बता सकता हूं कि यह बाएं या दाएं सेट में है या नहीं? मैंने एजीबी के बीच कोण की गणना करने की कोशिश की - 180 से छोटे कोण दायीं तरफ 180 से अधिक हैं, लेकिन बाईं ओर 180 से अधिक हैं - लेकिन आर्ककोस की परिभाषा के कारण, गणना किए गए कोण हमेशा 180 डिग्री से छोटे होते हैं। 180 डिग्री से अधिक कोणों (या दाएं या बाएं किनारे को चुनने के लिए कोई अन्य सूत्र) की गणना करने के लिए कोई सूत्र है?




वेक्टर (y1 - y2, x2 - x1) लाइन के लिए लंबवत है, और हमेशा सही इंगित करता है (या हमेशा बाएं ओर इशारा करते हुए, यदि आप विमान अभिविन्यास मेरा से अलग हैं)।

इसके बाद आप उस वेक्टर के डॉट उत्पाद की गणना कर सकते हैं और (x3 - x1, y3 - y1) यह निर्धारित करने के लिए कि बिंदु लंबवत वेक्टर (डॉट उत्पाद> 0 ) या नहीं के रूप में रेखा के एक ही तरफ स्थित है या नहीं।




लाइन एबी के समीकरण का उपयोग करके, उसी y-coordinate पर लाइन पर x-coordinate को सॉर्ट करने के बिंदु के रूप में प्राप्त करें।

  • यदि बिंदु का x> रेखा का एक्स, बिंदु रेखा के दाईं ओर है।
  • यदि बिंदु का x <line x है, तो बिंदु रेखा के बाईं ओर है।
  • यदि बिंदु x == लाइन का एक्स है, तो बिंदु रेखा पर है।



मूल रूप से, मुझे लगता है कि एक समाधान है जो किसी भी दिए गए बहुभुज के लिए बहुत आसान और सीधे आगे है, कहता है कि चार कोष्ठक (पी 1, पी 2, पी 3, पी 4) शामिल हैं, बहुभुज में दो चरम विपरीत विपरीत को ढूंढें, दूसरे में शब्दों के लिए, उदाहरण के लिए सबसे ऊपर बाएं कशेरुक (चलो पी 1 कहें) और विपरीत वर्टेक्स जो सबसे नीचे दाईं ओर स्थित है (कहें)। इसलिए, आपके परीक्षण बिंदु सी (एक्स, वाई) दिया गया है, अब आपको सी और पी 1 और सी और पी 4 के बीच दोहरी जांच करनी है:

यदि सीएक्स> पी 1 एक्स और साइ> पी 1y ==> का अर्थ है कि सी कम है और पी 1 के दाईं ओर है तो सीएक्स <पी 2 एक्स और साइ <p2y ==> का अर्थ है कि सी ऊपरी है और पी 4 के बायीं तरफ है

निष्कर्ष, सी आयताकार के अंदर है।

धन्यवाद :)




रूबी में @ एवीबी का जवाब

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

यदि उपरोक्त सकारात्मक है, तो नीचे नकारात्मक है। यदि 0, यह लाइन पर है।




Related