计算两点之间的距离
我需要创建一个计算两点之间距离的类。 我被困了,我是一个初学者。 这是我的课程:
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); }
这将返回一个全新的点对象,其中点设置在给定两点的中间(不必关心任何其他数学)。 并且,由于你的第二课是一行,你只需要两个端点来描述它,所以我会做一些小改动。
First 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
(经典的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
是Xy - Yy
, b
是Yx - Xx
。 c
的长度是它们的距离,是该三角形的斜边的长度。 它的计算方法是使用
sqrt(a^2 + b^2);
既然你看到我们正在对a
和b
进行平方,那么它们的符号就不相关了 – 它会归结为相同的。 所以这种方法总是有效的,无论哪个点都存在。
查看Pythagorean theorem
你真的需要距离,还是想要获得中点? 因为从您的代码片段来看,您只想创建一个位于两个现有点之间的新点。
如果你真的只是在中点之后,你真的不需要整个第二类(即’Line’)来完成它。 既然你想要找到的东西也是一个点,那么在你现有的Point类中添加一个构造函数是有意义的,就像这样。
Point(Point a, Point b) { x = (ax + bx) / 2; y = (ay + by) / 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 = ax - bx; double dy = ay - by; 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使用负值等处理问题。对于您来说,使用Math.pow为您提供了一种安全的方法,因为它内置了大量的检查。
正如其他人所说, 你可以使用毕达哥拉斯定理 。 这是Wolfram Demostration Project的视觉演示。
alt text http://demonstrations.wolfram.com/DistanceBetweenTwoPoints/HTMLImages/index.en/popup_5.jpg
在你的第二个类中,看起来你正试图设置用于构造你的mp
变量的x
和y
的值。 你的所有公式都是正确的,但你需要考虑一切都被执行的顺序 。 在代码中,它创建了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); }