bettaskate89
21-09-2009, 10:24
Buongiorno a tutti...
A breve devo presentare un progetto di informatica che calcoli il volume di un oggetto composto da più solidi semplici e che lo visualizzi, il tutto su root.
Il codice da me scritto è :
#include "TGeometry.h"
#include "TGeoManager.h"
#include "TGeoMatrix.h"
#include "TAttFill.h"
#include "TGeoBBox.h"
#include "TGeoCone.h"
#include "TGeoSphere.h"
#include "TGeoTube.h"
#include "TGeoCompositeShape.h"
#include "TGeoShape.h"
#include <string>
#include <iostream>
#include <cmath>
#include <vector>
using namespace std;
int volume2()
{
int numSolidi;
string solido;
double x, y,z,h,latox,latoy,x1,y1,z1,x2,y2,z2,rmin,rmax,hpar,hcil,Rmin,Rmax,themin,themax,phymin,phymax,rminbase,rmaxbase,rminsez,rmaxsez,hcon, x3,y3,z3;
double rotx, roty, rotz,rotx1,roty1,rotz1, rotx2,roty2,rotz2;
TGeoManager *volumes=new TGeoManager("volumes", "My volumes");
TGeoMaterial *vacuum=new TGeoMaterial("vacuum",0,0,0);
TGeoMedium *Air=new TGeoMedium("Vacuum",0,vacuum);
TGeoVolume *Top = gGeoManager->MakeBox("Top",Air, 10.,10.,10.);
gGeoManager->SetTopVolume(Top);
TGeoBBox *shape = new TGeoBBox("shape",0,0,0);
TGeoCompositeShape *csf = new TGeoCompositeShape ("csf", "shape+shape");;
cout<<"Di quanti solidi semplici è costituito l'oggetto?"<<endl;
cin>>numSolidi;
if( cin.fail()){
cout<<"I valori inseriti non sono validi, il programma verrà interrotto"<<endl;
return 0;}
for (int n=1; n<=numSolidi;n++){
cout<<"Inserisci solido"<<n<<endl;
cin>>solido;
if ( cin.fail()){
cout<<"Non è il nome di un solido, il programma verrà interrotto"<<endl;
return 0;
break;}
if (solido == "parallelepipedo"){
cout<<"CENTRO BASE"<<endl;
cout<<"Coordinata x: "; cin>>x;
cout<<"Coordinata y: ";cin>>y;
cout<<"Coordinata z: ";cin>>z;
cout<<"PARALLELEPIDO"<<endl;
cout<<"Altezza parallelepipedo: ";cin>>hpar;
cout<<"Lato x: ";cin>>latox;
cout<<"Lato y: ";cin>>latoy;
cout<<"Rotazione rispetto a z: "; cin>>rotz1;
cout<<"Rotazione rispetto a x: "; cin>>rotx1;
cout<<"Rotazione rispetto a y: "; cin>>roty1;
if ( cin.fail()){
cout<<"I valori inseriti non sono validi, il programma verrà interrotto"<<endl;
return 0;
break;}
TGeoBBox *Box = new TGeoBBox("volume",latox,latoy,hpar);
TGeoRotation *rot= new TGeoRotation ("rot",rotx1,roty1,rotz1);
TGeoCombiTrans *tr=new TGeoCombiTrans("tr",x,y,z,rot);
tr->RegisterYourself();
}
else if (solido=="cilindro"){
cout<<"Imposta valori richiesti"<<endl;
cout<<"CENTRO BASE"<<endl;
cout<<"Coordinata x: ";cin>>x1;
cout<<"Coordinta y: ";cin>>y1;
cout<<"Coordinata z: ";cin>>z1;
cout<<"CILINDRO"<<endl;
cout<<"Raggio minimo base: ";cin>>rmin;
cout<<"Raggio massimo base: ";cin>>rmax;
cout<<"Altezza cilindro: ";cin>>hcil;
cout<<"Rotazione rispetto a z: "; cin>>rotz;
cout<<"Rotazione rispetto a x: "; cin>>rotx;
cout<<"Rotazione rispetto a y: "; cin>>roty;
if ( cin.fail()){
cout<<"I valori inseriti non sono validi, il programma verrà interrotto"<<endl;
return 0;
break;}
TGeoTube *Con = new TGeoTube("volume",rmin,rmax,hcil);
TGeoRotation *rot= new TGeoRotation ("rot",rotx,roty,rotz);
TGeoCombiTrans *tr=new TGeoCombiTrans("tr",x1,y1,z1,rot);
tr->RegisterYourself();
}
else if (solido=="sfera"){
cout <<"CENTRO SFERA"<<endl;
cout<<"Coordinata x: ";cin>>x2;
cout<<"Coordinata y: ";cin>>y2;
cout<<"Coordinata z: ";cin>>z2;
cout<<"SFERA"<<endl;
cout<<"Raggio minimo: ";cin>>Rmin;
cout<<"Raggio massimo: ";cin>>Rmax;
cout<<"Angolo phy minimo: ";cin>>phymin;
cout<<"Angolo phy massimo: ";cin>>phymax;
cout<<"Angolo theta minimo: ";cin>>themin;
cout<<"Angolo theta massimo: ";cin>>themax;
if ( cin.fail()){
cout<<"I valori inseriti non sono validi, il programma verrà interrotto"<<endl;
return 0;
break;}
TGeoSphere *Sph = new TGeoSphere ("volume",Rmin,Rmax,phymin,phymax,themin,themax);
TGeoRotation *rot= new TGeoRotation ("rot",0,0,0);
TGeoCombiTrans *tr=new TGeoCombiTrans("tr",x2,y2,z2,rot);
tr->RegisterYourself();
}
else if (solido=="cono"){
cout<<"Imposta valori richiesti"<<endl;
cout<<"altezza cono: "; cin>>hcon;
cout<<"raggio minimo di base: "; cin>>rminbase;
cout<<"raggio massimo base: "; cin>>rmaxbase;
cout<<"raggio minimo sezione: "; cin>>rminbase;
cout<<"raggio massimo sezione: "; cin>>rmaxsez;
cout<<"CENTRO BASE"<<endl;
cout<<"Coordinata x: ";cin>>x3;
cout<<"Coordinata y: ";cin>>y3;
cout<<"Coordinata z: ";cin>>z3;
cout<<"Rotazione rispetto a z: "; cin>>rotz2;
cout<<"Rotazione rispetto a x: "; cin>>rotx2;
cout<<"Rotazione rispetto a y: "; cin>>roty2;
if ( cin.fail()){
cout<<"I valori inseriti non sono validi, il programma verrà interrotto"<<endl;
return 0;
break;}
TGeoCone *Con = new TGeoCone("volume",hcon, rminbase, rmaxbase, rminsez, rmaxsez);
TGeoRotation *rot= new TGeoRotation ("rot",rotx2,roty2,rotz2);
TGeoCombiTrans *tr=new TGeoCombiTrans("tr",x3,y3,z3,rot);
tr->RegisterYourself();
}
else {
cout<<"Solido non valido, verrà ignorato"<<endl;}
TGeoCompositeShape *csf = new TGeoCompositeShape("csf", "csf + volume:tr");
}
TGeoVolume *Comp = new TGeoVolume("Comp",csf);
Comp->SetLineColor(5);
Top->AddNode(Comp,1);
cout<<csf->Capacity()<<endl;
gGeoManager->CloseGeometry();
Top->Draw("ogl");}
Il problema è che la TGeoCompositeShape sembra vedermi solo il primo solido immesso.
Potete aiutarmi?:(
A breve devo presentare un progetto di informatica che calcoli il volume di un oggetto composto da più solidi semplici e che lo visualizzi, il tutto su root.
Il codice da me scritto è :
#include "TGeometry.h"
#include "TGeoManager.h"
#include "TGeoMatrix.h"
#include "TAttFill.h"
#include "TGeoBBox.h"
#include "TGeoCone.h"
#include "TGeoSphere.h"
#include "TGeoTube.h"
#include "TGeoCompositeShape.h"
#include "TGeoShape.h"
#include <string>
#include <iostream>
#include <cmath>
#include <vector>
using namespace std;
int volume2()
{
int numSolidi;
string solido;
double x, y,z,h,latox,latoy,x1,y1,z1,x2,y2,z2,rmin,rmax,hpar,hcil,Rmin,Rmax,themin,themax,phymin,phymax,rminbase,rmaxbase,rminsez,rmaxsez,hcon, x3,y3,z3;
double rotx, roty, rotz,rotx1,roty1,rotz1, rotx2,roty2,rotz2;
TGeoManager *volumes=new TGeoManager("volumes", "My volumes");
TGeoMaterial *vacuum=new TGeoMaterial("vacuum",0,0,0);
TGeoMedium *Air=new TGeoMedium("Vacuum",0,vacuum);
TGeoVolume *Top = gGeoManager->MakeBox("Top",Air, 10.,10.,10.);
gGeoManager->SetTopVolume(Top);
TGeoBBox *shape = new TGeoBBox("shape",0,0,0);
TGeoCompositeShape *csf = new TGeoCompositeShape ("csf", "shape+shape");;
cout<<"Di quanti solidi semplici è costituito l'oggetto?"<<endl;
cin>>numSolidi;
if( cin.fail()){
cout<<"I valori inseriti non sono validi, il programma verrà interrotto"<<endl;
return 0;}
for (int n=1; n<=numSolidi;n++){
cout<<"Inserisci solido"<<n<<endl;
cin>>solido;
if ( cin.fail()){
cout<<"Non è il nome di un solido, il programma verrà interrotto"<<endl;
return 0;
break;}
if (solido == "parallelepipedo"){
cout<<"CENTRO BASE"<<endl;
cout<<"Coordinata x: "; cin>>x;
cout<<"Coordinata y: ";cin>>y;
cout<<"Coordinata z: ";cin>>z;
cout<<"PARALLELEPIDO"<<endl;
cout<<"Altezza parallelepipedo: ";cin>>hpar;
cout<<"Lato x: ";cin>>latox;
cout<<"Lato y: ";cin>>latoy;
cout<<"Rotazione rispetto a z: "; cin>>rotz1;
cout<<"Rotazione rispetto a x: "; cin>>rotx1;
cout<<"Rotazione rispetto a y: "; cin>>roty1;
if ( cin.fail()){
cout<<"I valori inseriti non sono validi, il programma verrà interrotto"<<endl;
return 0;
break;}
TGeoBBox *Box = new TGeoBBox("volume",latox,latoy,hpar);
TGeoRotation *rot= new TGeoRotation ("rot",rotx1,roty1,rotz1);
TGeoCombiTrans *tr=new TGeoCombiTrans("tr",x,y,z,rot);
tr->RegisterYourself();
}
else if (solido=="cilindro"){
cout<<"Imposta valori richiesti"<<endl;
cout<<"CENTRO BASE"<<endl;
cout<<"Coordinata x: ";cin>>x1;
cout<<"Coordinta y: ";cin>>y1;
cout<<"Coordinata z: ";cin>>z1;
cout<<"CILINDRO"<<endl;
cout<<"Raggio minimo base: ";cin>>rmin;
cout<<"Raggio massimo base: ";cin>>rmax;
cout<<"Altezza cilindro: ";cin>>hcil;
cout<<"Rotazione rispetto a z: "; cin>>rotz;
cout<<"Rotazione rispetto a x: "; cin>>rotx;
cout<<"Rotazione rispetto a y: "; cin>>roty;
if ( cin.fail()){
cout<<"I valori inseriti non sono validi, il programma verrà interrotto"<<endl;
return 0;
break;}
TGeoTube *Con = new TGeoTube("volume",rmin,rmax,hcil);
TGeoRotation *rot= new TGeoRotation ("rot",rotx,roty,rotz);
TGeoCombiTrans *tr=new TGeoCombiTrans("tr",x1,y1,z1,rot);
tr->RegisterYourself();
}
else if (solido=="sfera"){
cout <<"CENTRO SFERA"<<endl;
cout<<"Coordinata x: ";cin>>x2;
cout<<"Coordinata y: ";cin>>y2;
cout<<"Coordinata z: ";cin>>z2;
cout<<"SFERA"<<endl;
cout<<"Raggio minimo: ";cin>>Rmin;
cout<<"Raggio massimo: ";cin>>Rmax;
cout<<"Angolo phy minimo: ";cin>>phymin;
cout<<"Angolo phy massimo: ";cin>>phymax;
cout<<"Angolo theta minimo: ";cin>>themin;
cout<<"Angolo theta massimo: ";cin>>themax;
if ( cin.fail()){
cout<<"I valori inseriti non sono validi, il programma verrà interrotto"<<endl;
return 0;
break;}
TGeoSphere *Sph = new TGeoSphere ("volume",Rmin,Rmax,phymin,phymax,themin,themax);
TGeoRotation *rot= new TGeoRotation ("rot",0,0,0);
TGeoCombiTrans *tr=new TGeoCombiTrans("tr",x2,y2,z2,rot);
tr->RegisterYourself();
}
else if (solido=="cono"){
cout<<"Imposta valori richiesti"<<endl;
cout<<"altezza cono: "; cin>>hcon;
cout<<"raggio minimo di base: "; cin>>rminbase;
cout<<"raggio massimo base: "; cin>>rmaxbase;
cout<<"raggio minimo sezione: "; cin>>rminbase;
cout<<"raggio massimo sezione: "; cin>>rmaxsez;
cout<<"CENTRO BASE"<<endl;
cout<<"Coordinata x: ";cin>>x3;
cout<<"Coordinata y: ";cin>>y3;
cout<<"Coordinata z: ";cin>>z3;
cout<<"Rotazione rispetto a z: "; cin>>rotz2;
cout<<"Rotazione rispetto a x: "; cin>>rotx2;
cout<<"Rotazione rispetto a y: "; cin>>roty2;
if ( cin.fail()){
cout<<"I valori inseriti non sono validi, il programma verrà interrotto"<<endl;
return 0;
break;}
TGeoCone *Con = new TGeoCone("volume",hcon, rminbase, rmaxbase, rminsez, rmaxsez);
TGeoRotation *rot= new TGeoRotation ("rot",rotx2,roty2,rotz2);
TGeoCombiTrans *tr=new TGeoCombiTrans("tr",x3,y3,z3,rot);
tr->RegisterYourself();
}
else {
cout<<"Solido non valido, verrà ignorato"<<endl;}
TGeoCompositeShape *csf = new TGeoCompositeShape("csf", "csf + volume:tr");
}
TGeoVolume *Comp = new TGeoVolume("Comp",csf);
Comp->SetLineColor(5);
Top->AddNode(Comp,1);
cout<<csf->Capacity()<<endl;
gGeoManager->CloseGeometry();
Top->Draw("ogl");}
Il problema è che la TGeoCompositeShape sembra vedermi solo il primo solido immesso.
Potete aiutarmi?:(