Tính khoảng cách giữa 2 điểm trong Java
Ngày đăng:
30/10/2021
Trả lời:
0
Lượt xem:
722
Bài 1â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;
}
} 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");
} 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;
} 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.. ) Viết tay, không dùng IDE nên có thể có sai sót 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ì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()+")");
}
} 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 . Đã rút gọn một số đoạn mã thừa
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;
}
} |