2009-05-30 67 views
19

Tôi cần tạo lớp học để tính toán khoảng cách giữa hai điểm. Tôi bị mắc kẹt và tôi là một người mới bắt đầu. Dưới đây là các lớp học của tôi:Tính khoảng cách giữa hai điểm

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; 
    }  
} 

Lớp thứ hai.

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; 
    } 
} 

Tôi không chắc chắn cách lấy đối tượng điểm (điểm giữa) giữa hai điểm được xác định.

Tôi có thể tạo đối tượng điểm nhưng tôi không chắc chắn cách trả về đối tượng điểm thông qua phương thức mittelpunkt() nằm giữa hai đối tượng điểm đó.

+1

Vui lòng đặt câu hỏi. Cảm ơn. –

+2

Để trả lại một điểm từ mittelpunkt, bạn phải thay đổi kiểu trả về: công khai Punkt mittelpunkt() ... và sau đó, bạn phải tạo một Punkt và trả lại: trả lại Punkt mới (x, y); (Tôi không đăng câu trả lời này vì nó chỉ giải quyết một chút câu hỏi.) –

+0

Tại sao có quá nhiều câu trả lời phức tạp ở đây, khi có phương pháp JDK 'Math.hypot' thực hiện điều này cho bạn?Tôi nên downvote mọi câu trả lời mà không đề cập đến nó. –

Trả lời

49

Khoảng cách giữa hai điểm (x1, y1) và (x2, y2) trên một mặt phẳng là:

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

Nhưng, nếu tất cả các bạn muốn là trung điểm (mittelpunkt) của hai điểm, bạn nên thay đổi chức năng trung điểm của bạn để:

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

Điều này sẽ trả về một đối tượng điểm hoàn toàn mới với các điểm được đặt ở giữa hai điểm đã cho (mà không cần phải quan tâm đến chính mình với bất kỳ phép toán nào khác). Và, vì lớp thứ hai của bạn là một dòng, bạn chỉ cần hai điểm kết thúc để mô tả nó, vì vậy tôi sẽ thực hiện một số thay đổi nhỏ.

Đầu tiên Punkt.java (Point):

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; 
    } 
} 

Sau đó Strecke.java (Line):

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); 
    } 
} 

Hai tác phẩm, khi biên soạn và chạy với các thiết bị đầu cuối 2,25,6 (trên cạnh huyền của một cổ điển Hình tam giác vuông góc 3/4/5), tạo chính xác:

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

Một số người như vậy thể hiện. – Oli

+3

Có tội như bị tính phí, danh dự của bạn :-) – paxdiablo

+0

U đánh bại tôi bằng những bức ảnh gốc tuyệt đẹp. Yêu nó :) –

20

Simple Pythag ... root (dx^2 + dy^2)

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

Cảm ơn bạn đã giúp cuộc sống của tôi dễ dàng hơn! +1 –

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

Hãy tưởng tượng X và Y là điểm của bạn trên bề mặt phẳng. Sau đó, aX.y - Y.ybY.x - X.x. Chiều dài c là khoảng cách của chúng, và là chiều dài của cạnh huyền của tam giác đó. Nó được tính toán sử dụng

sqrt(a^2 + b^2); 

Kể từ khi bạn nhìn thấy chúng ta đang bình phương ab, các dấu hiệu của họ là không có liên quan - nó sẽ đi xuống như vậy. Vì vậy, phương pháp này luôn luôn hoạt động, nơi bao giờ các điểm nói dối.

Lookup các Pythagorean theorem

+3

hoặc bạn có thể sử dụng Math.hypot() - hơi ngắn hơn – MatrixFrog

+0

giải thích tuyệt vời .... và @MatrixFrog +1 cho phiên bản ngắn hơn .... – aProgrammer

1

Họ dạy lý Pythagoras' trong trường trung học đầu ở đây. Có một cơ hội tốt mà bất cứ điều gì bạn học được trong toán học sẽ hữu ích trong khoa học máy tính tại một số điểm.

+0

Thật sao? Tôi đã học cách nhìn xuống áo của Sarah Jane Smith trong môn toán trung học. Tôi khá chắc chắn tôi đã không bao giờ có thể sử dụng nó trong sự nghiệp lâu dài của tôi trong máy tính :-) [không phải tên thật của cô ấy, rõ ràng. Tôi là một người đàn ông đã lập gia đình hạnh phúc và không muốn gặp rắc rối nào]. – paxdiablo

+0

Tôi đã có giáo viên toán học nam, nhưng tôi đã có giáo viên tiếng Anh nữ tôi đã tỏa sáng. ;) –

6

Bạn có thực sự cần khoảng cách, hoặc bạn đang cố gắng để chỉ nhận được trung điểm? Bởi vì từ đoạn mã của bạn, có vẻ như bạn chỉ muốn tạo một điểm mới nửa đường giữa hai điểm hiện có.

Nếu bạn thực sự chỉ sau điểm giữa, bạn không thực sự cần toàn bộ lớp thứ 2 (tức là 'Strecke') để thực hiện điều đó. Vì điều bạn đang cố gắng tìm cũng là một điểm, nên bạn nên thêm một nhà xây dựng vào lớp Point hiện tại của bạn, như vậy ..

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

.. sau đó, ở nơi khác giả sử bạn đã có một vài chỉ bạn muốn sử dụng này, bạn sử dụng các nhà xây dựng như sau:

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

và nếu bạn thực sự muốn khoảng cách giữa hai điểm, đó không phải là thực sự là một thuộc tính của một trong hai điểm, vì vậy nó làm cho cảm giác sử dụng một phương pháp tĩnh cho rằng, giống như vậy

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); 
} 

và trở lại trong đoạn code gọi, bạn có thể sử dụng nó theo cách này:

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

Trong lớp thứ hai của bạn, có vẻ như bạn đang cố gắng để thiết lập các giá trị của xy được sử dụng để xây dựng mp của bạn biến. Tất cả các công thức của bạn đều chính xác, nhưng bạn cần phải xem xét đơn đặt hàng rằng mọi thứ được thực thi. Trong mã như nó được, nó tạo ra các biến số xy, bắt đầu bằng 0, sau đó là Punkt s khác nhau. xy vẫn là 0, vì vậy mp được đặt thành Punkt(0, 0).

gì có thể bạn muốn làm là thay đổi kiểu trở của mittelpunkt để Punkt, do đó khi bạn gọi chức năng đó, bạn lấy lại một Punkt. Sau đó, bạn có thể tạo đối tượng Punkt mới với các giá trị bạn tính. Nó sẽ giống như thế này:

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

Một giải pháp lập trình viên lười biếng bằng cách sử dụng java2D point API

+1

... Nhưng không kém phần chính xác và ít dòng mã hơn. – banjollity

+0

@fortran Hiện tại, liên kết không hoạt động chính xác hơn: ( –

+1

Liên kết này hiện tại: http://docs.oracle.com/javase/7/docs/api/java/awt/geom/Point2D.html# khoảng cách (gấp đôi,% 20double,% 20double,% 20double) –

2

Bạn có thể sử dụng một chức năng Toán cho điều này:

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:
xử lý các vấn đề với giá trị âm và v.v. cho bạn.
sử dụng Math.pow cung cấp cho bạn một phương pháp an toàn vì có rất nhiều kiểm tra được tích hợp bên trong

Các vấn đề liên quan