Tính khoảng cách giữa 2 điểm trong Java

Bài 1
Tính khoảng cách giữa 2 điểm trong Java
ây dựng lớp Pointbiểu diễn các điểm trong không gian 2 chiều với các tọa độ nguyên.
Lớp Pointcũng cung cấp các thao tác hay dùng trên các điểm.
a) Khai báo lớp Pointvới các biến nguyên int x, int ylưu trữ hoành độ và tung độ của
điểm.
b) Tạo các constructor sau cho lớp Point:
- Point(int x, int y): tạo điểm có hoành độ x, tung độ y.
- Point(): tạo điểm ở gốc tọa độ (0, 0).
- Point(Point p): tạo điểm ở vị trí của điểm p.
c) Khai báo biến static originbiểu diễn gốc tọa độ (0, 0).
d) Override các phương thức sau của lớp Object:
- boolean equals(Object obj): kiểm tra xem điểm có trùng với điểm được cho.
- String toString(): trả về chuỗi biểu diễn cho điểm dạng (x, y).
e) Tạo các getter và setter cho x, y.
f) Tạo các phương thức sau cho lớp Pointđể thực hiện các thao tác tương ứng:
- boolean isOrigin(): kiểm tra xem điểm có phải là gốc tọa độ (0, 0).
- void move(int x, int y): di chuyển điểm đến tọa độ mới (x, y).
- void translate(int dx, int dy): tịnh tiến điểm theo vector tịnh tiến (dx,
dy).Điểm (x, y) sau khi tịnh tiến theo vector tịnh tiến (dx, dy) sẽ thành điểm (x+ dx, y+
dy).
- static double distance(int x1, int y1, int x2, int y2): tính
khoảng cách giữa điểm (x1, y1) và điểm (x2, y2).

- static double distance(Point p1, Point p2): tính khoảng cách giữa
điểm p1và p2.
- double distance(int x, int y): tính khoảng cách từ điểm đến điểm (x, y).
- double distance(Point p): tính khoảng cách từ điểm đến điểm p.
- double distance(double a, double b, double c): tính khoảng cách từ
điểm đến đường thẳng có phương trình tổng quát ax + by + c = 0.

bài làm của tớ :
PHP:
public class Point { private int x; private int y; public static Point origin = new Point();//Khai báo biến static originbiểu diễn gốc tọa độ (0, 0). public Point(int x, int y) {//khoi tao Point co toa do xy this.x = x; this.y = y; } public Point() {//khoi tao voi toa so 0;0 this.x = 0; this.y = 0; } public Point(Point p) {//viet ra thui hem hieu co giong y cua de bai khong this.x = p.x; this.y = p.y; } //tao Set va get cho x va y public int getX() { return x; } public int getY() { return y; } public void setX(int x) { this.x = x; } public void setY(int y) { this.y = y; } //Override các phương thức sau của lớp Object @Override public boolean equals(Object obj) {//ham khong lam viec Point a = new Point(x, y); if (obj.equals(a)) { return true; } else { return false; } } @Override public String toString() { return "(+" + this.x + "," + this.y + ")"; } //boolean isOrigin(): kiểm tra xem điểm có phải là gốc tọa độ (0, 0). public boolean isOrigin() { Point a = new Point(this.x, this.y); if (a == origin) { return true; } else { return false; } } //void move(int x, int y): di chuyển điểm đến tọa độ mới (x, y). public void move(int x, int y) { this.x = x; this.y = y; } //void translate(int dx, int dy): tịnh tiến điểm theo vector tịnh tiến (dx, //dy).Điểm (x, y) sau khi tịnh tiến theo vector tịnh tiến (dx, dy) sẽ thành điểm (x+ dx, y+ //dy). public void translate(int dx, int dy) { this.x = this.x + dx; this.y = this.y + dy; } //static double distance(int x1, int y1, int x2, int y2): tính //khoảng cách giữa điểm (x1, y1) và điểm (x2, y2). public static double distance(int x1, int y1, int x2, int y2) { double kc; kc = Math.sqrt(Math.pow((x1 - x2), 2) + Math.pow((y1 - y2), 2)); return kc; } //static double distance(Point p1, Point p2): tính khoảng cách giữa //điểm p1và p2. public static double distance(Point p1, Point p2) { double kc; kc = Math.sqrt(Math.pow((p1.x - p2.x), 2) + Math.pow((p1.y - p2.y), 2)); return kc; } //double distance(int x, int y): tính khoảng cách từ điểm đến điểm (x, y). public double distance(int x, int y) { double kc; kc = Math.sqrt(Math.pow(this.x - x, 2) + Math.pow(this.y - y, 2)); return kc; } //double distance(Point p): tính khoảng cách từ điểm đến điểm p. public double distance(Point p) { double kc; kc = Math.sqrt(Math.pow(this.x - p.x, 2) + Math.pow(this.y - p.y, 2)); return kc; } //double distance(double a, double b, double c): tính khoảng cách từ //điểm đến đường thẳng có phương trình tổng quát ax + by + c = 0 public double distance(double a, double b, double c) { double kc; double _x1; _x1 = Math.sqrt(Math.pow(a, 2) + Math.pow(b, 2)); double _x2; _x2 = Math.abs(a * this.x + b * this.y + c); kc = _x2 / _x1; return kc; } }
ai giải thích lớp Object và cách Override các phương thức của nó
hình như nó có một câu lênh: instanceof dùng để kiểm tra nó có phải đối tượng mình cần hay không.

Cụ thể:
PHP:
Object p = new Point(120, 3); // p = null; if (p instanceof Point) { System.out.println("true"); } else { System.out.println("false"); }
Kết quả là true
nhưng nếu đối tượng là null thì kết quả là false

Đối với equals(Object) bạn có thể làm như sau:
PHP:
@Override public boolean equals(Object obj) { // Nếu đúng thì kiểm tra tiếp, sai thì trả về false if (obj instanceof Point) { // ép kiểu về Point, không xảy ra ngoại lệ vì đã kiểm tra và chắc chắn nó là kiểu Point. Point p = (Point) obj; // Nếu tọa độ bằng nhau. if (this.x = p.x && this.y = p.y) { return true; } } return false; }
Có thể ép kiểu luôn ngay trong câu lênh if để cho gọn
Tính khoảng cách giữa 2 điểm trong Java


Bảo vệ 1:
- Mày có phải là con cháu gì của dòng họ Point không?
Tôi:
- Dạ không ạ. => xéo ngay.
----
Tôi: Dạ đúng.
Bảo vệ 1: Vào gặp Bảo vệ 2!
Bảo vẹ 2: mày cao bảo nhiêu... balah..
Tính khoảng cách giữa 2 điểm trong Java
)

Viết tay, không dùng IDE nên có thể có sai sót
Tính khoảng cách giữa 2 điểm trong Java
g) Viết chương trình sử dụng lớp Pointtrên để giải bài toán sau:
Cho hình chữ nhật ABCDnhư hình vẽ

Tính khoảng cách giữa 2 điểm trong Java


Tìm trên cạnh ABđiểm Mtọa độ nguyên sao cho chu vi tam giác MCDlà lớn nhất.
code của tớ
PHP:
class test1 { public static final double CD = 60; public static void main(String[] args) { int i; Point[] M = new Point[100]; double CV[] = new double[100];//khoi tao mang double voi 500 phan tu for (i = 0; i <= 60; i++) { M[i] = new Point(i, 20); M[i].distance(Point.origin); M[i].distance(60, 0); CV[i] = CD + M[i].distance(Point.origin) + M[i].distance(60, 0); } int imax=0; double MAX = CV[imax]; for ( i = 1; i <=60; i++) { if(CV[i]>MAX){ MAX=CV[i]; imax=i; M[imax].getX(); M[imax].getY(); } } System.out.println("Chu vi lon nhat : "+MAX); System.out.println("tai diem M co toa do la ("+M[imax].getX()+","+M[imax].getY()+")"); } }
bài này có 2 kết quả là M trùng với điểm A và điểm B ,làm như trên t chỉ cho ra được 1 kết quả
có cách nào làm ra được 2 điểm M1 và M2 không thanks bạn trước vì tớ mới học java
Đây là mình làm, nhìn nó khá là khó hiểu
Tính khoảng cách giữa 2 điểm trong Java
. Đã rút gọn một số đoạn mã thừa
Tính khoảng cách giữa 2 điểm trong Java


PHP:
/* * Point.java * * Created on October 22, 2012, 5:27 PM * * To change this template, choose Tools | Template Manager * and open the template in the editor. */ /** * * @author SITUVN */ public class Point { private int x; private int y; public static Point origin = new Point(); // contrustor public Point() { this(0, 0); } public Point(Point p) { this(p.x, p.y); } public Point(int x, int y) { this.x = x; this.y = y; } // getter public int getX() { return x; } public int getY() { return y; } // setter public void setX(int x) { this.x = x; } public void setY(int y) { this.y = y; } @Override public boolean equals(Object obj) { if (!(obj instanceof Point)) { return false; } return this.x == ((Point)obj).x && this.y == ((Point)obj).y; } @Override public String toString() { return "(" + this.x + "," + this.y + ")"; } public boolean isOrigin() { return this == this.origin; } public void move(int x, int y) { this.x = x; this.y = y; } public void translate(int dx, int dy) { this.x = this.x + dx; this.y = this.y + dy; } public static double distance(int x1, int y1, int x2, int y2) { return Math.sqrt(Math.pow((x1 - x2), 2) + Math.pow((y1 - y2), 2)); } public static double distance(Point p1, Point p2) { return distance(p1.x, p1.y, p2.x, p2.y); } public double distance(int x, int y) { return Math.sqrt(Math.pow((this.x - x), 2) + Math.pow((this.y - y), 2)); } public double distance(Point p) { return distance(p.x, p.y); } public double distance(double a, double b, double c) { return Math.abs(a * this.x + b * this.y + c) / Math.sqrt(Math.pow(a, 2) + Math.pow(b, 2)); } public static final double CD = 60; public static void main(String[] args) { PointDemo d = new PointDemo(); for (Point p : d.M()) { System.out.println(p.toString()); } } } class PointDemo{ Point p1; // D Point p2; // B public PointDemo() { this(0, 0, 60, 40); } public PointDemo(int x1, int y1, int x2, int y2) { this(new Point(x1, y1), new Point(x2, y2)); } public PointDemo(Point p1, Point p2) { this.p1 = p1; this.p2 = p2; } // Chỗ này khó hiểu lắm =)). Mình làm sai mà chẳng hiểu nó sai chỗ nào, loay hoay mãi public Point[] M() { Point[] MPoints = new Point[1]; Point temp; double perimeter = 0; double ptemp = 0; // Luôn cho chạy từ số nhỏ đến số lớn for (int i = p2.getX() > p1.getX() ? p1.getX() : p2.getX(); i <= (p2.getX() > p1.getX() ? p2.getX() : p1.getX()); i++) { temp = new Point(i, p2.getY()); // Tính chu vi ptemp = Math.abs(p1.getX() - p2.getX()) + p1.distance(temp) + new Point(p2.getX(), p1.getY()).distance(temp); if (perimeter < ptemp) { MPoints[0] = temp; perimeter = ptemp; } } // Luôn cho chạy từ số nhỏ đến số lớn for (int i = p2.getX() > p1.getX() ? p1.getX() : p2.getX(); i <= (p2.getX() > p1.getX() ? p2.getX() : p1.getX()); i++) { temp = new Point(i, p2.getY()); // Tính chu vi ptemp = Math.abs(p1.getX() - p2.getX()) + p1.distance(temp) + new Point(p2.getX(), p1.getY()).distance(temp); // Xét nó có chu vi bằng không, nhưng loại bỏ trường hợp có tọa độ x bằng nhau if (perimeter == ptemp && MPoints[0].getX() != i) { // Thêm vào mảng MPoints = addElement(MPoints, temp); } } return MPoints; } // Thêm phần tử vào mảng. private Point[] addElement(Point[] array, Point e) { Point[] result = new Point[array.length + 1]; for (int i = 0; i < array.length; i++) { result[i] = array[i]; } result[result.length - 1] = e; return result; } }