2011-10-12 13 views
18

बढ़ाएँ मैं एक विशिष्ट दूरी के अनुसार एक रेखा खंड विस्तार करने के लिए एक रास्ता खोजने की कोशिश कर रहा हूँ। उदाहरण के लिए यदि मेरे पास 10,10 से 20,13 तक बढ़ने वाला लाइन सेगमेंट है और मैं लंबाई 3 तक बढ़ा सकता हूं तो मैं नए एंडपॉइंट की गणना कैसे करूं। मैं इस उदाहरण 10.44 इसलिए यदि मैं 13.44 की लंबाई क्या computationally सबसे तेज़ तरीका होगा साथ 10,10 से नए अंत बिंदु जानना चाहता था में से sqrt (एक^2 + b^2) लंबाई मिल सकता है? मैं ढलान को भी जानता हूं लेकिन यह नहीं जानता कि इससे मुझे इस मामले में कोई मदद मिलती है या नहीं।एक रेखा खंड एक विशिष्ट दूरी

+1

यह एक प्रोग्रामिंग सवाल है, लेकिन सरल गणित है, जो आप तो अपने कोड का विस्तार करने की जरूरत नहीं है। – Constantinius

+3

@ कॉन्स्टेंटिनीस यह अभी भी एक एल्गोरिदम प्रश्न है, केवल गणित में आधारित एक (जो कंप्यूटर विज्ञान बेहद भारी है)। – corsiKa

+0

@glowcoder: मैं असहमत हूं। नीचे गणित को समझने के बिना कोई सवाल नहीं है कि वह अपने काम में विफल रहता है। दूसरी तरफ, यदि वह गणित से परिचित है, तो इसे प्रोग्राम कोड में अनुवाद करने का एक छोटा सा काम है। – Constantinius

उत्तर

35

आप अपने रेखा खंड की इकाई वेक्टर खोजकर इसे करते हैं और अपने वांछित लंबाई करने के लिए इसे पैमाने पर कर सकते हैं, तो अनुवाद इस सदिश के साथ अपने रेखा खंड के अंत बिंदु। अपने रेखा खंड अंत अंक A और B रहे हैं और आप अंत बिंदु B के बाद का विस्तार करना चाहते हैं (और lenAB लाइन खंड की लंबाई है) मान लें।

#include <math.h> // Needed for pow and sqrt. 
struct Point 
{ 
    double x; 
    double y; 
} 

... 

struct Point A, B, C; 
double lenAB; 

... 

lenAB = sqrt(pow(A.x - B.x, 2.0) + pow(A.y - B.y, 2.0)); 
C.x = B.x + (B.x - A.x)/lenAB * length; 
C.y = B.y + (B.y - A.y)/lenAB * length; 
+10

जहां lenAB = sqrt ((A.x - B.x) ** 2 + (A.y - B.y) ** 2) –

+0

इस समाधान सबसे तेजी से काम करने के लिए लगता है। सिर्फ मामले में आपकी मदद के – goodgulf

+2

के लिए धन्यवाद आप सोच रहे हैं, जहां इस बात आती है, से (Bx - कुल्हाड़ी)/lenAB * लंबाई के रूप में cos (slope_alpha) एक ही * लंबाई है ... मेरे – fersarr

7

आप पहले से ही ढलान आप नए बिंदु की गणना कर सकते हैं:

x = old_x + length * cos(alpha); 
y = old_y + length * sin(alpha); 

मैं इस एक समय में नहीं किया है, तो यह एक अलग नज़रिए के साथ ले लो।

+4

जहां अल्फा = atan2 (y-old_y, एक्स old_x) –

+0

आपकी मदद के लिए धन्यवाद, यह समाधान थोड़ी धीमी तो कम समाधान लगता है। मैं मदद की सराहना करता हूं, यह भी काम करता है। – goodgulf

3

मैं सिर्फ इस बात के लिए अपने आप को खोजने के बाद इस पर ठोकर खाई है, और आप एक बाहर के बॉक्स समाधान देने के लिए, आप एक मानक वेक्टर वर्ग के अंदर कोड पर एक नज़र (किसी भी भाषा में) हो सकता है और चेरी आपको किस भाग की आवश्यकता है, लेकिन मैं इसका उपयोग कर समाप्त हुआ और कोड इस तरह दिखता है:

vector.set(x,y); 
vector.normalize(); 
vector.multiply(10000);// scale it by the amount that you want 

शुभकामनाएँ!

+0

मुझे लगता है कि यह सबसे सुंदर जवाब है –

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