[英]Checking if a triangle is a right triangle
我试图检查一个三角形是否是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;
再次感谢您的帮助!
我看到了一些问题:
Math.pow
来对数字求平方,这既低效又不精确。 (你应该只使用*
。) ==
- 它通常不会。 浮点数不准确,使用==
进行比较通常会失败。 你应该取两个数字之间的绝对差值,并确保它非常小:
private static boolean closeEnough(double a, double b) {
return Math.abs(a - b) < 0x1p-32;
}
如果需要,可以使用0x1p-32
的不同阈值。
如果你的方法isRight()
应该从3个浮点值计算答案,它将永远不会起作用,因为正如其他人指出的那样,你的计算会得到不准确的结果。 你可能会很乐意接受像Chris Jester-Young这样的“足够接近”的方法。
但是,使用整数坐标指定三角形,因此不需要使用浮点值。 您可以使用三边的正方形 (因为这些将是整数)来执行此操作,或者您可以使用渐变来查看是否有任何两条边是垂直的。 由于这是一个编程站点而不是数学站点,我不会给出详细信息,但是可以使用int
加法,减法和乘法来实现,但是,如果你很聪明,没有除法。
你没有提到你是如何计算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)
}
如果您的要求是根据输入的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));
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.