oto kod
Kod: Zaznacz cały
#include <string>
#include <cmath>
#include <sstream>
#include <iostream>
#define PI 3,14159
using namespace std;
struct Punkt{
//moze byc uzywane jako wektor
double x;
double y;
double z;
};
class plaszczyzna{
private:
double A;
double B;
double C;
double D;
public:
plaszczyzna();
plaszczyzna(double pA, double pB, double pC, double pD);
plaszczyzna(Punkt p, Punkt q, Punkt r);
string rownanie_ogolne();
double wspolczynnik_normalizujacy();
string rownanie_normalne();
string rownanie_odcinkowe();
Punkt wektor_normalny();
bool nalezy(Punkt p);
double odleglosc(Punkt p);
string operator ||(plaszczyzna PLASZ); //polozenie dwoch plaszczyzn
//double operator +(plaszczyzna PLASZ); to byl kat miedzy dwoma plaszczyznami ale nie dziala. jak chcesz to usun, ale dziala jak jest.
};
int main()
{
double a, b, c, d;
cout<<"Podaj wspolczynniki plaszczyzny 1:"<<endl;
cin>>a>>b>>c>>d;
plaszczyzna A(a, b, c, d);
cout<<"Podaj wspolczynniki punktu 1:"<<endl;
Punkt p;
cin>>p.x>>p.y>>p.z;
cout<<"Podaj wspolczynniki punktu 2:"<<endl;
Punkt q;
cin>>q.x>>q.y>>q.z;
cout<<"Podaj wspolczynniki punktu 3:"<<endl;
Punkt r;
cin>>r.x>>r.y>>r.z;
cout<<"Plaszczyzna 2 bedzie przechodzila przez te punkty"<<endl;
plaszczyzna B(p, q, r);
cout<<"----------------------------------------"<<endl;
cout<<"Rownanie ogolne 1 prostej:"<<endl;
cout<<A.rownanie_ogolne()<<endl;
cout<<"Rownanie ogolne 2 prostej:"<<endl;
cout<<B.rownanie_ogolne()<<endl;
cout<<"----------------------------------------"<<endl;
cout<<"Wspolczynnik normalizujacy 1 prostej:"<<A.wspolczynnik_normalizujacy()<<endl;
cout<<"Rownanie normalne 1 prostej:"<<endl;
cout<<A.rownanie_normalne()<<endl;
cout<<"Wspolczynnik normalizujacy 2 prostej:"<<B.wspolczynnik_normalizujacy()<<endl;
cout<<"Rownanie normalne 2 prostej:"<<endl;
cout<<B.rownanie_normalne()<<endl;
cout<<"----------------------------------------"<<endl;
cout<<"Rownanie odcinkowe 1 prostej:"<<endl;
cout<<A.rownanie_odcinkowe()<<endl;
cout<<"Rownanie odcinkowe 2 prostej:"<<endl;
cout<<B.rownanie_odcinkowe()<<endl;
cout<<"----------------------------------------"<<endl;
cout<<"Czy punkty 1 2 i 3 (kolejno) leza na plaszczyznie 1 (0-nie, 1 - tak)?"<<endl;
cout<<A.nalezy(p)<<A.nalezy(q)<<A.nalezy(r)<<endl;
cout<<"Czy punkty 1 2 i 3 (kolejno) leza na plaszczyznie 2 (0-nie, 1 - tak)?"<<endl;
cout<<B.nalezy(p)<<B.nalezy(q)<<B.nalezy(r)<<endl;
cout<<"----------------------------------------"<<endl;
cout<<"Odleglosci punktow 1 2 i 3 od plaszczyzny 1:"<<endl;
cout<<A.odleglosc(p)<<" "<<A.odleglosc(q)<<" "<<A.odleglosc(r)<<endl;
cout<<"Odleglosci punktow 1 2 i 3 od plaszczyzny 2:"<<endl;
cout<<B.odleglosc(p)<<" "<<B.odleglosc(q)<<" "<<B.odleglosc(r)<<endl;
cout<<"----------------------------------------"<<endl;
cout<<"Plaszczyzny sa wobec siebie "<<(A||B)<<endl;
return 0;
}
plaszczyzna::plaszczyzna()
{
A=1;
B=1;
C=1;
D=0;
}
plaszczyzna::plaszczyzna(double pA, double pB, double pC, double pD)
{
A=pA;
B=pB;
C=pC;
D=pD;
}
plaszczyzna::plaszczyzna(Punkt p, Punkt q, Punkt r)
{
A=(q.y-p.y)*(r.z-p.z) - (r.y-p.y)*(q.z-p.z);
B=(r.x-p.x)*(q.z-p.z) - (q.x-p.x)*(r.z-p.z);
C=(q.x-p.x)*(r.y-p.y) - (r.x-p.x)*(q.y-p.y);
D=-p.x*A - p.y*B - p.z*C;
}
string plaszczyzna::rownanie_ogolne()
{
stringstream wyjscie;
wyjscie<<A;
wyjscie<<" x + ";
wyjscie<<B;
wyjscie<<" y + ";
wyjscie<<C;
wyjscie<<" z + ";
wyjscie<<D;
wyjscie<<" = 0";
return wyjscie.str();
}
double plaszczyzna::wspolczynnik_normalizujacy()
{
return sqrt(A*A+B*B+C*C);
}
string plaszczyzna::rownanie_normalne()
{
stringstream wyjscie;
wyjscie<<(A/wspolczynnik_normalizujacy());
wyjscie<<" x + ";
wyjscie<<(B/wspolczynnik_normalizujacy());
wyjscie<<" y + ";
wyjscie<<(C/wspolczynnik_normalizujacy());
wyjscie<<" z + ";
wyjscie<<(D/wspolczynnik_normalizujacy());
wyjscie<<" = 0";
return wyjscie.str();
}
string plaszczyzna::rownanie_odcinkowe()
{
if (A*B*C!=0)
{
stringstream wyjscie;
wyjscie<<"x / ";
wyjscie<<(-D/A);
wyjscie<<" + y / ";
wyjscie<<(-D/B);
wyjscie<<" + z / ";
wyjscie<<(-D/C);
wyjscie<<" = 1";
return wyjscie.str();
}
else
{return "Brak postaci odcinkowej";}
}
Punkt plaszczyzna::wektor_normalny()
{
Punkt p;
p.x=A;
p.y=B;
p.z=C;
return p;
}
bool plaszczyzna::nalezy(Punkt p)
{
if (p.x*A+p.y*B+p.z*C+D==0)
return true;
else
return false;
}
double plaszczyzna::odleglosc(Punkt p)
{
return ( (p.x*A+p.y*B+p.z*C+D) / wspolczynnik_normalizujacy() );
}
string plaszczyzna::operator ||(plaszczyzna PLASZ)
{
Punkt a, b;
a=wektor_normalny();
b=PLASZ.wektor_normalny();
if (b.x*b.y*b.z!=0)
{
if ((a.x/b.x == a.y/b.y)&&(a.x/b.x == a.z/b.z))
return "rownolegle";
else
return "przecinajace sie";
}
else
{
if ((a.x==b.x)&&(a.y==b.y)&&(a.z==b.z))
{return "rownolegle";}
else
{return "przecinajace sie";}
}
}
/*
double plaszczyzna::operator +(plaszczyzna PLASZ)
{
Punkt a=wektor_normalny();
Punkt b=PLASZ.wektor_normalny();
double a_n=wspolczynnik_normalizujacy();
double b_n=PLASZ.wspolczynnik_normalizujacy();
if ((a_n*b_n!=0)&&( ((a.x*b.x)+(a.y*b.y)+(a.z*b.z))!=0))
{
double cosinus= ( (a.x*b.x) + (a.y*b.y) + (a.z*b.z) ) / (a_n*b_n);
double sinus=sqrt(1-cosinus*cosinus);
double kat=atan(sinus/cosinus);
return kat;
}
else
{return (double)PI/2.0;}
}*/