// (c) Dinko Korunic, 36355514, kreator@fly.srk.fer.hr // Zadatak broj 4 iz predmeta Racunalna grafika // Zadati konveksno 3D tijelo i ispitati da li je tocka V unutar // tijela.. #include #include struct Vrh { // struktura vrha int x, y, z; }; struct Matrix { // struktura u koju se ucitavaju vrhovi tijela: broj vrhova po // katu, broj katova, i matrica od VPK redaka i K stupaca int VrhovaPoKatu, Katova; Vrh **VrhMatrix; }; struct Poly { // struktura poligona: broj vrhova poligona, vrhovi poligona // orijentirani u smjeru kazaljke na satu, i koeficijenti racinine // u kojoj lezi poligon int VrhovaPoligona; Vrh *VrhPoly; float A, B, C, D; }; class MyDraw4 { Matrix MyMatrix; Poly *MyVertex; public: MyDraw4(Matrix); void Topology(void); void TopologyOutput(void); void CoefCalculate(void); void CheckPoint(void); void CalculatePlane(Poly *); }; MyDraw4::MyDraw4(Matrix tmpMatrix) : MyMatrix(tmpMatrix) { // polje za poligone baza (2) + poligone plasta MyVertex=new Poly[2+MyMatrix.VrhovaPoKatu*(MyMatrix.Katova-1)]; // odredivanje popisa poligona (topoloske strukture) Topology(); // ispis topologije TopologyOutput(); // racunanje koeficijenata ravnina CoefCalculate(); // provjera da li je tocka unutar tijela ili izvan CheckPoint(); } void MyDraw4::Topology(void) { // stvaranje popisa vrhova po poligonima. orijentacija je u smjeru // kazaljke na satu gledajuci poligon sa vanjske strane tijela // ovo stvara prvi poligon (bazu na najgornjem katu) MyVertex[0].VrhPoly=new Vrh[MyVertex[0].VrhovaPoligona =MyMatrix.VrhovaPoKatu]; int i; for (i=0; i> tmpMatrix.Katova; cin >> tmpMatrix.VrhovaPoKatu; tmpMatrix.VrhMatrix=new (Vrh *)[tmpMatrix.Katova]; int i; for (i=0; i> tmpMatrix.VrhMatrix[i][j].x; cin >> tmpMatrix.VrhMatrix[i][j].y; cin >> tmpMatrix.VrhMatrix[i][j].z; } return tmpMatrix; } void MyDraw4::TopologyOutput(void) { // ispis topologije cout << "Ispis topologije" << endl; int i, j; for (i=0; i<2+MyMatrix.VrhovaPoKatu*(MyMatrix.Katova-1); ++i) { cout << "Poligon " << i << endl; for (j=0; j> x; cin >> y; cin >> z; for (int i=0; i<2+MyMatrix.VrhovaPoKatu*(MyMatrix.Katova-1); ++i) { if (x*MyVertex[i].A+y*MyVertex[i].B+z*MyVertex[i].C+ MyVertex[i].D<0) { MyFlag=1; break; } } if (MyFlag) cout << "Tocka je van tijela"; else cout << "Tocka je unutar tijela"; cout << endl; } void MyDraw4::CalculatePlane(Poly *tP) { // racunanje jednadzbi ravnina u kojima leze poligoni tP->A=(tP->VrhPoly[1].y-tP->VrhPoly[0].y)* (tP->VrhPoly[2].z-tP->VrhPoly[0].z)- (tP->VrhPoly[1].z-tP->VrhPoly[0].z)* (tP->VrhPoly[2].y-tP->VrhPoly[0].y); tP->B=-(tP->VrhPoly[1].x-tP->VrhPoly[0].x)* (tP->VrhPoly[2].z-tP->VrhPoly[0].z)+ (tP->VrhPoly[1].z-tP->VrhPoly[0].z)* (tP->VrhPoly[2].x-tP->VrhPoly[0].x); tP->C=(tP->VrhPoly[1].x-tP->VrhPoly[0].x)* (tP->VrhPoly[2].y-tP->VrhPoly[0].y)- (tP->VrhPoly[1].y-tP->VrhPoly[0].y)* (tP->VrhPoly[2].x-tP->VrhPoly[0].x); tP->D=-tP->VrhPoly[0].x*tP->A-tP->VrhPoly[0].y*tP->B -tP->VrhPoly[0].z*tP->C; } int main(void) { MyDraw4 MyOb(MyAllInput()); return EXIT_SUCCESS; }