#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