कि उस समय के सबसे करीब है अपने लाइन पर बात की गणना करें ।
लाइन सेगमेंट मानना ए और बी है, और बिंदु पी है।
float vAPx = p.x - a.x;
float vAPy = p.y - a.y;
float vABx = b.x - a.x;
float vABy = b.y - a.y;
float sqDistanceAB = a.distanceSq(b);
float ABAPproduct = vABx*vAPx + vABy*vAPy;
float amount = ABAPproduct/sqDistanceAB;
if (amount > 1) amount = 1;
if (amount < 0) amount = 0;
जो तुम 'राशि' देता है, कितनी दूर रेखा खंड आप ए और बी के बीच हैं के माध्यम से (ठीक से घिरा)।
float nx = (amount * (b.x - a.x)) + a.x;
float ny = (amount * (b.y - a.y)) + a.y;
आपको पॉइंट (एनएक्स, एनई) देता है।
if (p.distance(nx,ny) > threshold) reject;
यह ठीक से, रेखा खंड की समाप्ति के बाद काम करते हैं क्योंकि यह 0 और 1.
के बीच 'राशि' रहता होगा यदि आप नहीं चाहते यदि यह एक घिरे रेखा खंड सीमा से छुटकारा पाने के राशि के लिए शेष कोड अभी भी काम करेगा, बी से परे और उससे पहले की स्थिति की गणना करेगा।
एक और सवाल था कि दावा किया गया था कि यह प्रश्न एक डुप्लिकेट था, लेकिन यह एक अलग बात मांग रहा है इसलिए मेरा समाधान बिंदु की स्थिति के लिए हल हो जाता है और फिर यूक्लिडियन दूरी (जो वास्तव में दोनों प्रश्न हल करता है) हल करता है।
a.distanceSq (बी) VABx vABx + vABy vABy के रूप में भी किया जा सकता है, क्योंकि हमने पहले से ही ऐसा किया है।
नोट: यदि आप रेखा खंडों के साथ काम कर रहे हैं, तो (यानी असीमित लंबी लाइनें नहीं), इससे गलत परिणाम मिल सकते हैं: बिंदु सेगमेंट के अंत बिंदु से बहुत दूर हो सकता है और फिर भी एक छोटी सामान्य दूरी हो सकती है ... – MartinStettner
यह भी ध्यान दें कि यदि आप घूमने जा रहे हैं और तुलना करें डी के लिए, यह तुलना करने के लिए और अधिक कुशल होगा। (x2 - x1) x (x1 - x0) |^2 से डी^2 | x2 - x1 |^2, दो वर्ग जड़ों को सहेजना और गुणा की लागत पर एक विभाजन । – Dave
धन्यवाद श्री अलन लेकिन लिंक काम नहीं करता है! मैंने आपके समीकरण समीकरण की कोशिश की लेकिन यह मुझे नए बिंदु और रेखा के पहले बिंदु के बीच की दूरी प्रदान करता है जो छेद रेखा नहीं है। कृपया मेरी बुरी भाषा के लिए क्षमा करें। ईमानदारी से, वहीद –