当前位置: 首页 > 知识库问答 >
问题:

特定的直角三角形在Cpp中不被识别为直角三角形

房时铭
2023-03-14

我们的OOP老师给我布置了一个作业。虽然我的代码看起来很好,但我仍然面临这个问题。

我必须从用户那里获取三角形顶点的坐标,并且必须判断它是否是一个r直角三角形。所以我简单地用毕达哥拉斯定理来求它,我们都知道用条件:h*h=b*b+p*p

但令人惊讶的是,这对某些特定的直角三角形不起作用。这里有一个这样的三角形:

顶点A:(x,y)=(1,3)

顶点B:(x,y)=(1,1)

顶点C:(x,y)=(5,1)

它计算得很完美,这是我通过打印计算出来的,但仍然不起作用。

然后尝试使用cmath库中的sqrt()函数:h=sqrt(b*b+p*p)

逻辑上是一样的,但它起作用了。

我想明白了,为什么早先的方法不管用?

下面是我的代码的简化版本:

#include <iostream>
#include <cmath>

using namespace std;

class Vertex {

    double x, y;

public:
    void take_input(char obj) {
        cout << endl << "   Taking Coordinates of Vertex " << obj << ": " << endl;

        cout << "       Enter the x component: ";
        cin >> x;
        cout << "       Enter the y component: ";
        cin >> y;
    }

    double distance(Vertex p) {
        double dist = sqrt((x-p.x)*(x-p.x) + (y-p.y)*(y-p.y));

        return dist;
    }
};

class Triangle {
    Vertex a, b, c;

public:

    void take_inp(string obj) {
        cout << endl << "Taking Vertices of the Triangle " << obj << ": " << endl;
        cout << "   Verteces should be in a counter clockwise order (as per convention)." << endl;

        a.take_input('A');
        b.take_input('B');
        c.take_input('C');
    }

    void is_rt_ang() {

        double h = a.distance(c)*a.distance(c);
        double bp = a.distance(b)*a.distance(b) + b.distance(c)*b.distance(c);

        /*
            // Strangely this attempt works which is logically the same: 
            double h = a.distance(c);
            double bp = sqrt(a.distance(b)*a.distance(b) + b.distance(c)*b.distance(c));
        */

        if (h == bp) {
            cout << "Angle is 90" << endl;
            cout << h << " = " << bp << endl;
            cout << "It is Right-Angled" << endl;
        }
        else {
            cout << "Angle is not 90!" << endl;
            cout << h << " != " << bp << endl;
            cout << "It is Not a Right-Angled" << endl;
        }
    }
};

int main()
{
    Triangle tri1, tri2;

    tri1.take_inp("tri1");

    tri1.is_rt_ang();

    return 0;
}

共有1个答案

鲁杜吟
2023-03-14

is_rt_ang函数中,假设斜边始终是边ac,但似乎没有做任何事情来验证这一点。

double h = a.distance(c)*a.distance(c);
double bp = a.distance(b)*a.distance(b) + b.distance(c)*b.distance(c);

您可以尝试先得到所有距离的平方,即(AC)^2(AB)^2(BC)^2,然后从这三个距离中取最大值,找到斜边的候选值,然后执行如下操作:

bool isRightTriangle = max == (min1 + min2)

您还可能遇到浮点数的舍入错误。比较浮点数时,通常使用一个epsilon值,因为浮点数固有的舍入错误。如果您不需要浮点值,可以使用整数,或者如果您确实需要浮点值,请尝试在您的等式中使用epsilon值,如下所示:

abs(h - bp) <= epsilon

您应该能够在Web上找到更多关于浮点值、舍入错误和机器Epsilon的信息。

 类似资料:
  • 问题内容: 我想尝试一个直角三角形的星号。但是我只得到以下 输出:( 我不能在这里放置星号) 我想要的是这样的: 这是我编写的代码: 任何想法分享,我们将不胜感激。我是Java新手。谢谢。 问题答案: 您的代码从不打印任何空格,这应该是一个问题。 您可以使用以下简单方法: 逻辑很简单:您的字符串带有两个空格和三个at符号。输出的第一行必须是两个空格和一个at符号,因此这是字符串的前三个字符。第二行

  • 本文向大家介绍python 打印直角三角形,等边三角形,菱形,正方形的代码,包括了python 打印直角三角形,等边三角形,菱形,正方形的代码的使用技巧和注意事项,需要的朋友参考一下 三角形 等腰直角三角形1 2.7 python:打印直角三角形 coding=utf-8 方式一 方式二 #打印实心等边三角形 #打印菱形 #实心正方形 #空心正方形 知识点说明: python ,end=''备注

  • 一个角度为90°的三角形称为直角三角形。 我们现在将看到如何以直角三角形打印星星*。 算法 (Algorithm) 算法看起来像这样 - Step 1 - Take number of rows to be printed, n. Step 2 - Make outer iteration I for n times to print rows Step 3 - Make inner iterat

  • 题目描述: 有N条线段,长度分别为a[1]-a[N]。现要求你计算这N条线段最多可以组合成几个直角三角形,每条线段只能使用一次,每个三角形包含三条线段。 输入描述: 第一行输入一个正整数T(1 <= T <= 100),表示有T组测试数据。 对于每组测试数据,接下来有T行,每行第一个正整数N,表示线段个数,(3<=N<20),接着是N个正整数,表示每条线段长度,(0<a[i]<100)。 输出描述

  • 本文向大家介绍计算C ++中给定周长可能的直角三角形数量,包括了计算C ++中给定周长可能的直角三角形数量的使用技巧和注意事项,需要的朋友参考一下 给定三角形的周长P。周长是三角形所有边的总和。目的是找到可以制造的具有相同周长的直角三角形的数量。 如果三角形的边是a,b和c。然后a + b + c = P和a2 + b2 = c2(a,b和c的任意组合的毕达哥拉斯定理) 我们将通过从1到p / 2

  • 一个三角形由三个表示其三个角的Vector3所定义。 构造函数 Triangle( a : Vector3, b : Vector3, c : Vector3 ) a - 三角形的第一个角,默认值是一个在(0, 0, 0)处的Vector3。 b - 三角形的第二个角,默认值是一个在(0, 0, 0)处的Vector3。 c - 三角形的第三个角(最后一个角),默认值是一个在(0, 0, 0)处的