2009-05-30 22 views
19

मुझे एक कक्षा बनाने की आवश्यकता है जो दो बिंदुओं के बीच की दूरी की गणना करता है। मैं अटक गया हूं और मैं कुल शुरुआत कर रहा हूं। यहां मेरी कक्षाएं हैं:दो बिंदुओं के बीच की दूरी की गणना

package org.totalbeginner.tutorial; 

public class Punkt { 

    public double x; 
    public double y; 

    Punkt(double xkoord, double ykoord){ 
     this.x = xkoord; 
     this.y = ykoord; 
    } 

    public double getX() { 
     return x; 
    } 

    public double getY() { 
     return y; 
    }  
} 

द्वितीय श्रेणी।

package org.totalbeginner.tutorial; 
public class Strecke{ 

    double x; 
    double y; 

    Punkt p1 = new Punkt(2.0,2.0); 
    Punkt p2 = new Punkt(4.0,4.0); 
    Punkt mp = new Punkt(x,y); 

    public void mittelpunkt(){ 
     x = (p1.getX() + p2.getX())/2; 
     y = (p1.getY() + p2.getY())/2; 
    } 
} 

मुझे यकीन नहीं है कि दोनों निर्धारित बिंदुओं के बीच बिंदु बिंदु (मध्य बिंदु) कैसे प्राप्त करें।

मैं पॉइंट ऑब्जेक्ट्स बना सकता हूं लेकिन मुझे यकीन नहीं है कि मेरे mittelpunkt() विधि के माध्यम से एक बिंदु ऑब्जेक्ट कैसे वापस करना है जो उन दो बिंदु वस्तुओं के बीच है।

+1

के अंदर निर्मित चेक बहुत सारे हैं, कृपया एक प्रश्न पूछें। धन्यवाद। –

+2

mittelpunkt से एक बिंदु वापस करने के लिए, आपको इसके रिटर्न प्रकार को बदलना होगा: सार्वजनिक Punkt mittelpunkt() ... और फिर इसके अंत में, आपको एक Punkt बनाना होगा और इसे वापस करना होगा: नया Punkt (x, y) लौटाएं; (मैं इसे एक उत्तर के रूप में पोस्ट नहीं कर रहा हूं क्योंकि यह केवल प्रश्न के एक छोटे से पते को संबोधित करता है।) –

+0

यहां इतने जटिल जवाब क्यों हैं, जब कोई जेडीके विधि 'Math.hypot' है जो आपके लिए यह करता है?मुझे हर जवाब को कम करना चाहिए जो इसका उल्लेख नहीं करता है। –

उत्तर

49

एक सपाट सतह पर दो अंक (x1, y1) और (x2, y2) के बीच की दूरी है:

public Punkt mittelpunkt (Punkt p1, Punkt p2) { 
    return new Punkt ((p1.getX() + p2.getX())/2, (p1.getY() + p2.getY())/2); 
} 

:

____________________ 
/  2   2 
\/ (y2-y1) + (x2-x1) 

लेकिन, अगर सभी आप चाहते हैं कि आपके दो अंक के मध्य (mittelpunkt) है, तो आप अपने मध्य समारोह में बदल जानी चाहिए यह एक दो नए बिंदु ऑब्जेक्ट को दिए गए बिंदुओं के बीच सेट किए गए बिंदुओं के साथ वापस लौटाएगा (किसी भी अन्य गणित के साथ स्वयं को चिंता किए बिना)। और, चूंकि आपकी दूसरी कक्षा एक रेखा है, इसलिए आपको इसका वर्णन करने के लिए केवल दो अंत बिंदुओं की आवश्यकता है, इसलिए मैं कुछ मामूली परिवर्तन करूंगा।

पहले Punkt.java (प्वाइंट):

class Punkt { 
    double x, y; 
    Punkt (double xkoord, double ykoord) { 
     this.x = xkoord; 
     this.y = ykoord; 
    } 
    public double getX() { 
     return x; 
    } 
    public double getY() { 
     return y; 
    } 
} 

फिर Strecke.java (लाइन):

public class Strecke { 
    Punkt p1, p2; 
    Strecke (Punkt punkt1, Punkt punkt2) { 
     this.p1 = punkt1; 
     this.p2 = punkt2; 
    } 
    public Punkt mittelPunkt() { 
     return new Punkt ((p1.getX()+p2.getX())/2, (p1.getY()+p2.getY())/2); 
    } 
    public double abstand() { 
     return Math.sqrt(
      (p1.getX() - p2.getX()) * (p1.getX() - p2.getX()) + 
      (p1.getY() - p2.getY()) * (p1.getY() - p2.getY()) 
     ); 
    } 
    static public void main (String args[]) { 
     Strecke s = new Strecke (new Punkt(2.0, 2.0), new Punkt(5.0, 6.0)); 
     Punkt mp = s.mittelPunkt(); 
     System.out.println ("Midpoint = (" + mp.getX() + "," + mp.getY() + ")"); 
     double as = s.abstand(); 
     System.out.println ("Length = " + as); 
    } 
} 

इन दो फाइलें, जब संकलित और अंतिम बिंदुओं के साथ 2,2 और 5,6 (एक क्लासिक के कर्ण चलाने 3/4/5 दायां कोण वाला त्रिकोण), सही उत्पन्न करें:

Midpoint = (3.5,4.0) 
Length = 5.0 
+5

कुछ लोग ऐसे शो-ऑफ हैं। – Oli

+3

चार्ज के रूप में दोषी, आपका सम्मान :-) – paxdiablo

+0

यू ने मुझे अच्छी जड़ तस्वीरों के साथ हरा दिया। इसे लोविन :) –

20

सरल Pythag ... रूट (dx^2 + डीवाई^2)

Math.sqrt(Math.pow((p2.getX() - p1.getX()), 2) + Math.pow((p2.getY() - p1.getY()), 2)) 
+1

मेरे जीवन को आसान बनाने के लिए धन्यवाद! +1 –

11
X 
+ 
|\ 
| \ 
a| \c 
| \ 
| \ 
+-----+ 
    b Y 

कल्पना करें एक्स और वाई एक फ्लैट सतह पर आपके अंक हैं। फिर aX.y - Y.y और bY.x - X.x है। c की लंबाई उनकी दूरी है, और उस त्रिकोण के hypotenuse की लंबाई है। यह

sqrt(a^2 + b^2); 

का उपयोग कर गणना की जाती है जब से तुम हम a और b बराबरी कर रहे हैं, उनमें से संकेत प्रासंगिक नहीं है - यह एक ही करने के लिए नीचे आ जाएगा। तो यह विधि हमेशा काम करती है, जहां कभी भी अंक झूठ बोलते हैं।

लुक Pythagorean theorem

+3

या आप Math.hypot() का उपयोग कर सकते हैं - थोड़ा छोटा – MatrixFrog

+0

महान स्पष्टीकरण .... और @MatrixFrog +1 छोटे संस्करण के लिए .... – aProgrammer

1

वे जल्दी हाई स्कूल में पाइथागोरस प्रमेय यहाँ सिखाने। एक अच्छा मौका है कि गणित में जो कुछ भी आपने सीखा वह किसी भी समय कंप्यूटर विज्ञान में उपयोगी होगा।

+0

वास्तव में? मैंने हाई स्कूल गणित में सारा जेन स्मिथ के ब्लाउज को कैसे देखना है। मुझे पूरा यकीन है कि मैं कभी भी कंप्यूटर में अपने लंबे करियर में इसका उपयोग करने में सक्षम नहीं हूं :-) [उसका असली नाम जाहिर है। मैं अब एक खुशी से शादीशुदा आदमी हूं और कोई परेशानी नहीं चाहता]। – paxdiablo

+0

मेरे पास पुरुष गणित के शिक्षक थे, लेकिन मेरे पास महिला अंग्रेजी शिक्षकों की एक चमक थी। ;) –

6

तुम सच में दूरी की जरूरत है, या आप बस मध्य प्राप्त करने की कोशिश कर रहे हैं? क्योंकि आपके कोड स्निपेट से, ऐसा लगता है कि आप सिर्फ एक नया बिंदु बनाना चाहते हैं जो दो मौजूदा बिंदुओं के बीच आधा रास्ता है।

यदि आप वास्तव में मध्यबिंदु के ठीक बाद हैं, तो आपको इसे पूरा करने के लिए वास्तव में पूरी कक्षा (यानी, 'स्ट्रेके') की आवश्यकता नहीं है। चूंकि बात आप को खोजने की कोशिश कर रहे यह भी एक बिंदु है, यह अपने मौजूदा प्वाइंट वर्ग के लिए एक निर्माता को जोड़ने के लिए है, तो तरह समझ में आता है ..

Punkt(Punkt a, Punkt b) 
{ 
    x = (a.x + b.x)/2; 
    y = (a.y + b.y)/2; 
} 

.. तो, कहीं और मान लीजिए कि आप पहले से ही की एक जोड़ी है चलो

Punkt p1 = new Punkt(2,2); 
Punkt p2 = new Punkt(4,4); 
Punkt midpoint = new Punkt(p1, p2); 

और यदि आप वास्तव में दो अंक के बीच की दूरी चाहते हैं, जो वास्तव में या तो बिंदु की एक विशेषता नहीं है, तो इसके लिए एक स्थिर विधि का उपयोग करने समझ में आता है: यदि आप इस का उपयोग करें, आप निर्माता इस प्रकार का उपयोग करना चाहते बताते हैं कि,

public static double distance(Punkt a, Punkt b) 
{ 
    double dx = a.x - b.x; 
    double dy = a.y - b.y; 
    return Math.sqrt(dx * dx + dy * dy); 
} 

और बुला कोड में वापस आ गया है, आप इसे इस तरह से उपयोग कर सकते हैं:

Punkt p1 = new Punkt(2,2); 
Punkt p2 = new Punkt(4,4); 
System.out.println("Distance between them is " + Punkt.distance(p1, p2)); 
1

अपने द्वितीय श्रेणी में, यह लगता है कि आप है कि आपके mp निर्माण करने के लिए उपयोग किया जाता है x और y के मूल्यों को निर्धारित करने की कोशिश कर रहे चर। आपके सभी सूत्र सही हैं, लेकिन आपको ऑर्डर पर विचार करने की आवश्यकता है कि सब कुछ निष्पादित किया गया है। कोड के रूप में, यह x और y चर बना रहा है, जो 0 के रूप में शुरू होता है, फिर विभिन्न Punkt एस। x और y अभी भी 0 हैं, इसलिए mpPunkt(0, 0) पर सेट है।

क्या आप शायद क्या करना चाहते हैं Punkt को mittelpunkt की वापसी प्रकार बदलने के लिए, ताकि जब आप कि फ़ंक्शन को कॉल करें, तो आप वापस एक Punkt मिलता है। फिर आप गणना की गई मानों के साथ एक नया Punkt ऑब्जेक्ट बना सकते हैं। यह इस तरह से अधिक दिखना चाहिए:

public Punkt mittelpunkt() { 
    // calculate the middle x and y 
    double x = (p1.getX() + p2.getX())/2; 
    double y = (p1.getY() + p2.getY())/2; 
    // now make a new Punkt with those values, and return it 
    return new Punkt(x, y); 
} 
13

एक आलसी प्रोग्रामर समाधान का उपयोग कर java2D point API

+1

... लेकिन कम गलत, और कोड की कम लाइनें। – banjollity

+0

@fortran अब यह कम सही है कि लिंक काम नहीं करता है :( –

+1

यह लिंक चालू है: http://docs.oracle.com/javase/7/docs/api/java/awt/geom/Point2D.html# दूरी (डबल,% 20 डबल,% 20 डबल,% 20 डबल) –

2

आप इस के लिए एक गणित समारोह का उपयोग कर सकते हैं:

public Punkt mittelpunkt() { 
    //Calculate the difference betwen the old and new x/y 
    double dx = p1.getX() - p2.getX(); 
    double dy = p1.getY() - p2.getY(); 

    double newX = Math.pow(dx, 2D); 
    double newY = Math.pow(dz, 2D); 
    return new Punkt(newX, newZ); 
} 

Math.pow:
हैंडल आपके लिए नकारात्मक मूल्यों और आदि के साथ मुद्दे।
Math.pow का उपयोग करके आपको एक सुरक्षित विधि मिलती है क्योंकि इसमें

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