मेरे पास 3 अंक (ए, बी और एक्स) और एक दूरी (डी) है। मुझे एक ऐसा फ़ंक्शन बनाना होगा जो परीक्षण करता है कि यदि बिंदु एक्स रेखा खंड एबी पर किसी बिंदु पर दूरी डी से करीब है।तेजी से ज्यामितीय निकटता
सवाल सबसे पहले है, मेरा समाधान सही है और फिर बेहतर (तेज़) समाधान के साथ आना है।
मेरी पहली पास के रूप में
AX = X-A
BX = X-B
AB = A-B
// closer than d to A (done squared to avoid needing to compute the sqrt in mag)
If d^2 > AX.mag^2 return true
// closer than d to B
If d^2 > BX.mag^2 return true
// "beyond" B
If (dot(BX,AB) < 0) return false
// "beyond" A
If (dot(AX,AB) > 0) return false
// find component of BX perpendicular to AB
Return (BX.mag)^2 - (dot(AB,BX)/AB.mag)^2 < d^2
इस प्रकार है इस कोड को पी के एक बड़े सेट और सभी पी कि पास खोजने के इरादे से ए/बी/डी तीनो के एक बड़े सेट के लिए रन किया जा रहा है खत्म हो जाएगा कम से कम एक ए/बी/डी के लिए मुझे संदेह है कि उस पर आधारित कुल लागत को कम करने का एक तरीका है लेकिन मैंने अभी तक उसमें ध्यान नहीं दिया है।
(BTW:। मुझे पता है कि कुछ पुनर्व्यवस्था, कुछ अस्थायी मूल्यों और कुछ बीजीय पहचान से ऊपर की लागत कम हो सकता है कर रहा हूँ मैं सिर्फ उन्हें स्पष्टता के लिए छोड़े गए।)
संपादित करें: यह एक है 2 डी समस्या (लेकिन समाधान जो 3 डी को सामान्यीकृत करता है
संपादित करें: आगे प्रतिबिंब पर, मुझे उम्मीद है कि हिट दर लगभग 50% हो। एक्स पॉइंट को घोंसले पदानुक्रम में बनाया जा सकता है, इसलिए मैं सक्षम होने की उम्मीद करता हूं बड़ी सबट्री को सभी पास और सभी असफल होने के रूप में प्रक्षेपित करने के लिए। ए/बी/डी ट्रिपलेट्स को सीमित करने से अधिक tr ick।
संपादित करें: डी एबी के रूप में परिमाण के समान क्रम में है।
संपादित करें: आर्टेलियस ने एक अच्छा समाधान पोस्ट किया। मुझे यकीन नहीं है कि मैं समझता हूं कि वह क्या कर रहा है क्योंकि मैं इसे पूरी तरह से समझने से पहले एक स्पर्शरेखा पर उतर गया था। वैसे भी एक और सोचा एक परिणाम के रूप दिमाग में आया था:
- पहले Artelius 'सा, पूर्व cacluate एक मैट्रिक्स एबी केंद्रित करेंगे कि मूल खाया और X- अक्ष के साथ गठबंधन किया। (2 कहते हैं, 4 muls और 2 कहते हैं)
- यह सब गुना 1 वृत्त का चतुर्थ भाग में (2 पेट) एक्स & में
- पैमाने Y एक इकाई वर्ग में क्षेत्र के मध्य भाग बनाने के लिए (2 mul)
- परीक्षण करता है, तो मुद्दा यह है कि वर्ग (2 परीक्षण) में है, इसलिए छोड़ दी है
- परीक्षण अंत टोपी (बगैर माप मूल्यों
- एक्स में अनुवाद मूल (1 जोड़ने पर अंत जगह के लिए वापस जाओ)
- वर्ग और जोड़ें (2 मिली, 1 जोड़ें)
- ^2 (1 सीएमपी)
घ की तुलना मैं काफी यकीन है कि यह मेरी समाधान धड़कता हूँ।
(यदि कुछ भी नहीं बेहतर सोने साथ आता है Artelius "पुरस्कार" हो जाता है :)
एफडब्ल्यूआईडब्ल्यू कार्यान्वयन भाषा डी है :) (आपकी/हैं/वह बेंगी स्मिथ सही है?) – BCS