SFML c ++中的右三角测试

时间:2017-05-20 06:16:12

标签: c++ sfml

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

#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;
}

2 个答案:

答案 0 :(得分:0)

所以我更正了代码,这在所有情况下都能正常工作。在哪里我发现错误我评论//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;
}

答案 1 :(得分:0)

按照这样做检查:

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
}