【问题标题】:Right Triangle Test in SFML c++SFML c ++中的直角三角形测试
【发布时间】:2017-10-20 07:47:22
【问题描述】:

我正在尝试创建一个程序,用户可以在其中输入坐标点,然后根据这些点生成一个三角形。不幸的是,当用户输入的第一边是斜边时。我的程序说三角形不是直角三角形,而实际上它是直角三角形。

#include<iostream>
#include<SFML/Graphics.hpp>
#include<math.h>
using namespace std;
using namespace sf;

int main(){

    double x1;
    double y1;
    double x2;
    double y2;
    double x3;
    double y3;
    double DistanceP0;
    double DistanceP1;
    double DistanceP2;
    int yes;
    double area;
    double area2;
    double hyp;
    double side1;
    double side2;
    cout << "Enter 6 integers. (it works better when those integers are greater than 100)" << endl;
    cin >> x1;
    cin >> y1;
    cin >> x2;
    cin >> y2;
    cin >> x3;
    cin >> y3;
    RenderWindow window(VideoMode(1500,800), "SFML saves!");
    window.setFramerateLimit(60);
    sf:: ConvexShape Triangle;
    Triangle.setPointCount(3);
    Triangle.setPoint(0, sf::Vector2f(x1,y1));
    Triangle.setPoint(1, sf::Vector2f(x2,y2));
    Triangle.setPoint(2, sf::Vector2f(x3,y3));
    DistanceP0 = sqrt(((x1 - x2) * (x1 - x2)) + ((y1 - y2) * (y1 - y2)));
    DistanceP1 = sqrt(((x1 - y1) * (x1 - y1)) + ((x3 - y3) * (x3 - y3)));
    DistanceP2 = sqrt(((x3 - x2) * (x3 - x2)) + ((y3 - y2) * (y3 - y2)));

    //I am pretty sure that the error happens somewhere here{

    if (DistanceP0 > DistanceP1 and DistanceP0 > DistanceP2)
    {
        hyp = DistanceP0;
        if (DistanceP1 >= DistanceP2)
        {
            side1 = DistanceP1;
            side2 = DistanceP2;
        }
        else(DistanceP1 <= DistanceP2){
            side1 = DistanceP2;
            side2 = DistanceP1;
        }
    }
    else if (DistanceP1 > DistanceP0 and DistanceP1 > DistanceP2){
        hyp = DistanceP1;
        if (DistanceP0 >= DistanceP1)
        {
            side1 = DistanceP0;
            side2 = DistanceP1;
        }
        else(DistanceP0 <= DistanceP1)
        {
            side1 = DistanceP1;
            side2 = DistanceP0;
        }
    }
    else {
        hyp = DistanceP2;
        if (DistanceP0 >= DistanceP1)
        {
            DistanceP0 = side1;
            DistanceP1 = side2;
        }
        else(DistanceP0 <= DistanceP1)
        {
            DistanceP1 = side1;
            DistanceP2 = side2;
        }
    }


    if((side1 * side1) + (side2 * side2) == (hyp * hyp)){
            yes = 1;
        cout << "Your triangle is a right triangle" << endl;
    }
    else{
        cout << "Your triangle is not a right triangle" << endl;
    }
    if(fabs(((side1 * side1) -(side2 * side2) - (hyp * hyp))) <= 0.00001){
        yes = 1;
        cout << "Your triangle is a right triangle" << endl;
    }

  //}

    if(yes == 1){
       cout << "The area of your triangle is " << (DistanceP0 * DistanceP1)/2 << endl;
       area = (DistanceP0 * DistanceP1)/2;
    }
    area = sqrt(area);
    RectangleShape RightSquare(Vector2f(area,area));
    RightSquare.setPosition(x1,y1);
    RightSquare.setFillColor(Color::Red);

    if(yes!= 1){
    double s = (DistanceP0 + DistanceP1 + DistanceP2)/2;
    double R = s *((s - DistanceP0)*(s - DistanceP1) * (s - DistanceP2));
    area2 = sqrt(fabs(R));
    cout << "The area of your triangle is " << area2 << endl;
    }
    double area3 = sqrt(area2);
    RectangleShape Square(Vector2f(area3,area3));
    Square.setPosition(x1, y1);
    Square.setFillColor(Color::Red);
     while (window.isOpen())
        {

            sf::Event event;
            while (window.pollEvent(event));
            {
                if(event.type == sf::Event::Closed)
                    window.close();
            }
            window.clear();
            window.draw(Triangle);
            if(yes == 1){
                window.draw(RightSquare);
            }
            else{
                window.draw(Square);
            }

            window.display();

    }

    return 0;
}

【问题讨论】:

  • 你能给出这个程序工作的一些坐标吗?
  • 当然。 100,100,400,700,100,700。您输入的所有其他坐标都有效,但当第一边是斜边时则不然。

标签: c++ sfml


【解决方案1】:

所以我已经更正了代码,这在所有情况下都可以正常工作。我在哪里发现错误我评论了//here

#include<iostream>
#include<SFML/Graphics.hpp>
#include<math.h>
using namespace std;
using namespace sf;

int main(){

double x1;
double y1;
double x2;
double y2;
double x3;
double y3;
double DistanceP0;
double DistanceP1;
double DistanceP2;
int yes;
double area;
double area2;
double hyp;
double side1;
double side2;
cout << "Enter 6 integers. (it works better when those integers are greater than 100)" << endl;
cin >> x1;
cin >> y1;
cin >> x2;
cin >> y2;
cin >> x3;
cin >> y3;
RenderWindow window(VideoMode(1500,800), "SFML saves!");
window.setFramerateLimit(60);
sf:: ConvexShape Triangle;
Triangle.setPointCount(3);
Triangle.setPoint(0, sf::Vector2f(x1,y1));
Triangle.setPoint(1, sf::Vector2f(x2,y2));
Triangle.setPoint(2, sf::Vector2f(x3,y3));
DistanceP0 = sqrt(((x1 - x2) * (x1 - x2)) + ((y1 - y2) * (y1 - y2)));
DistanceP1 = sqrt(((x3 - x1) * (x3 - x1)) + ((y3 - y1) * (y3 - y1)));
DistanceP2 = sqrt(((x3 - x2) * (x3 - x2)) + ((y3 - y2) * (y3 - y2)));

//I am pretty sure that the error happens somewhere here{

if (DistanceP0 > DistanceP1 and DistanceP0 > DistanceP2)
{
    hyp = DistanceP0;
    if (DistanceP1 >= DistanceP2)
    {
        side1 = DistanceP1;
        side2 = DistanceP2;
    }
    else if(DistanceP1 <= DistanceP2){
        side1 = DistanceP2;
        side2 = DistanceP1;
    }
}
else if (DistanceP1 > DistanceP0 and DistanceP1 > DistanceP2){
    hyp = DistanceP1;
    // here
    if (DistanceP0 >= DistanceP2)
    {
        side1 = DistanceP0;
        side2 = DistanceP2;
    }
    else if(DistanceP0 <= DistanceP2)
    {
        side1 = DistanceP2;
        side2 = DistanceP0;
    }
}
else {
    hyp = DistanceP2;
    if (DistanceP0 >= DistanceP1)
    {
        /* here
        DistanceP0 = side1;
        DistanceP1 = side2;
        */
        side1 = DistanceP0;
        side2 = DistanceP1;
    }
    else if(DistanceP0 <= DistanceP1)
    {
        // here
        side1 = DistanceP1;
        side2 = DistanceP0;
    }
}


if(((side1 * side1) + (side2 * side2)) == (hyp * hyp)){
        yes = 1;
    cout << "Your triangle is a right triangle" << endl;
}

// here?
else if(fabs((((side1 * side1) +(side2 * side2)) - (hyp * hyp))) <= 0.00001){
    yes = 1;
    cout << "Your triangle is a right triangle" << endl;
}
else{
    cout << "Your triangle is not a right triangle" << endl;
}
//}

if(yes == 1){
   cout << "The area of your triangle is " << (DistanceP0 * DistanceP1)/2 << endl;
   area = (DistanceP0 * DistanceP1)/2;
}
area = sqrt(area);
RectangleShape RightSquare(Vector2f(area,area));
RightSquare.setPosition(x1,y1);
RightSquare.setFillColor(Color::Red);

if(yes!= 1){
double s = (DistanceP0 + DistanceP1 + DistanceP2)/2;
double R = s *((s - DistanceP0)*(s - DistanceP1) * (s - DistanceP2));
area2 = sqrt(fabs(R));
cout << "The area of your triangle is " << area2 << endl;
}
double area3 = sqrt(area2);
RectangleShape Square(Vector2f(area3,area3));
Square.setPosition(x1, y1);
Square.setFillColor(Color::Red);
 while (window.isOpen())
    {

        sf::Event event;
        while (window.pollEvent(event));
        {
            if(event.type == sf::Event::Closed)
                window.close();
        }
        window.clear();
        window.draw(Triangle);
        if(yes == 1){
            window.draw(RightSquare);
        }
        else{
            window.draw(Square);
        }

        window.display();

}

return 0;
}

【讨论】:

    【解决方案2】:

    这样检查:

    if(distance0 >= distance1 && distance0 >= distance2)
    {
        hypothenus = distance0;
        side1 = distance1;
        side2 = distance2;
    }
    
    if(distance1 >= distance0 && distance1 >= distance2)
    {
        hypothenus = distance1;
        side1 = distance0;
        side2 = distance2;
    }
    
    if(distance2 >= distance0 && distance2 >= distance1) {
        hypothenus = distance2;
        side1 = distance0;
        side2 = distance1;
    }
    
    if(hypothenus*hypothenus == side1*side1 + side2*side2){
        // ok
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-06
      • 1970-01-01
      • 2015-03-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多