سؤال

أحتاج إلى إنشاء فئة تقوم بحساب المسافة بين نقطتين. أنا عالق وأنا مبتدئ كامل. فيما يلي فصولي:

package org.totalbeginner.tutorial;

public class Point {

    public double x;
    public double y;

    Point(double xcoord, double ycoord){
        this.x = xcoord;
        this.y = ycoord;
    }

    public double getX() {
        return x;
    }

    public double getY() {
        return y;
    }    
}

الطبقة الثانية.

package org.totalbeginner.tutorial;

public class Line {

    double x;
    double y;

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

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

لست متأكدا من كيفية الحصول على كائن نقطة (النقطة الوسطى) بين كل من النقاط المحددة.

يمكنني إنشاء كائنات نقطة ولكنني لست متأكدا من كيفية إرجاع كائن نقطة من خلال بلدي midpoint() الطريقة التي تكمن بين هذين كائنين النقطة.

هل كانت مفيدة؟

المحلول

المسافة بين نقطتين (x1، y1) و (x2، y2) على سطح مستو هي:

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

ولكن، إذا كان كل ما تريده هو نقطة الوسط لنقطتين، يجب عليك تغيير وظيفة نقطة الوسط الخاصة بك إلى:

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

سيعود ذلك كائنا نقطة جديدة تماما مع النقاط التي تم تعيينها إلى منتصف النقاط المعينة (دون الاضطرار إلى الاهتمام بنفسك بأي رياضيات أخرى). وبما أن الفصل الثاني لديك خط، فأنت بحاجة فقط إلى نقاط النهاية لوصفها، لذلك سأجعل بعض التغييرات الطفيفة.

أولا Point.java:

class Point {
    double x, y;
    Point (double xcoord, double ycoord) {
        this.x = xcoord;
        this.y = ycoord;
    }
    public double getX() { return x; }
    public double getY() { return y; }
}

ثم Line.java:

public class Line {
    Point p1, p2;
    Line (Point point1, Point point2) {
        this.p1 = point1;
        this.p2 = point2;
    }
    public Point midpoint() {
        return new Point ((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[]) {
        Line s = new Line (new Point(2.0, 2.0), new Point(5.0, 6.0));
        Point mp = s.midpoint();
        System.out.println ("Midpoint = (" + mp.getX() + "," + mp.getY() + ")");
        double as = s.abstand();
        System.out.println ("Length   = " + as);
    }
}

هذين الملفين، عند ترجمة وتشغيل نقاط النهاية 2,2 و 5,6 (Hypotenuse من مثلث الكلاسيكية 3/4/5 الزاوية اليمينية)، تولد الصحيح:

Midpoint = (3.5,4.0)
Length   = 5.0

نصائح أخرى

بيطرة بسيطة ... الجذر (DX ^ 2 + DY ^ 2)

Math.sqrt(Math.pow((p2.getX() - p1.getX()), 2) + Math.pow((p2.getY() - p1.getY()), 2))
 X
 +
 |\
 | \
a|  \c
 |   \
 |    \
 +-----+ 
    b   Y

تخيل x و y هي نقاطك على سطح مستو. ثم a يكون X.y - Y.y و b يكون Y.x - X.x وبعد طول c هي مسافةهم، وهي طول ماكسوتين استخدام هذا المثلث. يتم حسابها باستخدام

sqrt(a^2 + b^2);

منذ أن ترى نحن المربع a و b, ، علامة لهم ليست ذات صلة - سوف ينزل إلى نفسه. لذلك تعمل هذه الطريقة دائما، حيث تكمن النقاط.

البحث عن Pythagorean theorem

هل تحتاج حقا إلى المسافة، أم أنك تحاول فقط الحصول على نقطة المنتصف؟ لأنه من مقتطف التعليمات البرمجية الخاصة بك، فإن هذا النوع من يبدو وكأنه تريد فقط إنشاء نقطة جديدة في منتصف الطريق بين نقطتين موجودتين.

إذا كنت حقا بعد نقطة الوسط مباشرة، فأنت لا تحتاج حقا إلى فئة ثانية بأكملها (أي "خط") لإنجاز ذلك. نظرا لأن الشيء الذي تحاول العثور عليه هو نقطة، فمن المنطقي إضافة منشئ إلى فئة النقطة الحالية، مثل ذلك ..

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

.. ثم، في أي مكان آخر دعونا نقول أن لديك بالفعل بضعة نقاط تريد استخدامها على ذلك، فأنت تستخدم المنشئ وبالتالي:

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

وإذا كنت تريد حقا المسافة بين نقطتين، فهذا ليس حقا سمة من أي من النقطة، لذلك من المنطقي استخدام طريقة ثابتة لذلك، مثل ذلك

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

والظهر في رمز الاتصال، يمكنك استخدامه بهذه الطريقة:

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

يمكنك استخدام وظيفة الرياضيات لهذا:

public Point midpoint() {
    //Calculate the difference between 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 Point(newX, newZ);
}

الرياضيات يعالج المشكلات ذات القيم السلبية وما إلى ذلك بالنسبة لك، باستخدام Math.Pow يمنحك طريقة آمنة لأنها تحتوي على الكثير من الشيكات التي تم بناؤها داخل.

يمكنك استخدام The Pythagorean Theorem, ، كما قال آخر. هنا شمولية بصريا من مشروع Demostration Wolfram.

النص البديل http://demonstrations.wolfram.com/distancebetweentwopoints/htmlimages/index.en/popup_5.jpg.

في الفصل الثاني، يبدو أنك تحاول ضبط قيم x و y التي تستخدم لبناء الخاص بك mp عامل. كل الصيغ الخاصة بك صحيحة، لكنك تحتاج إلى النظر في ترتيب أن كل شيء يتم تنفيذها. في الكود كما هو، إنه خلق x و y المتغيرات، والتي تبدأ من 0، ثم مختلف Pointس. x و y لا تزال 0، لذلك mp تم تعيين إلى Point(0, 0).

ما تريد القيام به هو تغيير عودة النوع من midpoint ل Point, ، بحيث عند استدعاء هذه الوظيفة، تعود Point. وبعد ثم يمكنك إنشاء جديد Point كائن مع القيم التي تحسب. يجب أن تبدو أكثر مثل هذا:

public Point midpoint() {
    // calculate the middle x and y
    double x = (p1.getX() + p2.getX()) / 2;
    double y = (p1.getY() + p2.getY()) / 2;
    // now make a new Point with those values, and return it
    return new Point(x, y);
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top