2011-05-20 24 views
10

से एक दूरी के भीतर है, मेरे पास दो बिंदु ए और बी हैं जो डिवाइस स्क्रीन पर एक लाइन सेगमेंट को परिभाषित करते हैं और एक और बिंदु सी। कुशल और लघु एल्गोरिदम का उपयोग करना जो कोड के लिए आसान है (अधिमानतः मानक गणित का उपयोग करना लाइब्रेरी), मैं कैसे जांचूं कि लाइन सेगमेंट एबी दूरी से आर के भीतर है या नहीं?एक लाइन सेगमेंट की जांच करना

मुझे पता है कि एक बिंदु से एक रेखा तक सबसे छोटी दूरी खोजने का एक आसान तरीका है, लेकिन यह मानता है कि रेखा असीम रूप से लंबी है। मेरे पास दो अंतराल वाले रेखा खंड है।

मैंने इसे मैथ एसई में पोस्ट करने पर विचार किया लेकिन ऐसा नहीं किया क्योंकि मैं उन सभी लंबे गणित सूत्र को https://math.stackexchange.com/questions/2837/how-to-tell-if-a-line-segment-intersects-with-a-circle जैसे उत्तर के रूप में नहीं प्राप्त करना चाहता हूं। मुझे जो चाहिए वह एक कुशल और पठनीय कंप्यूटर एल्गोरिदम है, औपचारिक गणित प्रमेय नहीं।

पी/एस:

धन्यवाद veredesmarald से जवाब देने के लिए (जो मैं पहले से ही स्वीकार किए जाते हैं:

typedef struct { 
    CGPoint a; 
    CGPoint b; 
} CGLineSegment; 

+ (BOOL)isLineSegment:(CGLineSegment)line withinRadius:(CGFloat)radius fromPoint:(CGPoint)point { 

} 

समाधान के साथ संपादित करें: मैं निम्नलिखित ऑब्जेक्टिव-सी विधि कंकाल कार्यान्वित किए जाने की आवश्यकता है जब मैं एक मुलाकात को लागू करने के लिए किया था

+ (BOOL)isLineSegment:(CGLineSegment)line withinRadius:(CGFloat)radius fromPoint:(CGPoint)point { 
    CGPoint v = CGPointMake(line.b.x - line.a.x, line.b.y - line.a.y); 
    CGPoint w = CGPointMake(point.x - line.a.x, point.y - line.a.y); 
    CGFloat c1 = dotProduct(w, v); 
    CGFloat c2 = dotProduct(v, v); 
    CGFloat d; 
    if (c1 <= 0) { 
     d = distance(point, line.a); 
    } 
    else if (c2 <= c1) { 
     d = distance(point, line.b); 
    } 
    else { 
     CGFloat b = c1/c2; 
     CGPoint Pb = CGPointMake(line.a.x + b * v.x, line.a.y + b * v.y); 
     d = distance(point, Pb); 
    } 
    return d <= radius; 
} 

CGFloat distance(const CGPoint p1, const CGPoint p2) { 
    return sqrt(pow(p2.x - p1.x, 2) + pow(p2.y - p1.y, 2)); 
} 

CGFloat dotProduct(const CGPoint p1, const CGPoint p2) { 
    return p1.x * p2.x + p1.y * p2.y; 
} 
+0

कोड में अनुवाद करने में सक्षम होने से पहले, आपके पास शामिल गणित (और अधिमानतः समझना चाहिए) होना चाहिए। –

+0

@ बार्ट कियर्स यूप यह सच है लेकिन इसलिए मैं गणित की तलाश में हूं, फॉर्मूला नहीं, क्योंकि मैंने अपने प्रश्न पर जोर दिया है। मुझे सरल से मध्यवर्ती ज्यामिति गणित के साथ कोई समस्या नहीं है। – Lukman

उत्तर

संबंधित मुद्दे