4

Мое назначение - создать основной класс, в котором я инициализирую значение любой точки, находящейся в (0,0,0), и иметь возможность доступа и изменять все три значения (x, y, z) индивидуально. Для этого я использовал геттеры и сеттеры. Моя следующая задача - создать метод в моем основном классе (который я назову «distanceTo»), который вычисляет расстояние между двумя точками.Расчет расстояния между двумя точками в 3D

Как мне создать метод «distanceTo», который вычисляет расстояние между двумя точками, принимая координаты x, y, z? Я полагаю, что мой ответ будет иметь отношение к sqrt((x1-x2)^2+(y1-y2)^2+(z1-z2)^2), но я не знаю, как я могу написать это в своем методе в моем основном классе, если мои точки не определены до тех пор, пока мой второй класс тестовой точки

Пока у меня есть только два точки, но я ищу более общий ответ (так что, если бы я создал три точки, p1 p2 и p3, я мог бы рассчитать расстояние между p1 и p2 или расстояние между p2 и p3 или расстояние между p1 и p3.

Мой главный класс:

package divingrightin; 

public class Point3d { 

    private double xCoord; 
    private double yCoord; 
    private double zCoord; 


    public Point3d(double x, double y, double z){ 
     xCoord = x; 
     yCoord = y; 
     zCoord = z; 
    } 

    public Point3d(){ 
     this (0,0,0); 
    } 

    public double getxCoord() { 
     return xCoord; 
    } 
    public void setxCoord(double xCoord) { 
     this.xCoord = xCoord; 
    } 
    public double getyCoord() { 
     return yCoord; 
    } 
    public void setyCoord(double yCoord) { 
     this.yCoord = yCoord; 
    } 
    public double getzCoord() { 
     return zCoord; 
    } 
    public void setzCoord(double zCoord) { 
     this.zCoord = zCoord; 
    } 

    //public double distanceTo(double xCoord, double yCoord, double zCoord){ 


    } 

Мой класс с контрольными точками: пакет ди vingrightin;

public class TestPoints { 

    public static void main(String[] args) { 

     Point3d firstPoint = new Point3d(); 

     firstPoint.setxCoord(2.2); 
     firstPoint.setyCoord(1); 
     firstPoint.setzCoord(5); 

     //System.out.println(firstPoint.getxCoord()); 

     Point3d secondPoint = new Point3d(); 

     secondPoint.setxCoord(3.5); 
     secondPoint.setyCoord(22); 
     secondPoint.setzCoord(20); 

    } 

} 
+0

Вы хотите метод distanceTo в классе «Point3d». Что-то вроде: 'public double distanceTo (Point3d p) {...}' там вы можете делать вычисления расстояний – Dude

ответ

4

Как @Dude отметил в комментариях, вы должны написать метод:

public double distanceTo(Point3d p) { 
    return Math.sqrt(Math.pow(x - p.getxCoord(), 2) + Math.pow(y - p.getyCoord(), 2) + Math.pow(z - p.getzCoord(), 2)); 
} 

Тогда, если вы хотите, чтобы получить расстояние между 2 точками вы просто позвоните:

myPoint.distanceTo(myOtherPoint); 
//or if you want to get the distance to some x, y, z coords 
myPoint.distanceTo(new Point3d(x,y,z); 

Можно даже сделать метод статического и дать ему 2 очка для сравнения:

public static double getDistance(Point3d p1, Point3d p2) { 
    return Math.sqrt(Math.pow(p1.getxCoord() - p2.getxCoord(), 2) + ... 
} 

P.S. мой первый ответ :)

+0

Есть ли способ использовать первый метод, который вы использовали public double distanceTo (Point3d p) { return Math.sqrt (Math.pow (x - p.getxCoord, 2) + Math.pow (y - p.getyCoord, 2) + Math.pow (z - p.getzCoord, 2)); } } , но пропустите два очка вместо одного, чтобы я мог получить расстояние между любыми двумя точками, а не только первое и другое, но, возможно, второе и другое, или 9-е и 5-е очко ... –

+0

Да, если вы используйте статический метод, просто напишите его в своем Point3d Class, а затем вы можете позвонить ему через: 'Point3d.getDistance (myPoint1, myPoint2);' , который вернет расстояние между двумя точками. – KarlTheGreat

+0

, если вы хотите узнать больше о статических полях и методе, вы можете подключиться к [doc] (https://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html) – KarlTheGreat

0

Просто используйте добытчик

float distance = Math.sqrt(Math.pow(secondPoint.getXCoord() - firstPoint.getXCoord()), 2) + ...) 
+0

Означает ли это, что мне придется создавать новый метод каждый раз, когда я создаю новую точку и хочу рассчитать расстояние между этой точкой и другой точкой? –

+0

Нет ответа Диего – Shaun

6
public double distanceTo(Point3d other) { 
    return Math.sqrt(Math.pow(this.xCoord-other.getxCoord(), 2) 
      + Math.pow(this.yCoord-other.getyCoord(), 2) 
      + Math.pow(this.zCoord-other.getzCoord(), 2)); 
} 

Добавить это в класс Point3d. Когда вам нужно рассчитать расстояние в классе TestPoints, вы сделаете что-то вроде

double distance = firstPoint.distanceTo(secondPoint); 
0

Две идеи.

Либо добавить:

public double distanceTo(Point3d otherPoint) { 
    // return distance by using this.getxCoord(), this.getyCoord(), etc. 
    // and otherPoint.getxCoord(), otherPoint.getyCoord() 
} 

метод вашего Point3d класса. Затем, в конце вашего метода main, вы можете сделать:

System.out.println(firstPoint.distanceTo(secondPoint)); 
System.out.println(tenthPoint.distanceTo(ninthPoint)); 

Или добавить статический метод основного TestPoints класса:

public static double distanceBetween(Point3d point1, Point3d point2) { 
    // return distance by using point1.getxCoord(), etc. and point2.getxCoord() 
} 

Затем, в конце вашего метода main , вы можете сделать:

System.out.println(distanceBetween(firstPoint, secondPoint)); 
System.out.println(distanceBetween(tenthPoint, ninthPoint)); 
3

У вас есть два возможных подхода, в соответствии с тем, чего вы хотите достичь.

Вы можете поместить свой метод «distanceTo» внутри класса Point3D:

public class Point3d { 
    ... 
    public double distanceTo(Point3d) { 
    return Math.sqrt(Math.pow(this.x - that.x, 2) + Math.pow(this.y - that.y, 2) + Math.pow(this.z - that.z, 2)); 
} 

В этом случае, вы всегда использовать первую точку в качестве первого аргумента, и любой другой точки, как тот, который вы хотите вычислить расстояние от.

В качестве альтернативы, вы можете иметь общий метод distanceTo, который живет где-то (например, в классе Program, где у Вас есть свой основной метод), который принимает две точки и вычислить расстояние между тем:

public class Program { 
    static public void main(String[] args) {} 
    public double distanceTo(Point3d p1, Point3d p2) { 
    return Math.sqrt(Math.pow(p1.x - p2.x, 2) + Math.pow(p1.y - p2.y, 2) + Math.pow(p1.z - p2.z, 2)); 
    } 
} 

Какая из них лучше? В зависимости от того, как вы используете их в общем случае :)

+0

Возможно, лучше назвать методы этого: 'that.getxCoord' вместо' that.x'. Если позже требуется предоставить интерфейс точки и иметь несколько классов (полярный, евклидовой, ...), этот метод все равно будет работать. –

+0

Это было просто для примера: если вы читаете вопрос, OP предоставляет геттеры, но вы правы. –

Смежные вопросы