Powrót
KarolB zadanie 698

#include <bits/stdc++.h>
using namespace std;

// Ten program daje wyniki niezgodne z odpowiedziami
struct punkt
{
    int x;
    int y;
};

struct obliczanie
{
    int wynik;
    double dst;
};

double odleglosc(punkt a, punkt b)
{
    return sqrt(pow(b.x - a.x, 2) + pow(b.y - a.y, 2));
}

double od_prostej(double wspA, double wspB, punkt p)
{
    double wspC = -1/wspA;
    double wspD = p.y - wspC*p.x;
    punkt przeciecie;
    przeciecie.x = (wspD-wspB)/(wspA-wspC);
    przeciecie.y = wspA*przeciecie.x + wspB;
    return odleglosc(p, przeciecie);
}

obliczanie oblicz(punkt a, punkt b, punkt c)
{
    obliczanie temp;
    double wspA, wspB;
    wspA = (b.y - a.y)/(b.x - a.x);
    wspB = a.y - wspA*a.x;
    if (c.y - wspA*c.x == wspB)
    {
        if(odleglosc(a,b) <= (odleglosc(c,b) + odleglosc(c,a)))
        {
           // cout << "Punkt " << c.x << "," << c.y << " nalezy do odcinka." << endl;
            temp.wynik = 1;
            temp.dst = 0;
            return temp;
        }
        else
        {
           // cout << "Punkt " << c.x << "," << c.y << " nie nalezy do odcinka, ale nalezy do prostej." << endl;
            temp.wynik = 2;
            temp.dst = 0;
            return temp;
        }
    }
    else
    {
      //  cout << "Punkt nie nalezy ani do odcinka ani do prostej. Jego odleglosc od prostej wynosi " << od_prostej(wspA, wspB, c) << endl;
        temp.dst = od_prostej(wspA, wspB, c);
        temp.wynik = 0;
        return temp;
    }
}

int main()
{
    ifstream plik("punkty_odcinki.txt");
    punkt first, second, c;
    int na_odcinku = 0;
    int na_prostej = 0;
    double suma_odleglosci = 0;
    for(int i = 0; i < 100; i++)
    {
        plik >> first.x >> first.y >> second.x >> second.y >> c.x >> c.y;
        if(oblicz(first, second, c).wynik == 1 && oblicz(first, second, c).dst == 0)
        {
            na_odcinku++;
            na_prostej++;
        }
        else if(oblicz(first, second, c).wynik == 2 && oblicz(first, second, c).dst == 0)
            na_prostej++;
        else if(oblicz(first, second, c).dst > 0)
        {
            suma_odleglosci += oblicz(first, second, c).dst;
        }
    }
    cout << "Do odcinka nalezy " << na_odcinku << " punktow" << endl;
    cout << "Do prostej nalezy " << na_prostej << " punktow" << endl;
    cout << "Suma odleglosci punktow poza prosta wynosi " << suma_odleglosci << endl;
    return 0;
}

 


Karol Biernacki 2022-10-13

Dodaj komentarz

Zaloguj się aby odpowiedzieć (login i hasło uzyskasz w szkole)