我正在尝试检查一个三角形是否是Java中的直角三角形。 这是测试人员类的一部分:
Triangle a = new Triangle(new Point(2, 2), new Point(6, 2), new Point(2, 6) );
System.out.println(a.isRight()); //Expects True
我的三角形类的一部分接收值并将它们设置为x1,y2等:
public Triangle(Point loc1, Point loc2, Point loc3) {
x1 = loc1.getX(); y1 = loc1.getY();
. . .
前两段代码是给我的。我要制作最后一段代码:
public boolean isRight() {
if((Math.pow(side1,2)+Math.pow(side2,2)) == Math.pow(side3,2))
return true;
if((Math.pow(side2,2)+Math.pow(side1,2)) == Math.pow(side3,2))
return true;
if((Math.pow(side3,2)+Math.pow(side2,2)) == Math.pow(side1,2))
return true;
else
return false;
}
但是,它仍然返回false。我究竟做错了什么? 非常感谢!
更新: 谢谢您的帮助。我似乎犯了一个相当noob-ish的错误。我从来没有想过双打不是很准确的事实(对不起,只是想用简单的方式说出我做了什么)。我最后输入了这个:
if(Math.abs(side1*side1 + side2*side2 - side3*side3) < 0.2)
return true;
if(Math.abs(side1*side1 + side3*side3 - side2*side2) < 0.2)
return true;
if(Math.abs(side3*side3 + side2*side2 - side1*side1) < 0.2)
return true;
else
return false;
再次感谢您的帮助!
答案 0 :(得分:6)
我看到了很多问题:
Math.pow
对数字求平方,这既低效又不精确。 (您应该使用*
。)==
- 它通常不会。答案 1 :(得分:2)
浮点数不准确,使用==
进行比较通常会失败。你应该取两个数字之间的绝对差值,并确保它非常小:
private static boolean closeEnough(double a, double b) {
return Math.abs(a - b) < 0x1p-32;
}
如果需要,您可以使用0x1p-32
的其他阈值。
答案 2 :(得分:1)
如果您的方法isRight()
应该从3个浮点值计算答案,它将永远不会起作用,因为正如其他人指出的那样,您的计算会得到不准确的结果。你可能会很乐意接受像Chris Jester-Young这样的“足够接近”的方法。
但是,您的三角形是使用整数坐标指定的,因此您不需要使用浮点值。您可以使用三边的正方形(因为它们将是整数)来执行此操作,或者您可以使用渐变来查看是否有任何两条边是垂直的。由于这是一个编程站点而不是数学站点,我不会提供详细信息,但可以使用int
加法,减法和乘法来实现,但是,如果你聪明,没有除法。
答案 3 :(得分:1)
你没有提到你如何计算Side1
,Side2
和Side3
假设这些是正确的你第二次检查你的功能与第一次功能相同没有区别。所以正确的版本将是
public boolean isRight() {
return Math.pow(side1, 2) + Math.pow(side2, 2)) == Math.pow(side3, 2) ||
Math.pow(side1, 2) + Math.pow(side3, 2)) == Math.pow(side2, 2) ||
Math.pow(side3, 2) + Math.pow(side2, 2)) == Math.pow(side1, 2)
}
答案 4 :(得分:0)
如果您的要求是根据输入的3个不同设定点检查直角,那么您可以参考以下内容:)
首先是传递两分的课程。 (如果你已经有两边的长度,那么你可以跳过这个)
public class Point {
private double x;
private double y;
public double getX() {
return x;
}
public void setX(double x) {
this.x = x;
}
public double getY() {
return y;
}
public void setY(double y) {
this.y = y;
}
public Point(double x, double y) {
this.x=x;
this.y=y;
}
}
查找输入值是否属于直角三角形的类
public class CheckRightAngledTriangle {
/**
* Method to check if entered 3 sides belong to right angled triangle
*
* @param a
* @param b
* @param c
* @return
*/
boolean isRightAngledTriangle(Point a, Point b , Point c){
Double lengthA = getLength(a,b);
Double lengthB = getLength(b,c);
Double lengthC = getLength(c,a);
return Math.pow(lengthA, 2) + Math.pow(lengthB, 2) == Math.pow(lengthC, 2) ||
Math.pow(lengthA, 2) + Math.pow(lengthC, 2) == Math.pow(lengthB, 2) ||
Math.pow(lengthC, 2) + Math.pow(lengthB, 2) == Math.pow(lengthA, 2);
}
/**
* Method to get length between two points
*
* @param point1
* @param point2
* @return
*/
public double getLength(Point point1 , Point point2){
return Math.sqrt((point2.getX()-point1.getX())*(point2.getX()-point1.getX()) + (point2.getY()-point1.getY())*(point2.getY()-point1.getY()));
}
/**
* Main method
*
* @param args
*/
public static void main(String[] args) {
Point pointA = new Point(5, 0);
Point pointB = new Point(0, 0);
Point pointC = new Point(1.8, 2.4);
CheckRightAngledTriangle angledTriangle = new CheckRightAngledTriangle();
System.out.println("Result is :"+angledTriangle.isRightAngledTriangle(pointA,pointB,pointC));
}