[C++] Program sprawdzający współrzędne w trójkącie

Awatar użytkownika
Ceplusplusik
Użytkownik
Użytkownik
Posty: 228
Rejestracja: 7 paź 2012, o 17:02
Płeć: Mężczyzna
Lokalizacja: Kraków
Podziękował: 94 razy

[C++] Program sprawdzający współrzędne w trójkącie

Post autor: Ceplusplusik »

Witam serdecznie. Mam na celu utworzyć program badający, czy punkt D znajduje się w środku trójkąta ABC na układzie współrzędnych. Niby wszystko cacy, wzory grają, i tak dalej, i tak dalej, jednak nie sposób znaleźć jakikolwiek przykład, żeby punkt tenże się w tym trójkącie mieścił. Proszę o pomoc, pozdrawiam .

Kod: Zaznacz cały

#include <iostream>
#include <cmath>
using namespace std;

int main ()
{
	cout << "Witamy w programie obliczajacym, czy punkt "D" o danych wspolrzednych miesci sie w srodku trojkata."<< endl;
	
	double xa,ya,xb,yb,xc,yc,xd,yd;
	
	cout << "Wprowadz wartosc wspolrzednej x punktu A: "; cin>>xa;
	cout << "Wprowadz wartosc wspolrzednej y punktu A: "; cin>>ya;
	cout << endl <<"Wprowadz wartosc wspolrzednej x punktu B: "; cin>>xb;
	cout << "Wprowadz wartosc wspolrzednej y punktu B: "; cin>>yb;
	cout << endl <<"Wprowadz wartosc wspolrzednej x punktu C: "; cin>>xc;
	cout << "Wprowadz wartosc wspolrzednej y punktu C: "; cin>>yc;
	cout << endl << endl << "Wprowadz wartosc wspolrzednej x punktu D: "; cin>>xd;
	cout << "Wprowadz wartosc wspolrzednej y punktu D: "; cin>>yd;
	
	double AB = sqrt((pow(xb-xa, 2))+ (pow(yb-ya, 2)));
	double AC = sqrt((pow(xc-xa, 2))+ (pow(yc-ya, 2)));
	double CB = sqrt((pow(xb-xc, 2))+ (pow(yb-yc, 2)));

	
	double AD=sqrt((pow(xd-xa, 2))+ (pow(yd-ya, 2)));
	double BD=sqrt((pow(xd-xb, 2))+ (pow(yd-yb, 2)));
	double CD=sqrt((pow(xd-xc, 2))+ (pow(yd-yc, 2)));
	
	double obwod=AB+AC+CB;
	double n=obwod/2;
	double PoleABC=sqrt(n*(n-AB)*(n-AC)*(n-CB));
	
	double obwod1=AB+AD+BD;
	double n1=obwod1/2;
	double PoleABD=sqrt(n1*(n-AB)*(n-AD)*(n-BD));
	
	double obwod2=AC+CD+AD;
	double n2=obwod2/2;
	double PoleACD=sqrt(n2*(n-AC)*(n-CD)*(n-AD));
	
	double obwod3=BD+CD+CB;
	double n3=obwod3/2;
	double PoleCBD=sqrt(n3*(n-BD)*(n-CD)*(n-CB));
	
	if (AB+AC>CB && AB+CB>AC && CB+AC>AB)
	{
	
	if (PoleABC==PoleABD+PoleACD+PoleCBD)
	{
		cout << endl << "Wspolrzedna punktu D zawiera sie w trojkacie ABC." << endl;
		return 0;
	}
	
	else
		cout << endl << "Wspolrzedna punktu D nie zawiera sie w trojkacie ABC." << endl;
		return 0;
	
	}
	
	else 
		cout << endl << "Z wprowadzonych wspolrzednych punktow A,B oraz C nie mozna zbudowac trojkata, stad dalsze operacje sa niemozliwe do wykonania.";
		

}
Afish
Moderator
Moderator
Posty: 2828
Rejestracja: 15 cze 2008, o 15:45
Płeć: Mężczyzna
Lokalizacja: Seattle, WA
Podziękował: 3 razy
Pomógł: 356 razy

[C++] Program sprawdzający współrzędne w trójkącie

Post autor: Afish »

Poza pierwszym trójkątem, wszędzie masz zły wzór Herona. Poza tym popatrz na ten kod z daleka i zastanów się, czy jest sens marnować tyle uderzeń klawiszy? Nie lepiej wydzielić funkcje liczące długość boku, długość obwodu i pole trójkąta?
Awatar użytkownika
Ceplusplusik
Użytkownik
Użytkownik
Posty: 228
Rejestracja: 7 paź 2012, o 17:02
Płeć: Mężczyzna
Lokalizacja: Kraków
Podziękował: 94 razy

[C++] Program sprawdzający współrzędne w trójkącie

Post autor: Ceplusplusik »

Zastosowałem wzór Herona poprawnie i... Nadal to samo. Przerobię na łatwiejsze funkcje, ale najpierw muszę przebrnąć przez fazę "normal". Pozdrawiam . Zamieszczam normalny kod:

Kod: Zaznacz cały

#include <iostream>
#include <cmath>
using namespace std;

int main ()
{
	cout << "Witamy w programie obliczajacym, czy punkt "D" o danych wspolrzednych miesci sie w srodku trojkata."<< endl;
	
	double xa,ya,xb,yb,xc,yc,xd,yd;
	
	cout << "Wprowadz wartosc wspolrzednej x punktu A: "; cin>>xa;
	cout << "Wprowadz wartosc wspolrzednej y punktu A: "; cin>>ya;
	cout << endl <<"Wprowadz wartosc wspolrzednej x punktu B: "; cin>>xb;
	cout << "Wprowadz wartosc wspolrzednej y punktu B: "; cin>>yb;
	cout << endl <<"Wprowadz wartosc wspolrzednej x punktu C: "; cin>>xc;
	cout << "Wprowadz wartosc wspolrzednej y punktu C: "; cin>>yc;
	cout << endl << endl << "Wprowadz wartosc wspolrzednej x punktu D: "; cin>>xd;
	cout << "Wprowadz wartosc wspolrzednej y punktu D: "; cin>>yd;
	
	double AB = sqrt((pow(xb-xa, 2))+ (pow(yb-ya, 2)));
	double AC = sqrt((pow(xc-xa, 2))+ (pow(yc-ya, 2)));
	double CB = sqrt((pow(xb-xc, 2))+ (pow(yb-yc, 2)));

	
	double AD=sqrt((pow(xd-xa, 2))+ (pow(yd-ya, 2)));
	double BD=sqrt((pow(xd-xb, 2))+ (pow(yd-yb, 2)));
	double CD=sqrt((pow(xd-xc, 2))+ (pow(yd-yc, 2)));
	
	double obwod=AB+AC+CB;
	double n=obwod/2;
	double PoleABC=sqrt(n*(n-AB)*(n-AC)*(n-CB));
	
	double obwod1=AB+AD+BD;
	double n1=obwod1/2;
	double PoleABD=sqrt(n1*(n1-AB)*(n1-AD)*(n1-BD));
	
	double obwod2=AC+CD+AD;
	double n2=obwod2/2;
	double PoleACD=sqrt(n2*(n2-AC)*(n2-CD)*(n2-AD));
	
	double obwod3=BD+CD+CB;
	double n3=obwod3/2;
	double PoleCBD=sqrt(n3*(n3-BD)*(n3-CD)*(n3-CB));
	
	if (AB+AC>CB && AB+CB>AC && CB+AC>AB)
	{
	
	if (PoleABC==PoleABD+PoleACD+PoleCBD)
	{
		cout << endl << "Wspolrzedna punktu D zawiera sie w trojkacie ABC." << endl;
		return 0;
	}
	
	else
		cout << endl << "Wspolrzedna punktu D nie zawiera sie w trojkacie ABC." << endl;
		return 0;
	
	}
	
	else 
		cout << endl << "Z wprowadzonych wspolrzednych punktow A,B oraz C nie mozna zbudowac trojkata, stad dalsze operacje sa niemozliwe do wykonania.";
		
}
Afish
Moderator
Moderator
Posty: 2828
Rejestracja: 15 cze 2008, o 15:45
Płeć: Mężczyzna
Lokalizacja: Seattle, WA
Podziękował: 3 razy
Pomógł: 356 razy

[C++] Program sprawdzający współrzędne w trójkącie

Post autor: Afish »

Na moje oko rozbijasz się o niedokładność liczb zmiennopozycyjnych, porównywanie przez == to nie jest dobry pomysł. Porównuj z odpowiednim marginesem błędu i zadziała.
Przerobię na łatwiejsze funkcje, ale najpierw muszę przebrnąć przez fazę "normal"
Najwyraźniej lubisz sobie utrudniać życie, ale cóż - Twój wybór :)
Awatar użytkownika
Ceplusplusik
Użytkownik
Użytkownik
Posty: 228
Rejestracja: 7 paź 2012, o 17:02
Płeć: Mężczyzna
Lokalizacja: Kraków
Podziękował: 94 razy

[C++] Program sprawdzający współrzędne w trójkącie

Post autor: Ceplusplusik »

Ok, zaokrągliłem do "round" obydwa wyniki i teraz się zgadza . A mógłbyś kolego zaprezentować, jak "praktycznie" użyć funkcji konkretnie na tym przykładzie? Przerabialiśmy już na jednym z wykładów, ale przykłady na tyle banalne, że wykorzystać ich jeszcze nie sposób.
Afish
Moderator
Moderator
Posty: 2828
Rejestracja: 15 cze 2008, o 15:45
Płeć: Mężczyzna
Lokalizacja: Seattle, WA
Podziękował: 3 razy
Pomógł: 356 razy

[C++] Program sprawdzający współrzędne w trójkącie

Post autor: Afish »

Na przykład tak:

Kod: Zaznacz cały

#include <iostream>
#include <cmath>
using namespace std;

void askForSingleCoordinate(double& coordinate, char axis, char pointName){
	cout << "Wprowadz wartosc wspolrzednej "<<axis<<" punktu " << pointName << ": ";
	cin >> coordinate;
}

void askForPointCoordinates(double &xCoordinate, double &yCoordinate, char pointName){
	askForSingleCoordinate(xCoordinate, 'x', pointName);
	askForSingleCoordinate(yCoordinate, 'y', pointName);
}

double calculateSideLength(double startX, double startY, double endX, double endY){
	return sqrt((pow(endX - startX, 2)) + (pow(endY - startY, 2)));
}

double calculateAreaFromSides(double firstSide, double secondSide, double thirdSide){
	double perimeter = firstSide + secondSide + thirdSide;
	double halfPerimeter = perimeter / 2.0;
	return sqrt(halfPerimeter*(halfPerimeter - firstSide)*(halfPerimeter - secondSide)*(halfPerimeter - thirdSide));
}

bool canBuildTriangleFromSides(double firstSide, double secondSide, double thirdSide){
	return firstSide + secondSide > thirdSide && firstSide + thirdSide > secondSide && thirdSide + secondSide > firstSide;
}

bool areEqual(double first, double second){
	const double epsilon = 1e-5;
	return fabs(first - second) < epsilon;
}


int main()
{
	cout << "Witamy w programie obliczajacym, czy punkt \"D\" o danych wspolrzednych miesci sie w srodku trojkata." << endl;

	double xa, ya, xb, yb, xc, yc, xd, yd;

	askForPointCoordinates(xa, ya, 'A');
	askForPointCoordinates(xb, yb, 'B');
	askForPointCoordinates(xc, yc, 'C');
	askForPointCoordinates(xd, yd, 'D');


	double AB = calculateSideLength(xa, ya, xb, yb);
	double AC = calculateSideLength(xa, ya, xc, yc);
	double CB = calculateSideLength(xb, yb, xc, yc);

	if (false == canBuildTriangleFromSides(AB, AC, CB)){
		cout << "Z wprowadzonych wspolrzednych punktow A,B oraz C nie mozna zbudowac trojkata, stad dalsze operacje sa niemozliwe do wykonania.";
		return 0;
	}

	double AD = calculateSideLength(xa, ya, xd, yd);
	double BD = calculateSideLength(xb, yb, xd, yd);
	double CD = calculateSideLength(xc, yc, xd, yd);

	double AreaOfABC = calculateAreaFromSides(AB, AC, CB);
	double AreaOfABD = calculateAreaFromSides(AB, AD, BD);
	double AreaOfACD = calculateAreaFromSides(AC, CD, AD);
	double AreaOfCBD = calculateAreaFromSides(BD, CD, CB);

	if (areEqual(AreaOfABC, AreaOfABD + AreaOfACD + AreaOfCBD)){
		cout << endl << "Wspolrzedna punktu D zawiera sie w trojkacie ABC." << endl;
	}
	else{
		cout << endl << "Wspolrzedna punktu D nie zawiera sie w trojkacie ABC." << endl;
	}

	return 0;
}
Awatar użytkownika
Ceplusplusik
Użytkownik
Użytkownik
Posty: 228
Rejestracja: 7 paź 2012, o 17:02
Płeć: Mężczyzna
Lokalizacja: Kraków
Podziękował: 94 razy

[C++] Program sprawdzający współrzędne w trójkącie

Post autor: Ceplusplusik »

Dokładnie, o to chodziło . Dziękuję bardzo, na pewno przeanalizuje i w przyszłości będę stosował. Pozdrawiam!
ODPOWIEDZ