繁体   English   中英

检查三角形是否是直角三角形

[英]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;

再次感谢您的帮助!

我看到了一些问题:

  • 选中这两个2 + B 2 = C 2B 2 + 2 = C 2,但这些实际上相当于
  • 你永远不会检查是否一个 2 + C 2 = B 2。
  • 你使用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加法,减法和乘法来实现,但是,如果你很聪明,没有除法。

你没有提到你是如何计算Side1Side2Side3假设这些都是正确的在你的功能,你第二次检查是一样的第一个功能是没有区别的。 所以正确的版本将是

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM