Professional Documents
Culture Documents
Interaktivna Inzenjerska Grafika-1
Interaktivna Inzenjerska Grafika-1
-
1. preduvance
32(d)
Tz(x 3,
(ni , nj nk)
·
n ,
&
Out
La
Implementaca
-
I
/
/
/
I/
reci
↓ kucne
pa
⑮
puta
S
vise
Italic
moze ponzuljati
re engine
· float medrosti
#include "stdafx.h"
int main(int argc, char* argv[])
#include <windows.h> {
class Loptica{
for(int i=1;i<=2000;i++){
public:
//za slobodan pad t=t+dt;
Vector Pp;//Pocetna pozicija
Vector G;//Ubrzanje zemljine teze table->SetValue(i, 0, t);
double r;//Poluprecnik loptice, za iscrtavanje same loptice
Loptica();//Konstruktor table->SetValue(i, 1, Pozicija().y);
//Vp=Vector(0,-40,0);//Pocetna brzina za nanize, testirati i jedno i drugo //napokon i sam grafik, tj. iscrtavanje podatak iz table
//analizirati grafik vtkPlot *plot = chart->AddPlot(vtkChart::LINE);
//za sve tipove pogledati https://examples.vtk.org/site/Cxx/Plotting/
LinePlot/
} plot->SetInput(table, 0, 1);//iz tabele pokupi podata sa pozicije 0,1
plot->SetColor(0.0, 1.0,0.0);//iz tabele uzmi podatak sa pozicije 1,0
plot->SetWidth(3.0);
return 0;
//return PozicijaSlobodanPad; }
return PozicijaHitac;
}
class Loptica{ void Loptica::RK()//Runge-Kute integracija
{
public: Vector k1, k2, k3, k4;
//za slobodan pad Vector l1, l2, l3, l4;
Vector Pp;//Pocetna pozicija
Vector G;//Ubrzanje zemljine teze k1 = dt * Vrk;
double r;//Poluprecnik loptice, za iscrtavanje same loptice l1 = dt * Ubrzanje(Prk, Vrk);
Loptica();//Konstruktor k2 = dt * (Vrk + l1/2);
l2 = dt * Ubrzanje(Prk + k1/2, Vrk + l1/2);
//hitac nanize k3 = dt * ( Vrk + l2/2);
Vector Vp;//Pocetna brzina l3 = dt * Ubrzanje(Prk + k2/2, Vrk + l2/2);
k4 = dt * (Vrk + l3);
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// l4 = dt * Ubrzanje(Prk + k3, Vrk + l3);
//za 8.2
Vector F;//Sila Prk += k1/6 + k2/3 + k3/3 + k4/6;
double k;//koeficijent viskoznog trenja Vrk += l1/6 + l2/3 + l3/3 + l4/6;
Vector a;//Ubrzanje tela }
double m;//masa ////////////////////////////////////////////////////////////////////////////////////////////////////////
void Sila(Vector); /////////////////////////////
Vector Ubrzanje(Vector,Vector);//ubrzanje
//za integracije Vector Pozicija(){//predjeni put loptice, na osnovu toga dobijena trenutna
Vector Po;//Pozicija Euler pozicija
Vector Prk;//Pozicija RK
Vector Vo;//Brzina Euler
Vector Vrk;//Brzina RK Vector PozicijaSlobodanPad=L.G*t*t/2+L.Pp;
void Euler1();//implicitna Vector PozicijaHitac=L.G*t*t/2+L.Pp+L.Vp*t;
void Euler2();//polu-implicitna
void RK();//Runge-Kute
//return PozicijaSlobodanPad;
///////////////////////////////////////////////////////////////////////////////////////////////
}; ///////////////////////////////////////
return PozicijaHitac;//za 8.2 obavezno, zbog sile
//ako se za 8.2 vraca PozicijaSlobodanPad, neophodno staviti da je
pocetna brzina 0 (linija 114)
Loptica::Loptica(){ }
//Slobodan pad
G=Vector(0,-9.81,0);
Pp=Vector(0,20,0);
r=0.9;//zbog iscrtavanja loptice
int main(int argc, char* argv[])
//hitac nanize ili navise {
Vp=Vector(0,40,0);//Pocetna brzina za navise
Vo += Ubrzanje(Po,Vo)*dt;
Vector pnew = Po + Vo*dt;
Po = pnew;
}
table->SetNumberOfRows(2001);//broj vrsta za tabelu
vtkRenderer* ren=vtkRenderer::New();
ren->AddActor(aL1);//lopta
ren->GetActiveCamera()->SetPosition(100,0,0);
ren->SetBackground(0.5,0.5,0.5);
vtkRenderWindow* rwin=vtkRenderWindow::New();
rwin->SetSize(1000,800);
rwin->AddRenderer(ren);
vtkRenderWindowInteractor* iren=vtkRenderWindowInteractor::New();
iren->SetRenderWindow(rwin);
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//za 8.2
table->SetValue(0,2,L.Po.y);
table->SetValue(0,3,L.Prk.y);
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
for(int i=1;i<=2000;i++){
t=t+dt;
table->SetValue(i, 0, t);
table->SetValue(i, 1, Pozicija().y);
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////
L.Euler1();
L.RK();
table->SetValue(i, 2, L.Po.y);
table->SetValue(i, 3, L.Prk.y);
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///
rwin->Render();
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//za 8.2
vtkPlot *plotEuler = chart->AddPlot(vtkChart::LINE);
plotEuler->SetInput(table, 0, 2);
plotEuler->SetColor(1.0, 0.0,0.0);
plotEuler->SetWidth(3.0);
view->SetRenderWindow(rwin);
iren->SetRenderWindow(rwin);
iren->Initialize();
iren->Start();
return 0;
}
double dt=0.005;//Korak integracije
double t=0.0;//pocetno vreme Vector Loptica::Ubrzanje(Vector p,Vector v){
Sila(v);
a=F/m;
class Loptica{ return a;
public: }
//za slobodan pad
Vector Pp;//Pocetna pozicija void Loptica::Euler1(){//Ojlerova integracija
Vector G;//Ubrzanje zemljine teze //////////////////////////////////////////////////////////////////////////////////////////////
double r;//Poluprecnik loptice, za iscrtavanje same loptice //vezba 9
Loptica();//Konstruktor PoP=Po;
Vector pnew = Po + Vo*dt;
//hitac nanize Vo += Ubrzanje(Po,Vo)*dt;
Vector Vp;//Pocetna brzina Po = pnew;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// }
//za 8.2
Vector F;//Sila void Loptica::Euler2(){//Ojlerova polu-implicitna integracija
double k;//koeficijent viskoznog trenja //////////////////////////////////////////////////////////////////////////////////////////////
Vector a;//Ubrzanje tela //vezba 9
double m;//masa PoP=Po;
void Sila(Vector); Vo += Ubrzanje(Po,Vo)*dt;
Vector Ubrzanje(Vector,Vector);//ubrzanje Vector pnew = Po + Vo*dt;
Po = pnew;
}
//za integracije
Vector Po;//Pozicija Euler
Vector Prk;//Pozicija RK const int br_ravni=1;
Vector Vo;//Brzina Euler const int br_loptica=1;
Vector Vrk;//Brzina RK Loptica L[br_loptica];
void Euler1();//integracija Loptica R[br_ravni];
void Euler2();//polu-implicitna
//vezba 9
Vector PoP;//prethodni/pocetni polozaj za Ojlera void ObjektiUsceni(){
bool sudar;//Da li se telo sudarilo
Vector n; R[0].n=Vector(0,1,0);//y je normalno nasu ravan, hocemo horizontalnu ravan
double offset; R[0].offset=0.0;
Vector Fsudara;
}; //Loptica
L[0].Vo=Vector(-4,-3,0);
L[0].G=Vector(0,-9.81,0);
Loptica::Loptica(){ L[0].Po=Vector(14.0, 4.0,-2.0);
//Slobodan pad L[0].r=0.4;
G=Vector(0,-9.81,0); L[0].m=0.3;
Pp=Vector(0,20,0);
r=0.9;//zbog iscrtavanja loptice
}
//hitac nanize ili navise
Vp=Vector(0,40,0);//Pocetna brzina za navise
void ProveriSudar(){//Funkcija za proveru sudara
//Vp=Vector(0,-40,0);//Pocetna brzina za nanize, testirati i jedno i drugo
//analizirati grafik Vector n;
Vector vr;
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// double vrn;
//za 8.2
k=0.5;//Koeficijent viskozog trenja ////////////////////////////////////////////////////////////////////////////////////////////////////////
m=0.05; //Provera sudara, loptica-ravan
for(int k=0;k<br_loptica;k++){
Po=Pp;//Podesi pocetne pozicije i brzine sa Ojler i RK integraciju
Prk=Pp; L[k].Fsudara.x=0;
Vo=Vp; L[k].Fsudara.y=0;
Vrk=Vp; L[k].Fsudara.z=0;
L[k].sudar=false;
}
for(int i=0;i<br_ravni;i++){//Prvo za ravni!
}
vtkSphereSource* sphere[br_loptica];
vtkRenderWindow* rwin;
while(t<=10){
t=t+dt;
ProveriSudar();
for(int k=0;k<br_loptica;k++){
sphere[k]->SetCenter(L[k].Po.x,L[k].Po.y,L[k].Po.z);
L[k].Euler2();//Integracija
}
korak++;
if(korak==5){//Iscrtavanje svakog 5-tog frejma
rwin->Render();
korak=0;
}
}
}
}
};
int main(int argc, char* argv[])
{
ObjektiUsceni();
vtkActor* aCube=vtkActor::New();
aCube->SetMapper(maperCube);
aCube->GetProperty()->SetOpacity(0.2);
//prikaz loptice/a
vtkPolyDataMapper* maper[br_loptica];
vtkActor* aSphere[br_loptica];
for(int i=0;i<br_loptica;i++){//Za lopticu, for za kasnije kada bude bilo vise loptica
sphere[i]=vtkSphereSource::New();
sphere[i]->SetRadius(L[i].r);
sphere[i]->SetPhiResolution(20);
sphere[i]->SetThetaResolution(20);
maper[i]=vtkPolyDataMapper::New();
maper[i]->SetInput(sphere[i]->GetOutput());
aSphere[i]=vtkActor::New();
aSphere[i]->SetMapper(maper[i]);
}
aSphere[0]->GetProperty()->SetColor(0,1,0);
vtkRenderer* ren=vtkRenderer::New();
for(int i=0;i<br_loptica;i++){//Dodajemo lopticu u scenu, for ya kasnije kad bude bilo vise loptica
ren->AddActor(aSphere[i]);//Loptice
}
ren->AddActor(aCube);
//Prozor
rwin=vtkRenderWindow::New();
rwin->AddRenderer(ren);
rwin->SetSize(1000,800);
//Interaktor
vtkRenderWindowInteractor* iren=vtkRenderWindowInteractor::New();
iren->SetRenderWindow(rwin);
rwin->Render();
//Observer
vtkMojaFunkcija* cb =vtkMojaFunkcija::New();
iren->AddObserver(vtkCommand::KeyPressEvent, cb);
iren->SetRenderWindow(rwin);
iren->Initialize();
iren->Start();
return 0;
}
double dt=0.005;//Korak integracije
double t=0.0;//pocetno vreme
void Loptica::Euler1(){//Ojlerova integracija
/////////////////////////////////////////////////////////////////////////////////
class Loptica{ /////////////
//vezba 9
public: PoP=Po;
//za slobodan pad Vector pnew = Po + Vo*dt;
Vector Pp;//Pocetna pozicija Vo += Ubrzanje(Po,Vo)*dt;
Vector G;//Ubrzanje zemljine teze Po = pnew;
double r;//Poluprecnik loptice, za iscrtavanje same loptice
Loptica();//Konstruktor }
//vezba 9 ravni_stepenice[0].n=Vector(0,1,0);
Vector PoP;//prethodni/pocetni polozaj za Ojlera ravni_stepenice[0].offset=0.0;
bool sudar;//Da li se telo sudarilo
Vector n; ravni_stepenice[1].n=Vector(0,1,0);
double offset; ravni_stepenice[1].offset=3.0;
Vector Fsudara;
}; //Inicijalizacija loptica
L[0].Vo=Vector(-4,-3,0);
L[0].G=Vector(0,-9.81,0);
Loptica::Loptica(){ L[0].Po=Vector(14.0, 4.0,-2.0);
//Slobodan pad L[0].r=0.4;
G=Vector(0,-9.81,0); L[0].m=0.3;
Pp=Vector(0,20,0);
r=0.9;//zbog iscrtavanja loptice L[1].Vo=Vector(0,0,0);
L[1].G=Vector(0,-9.81,0);
//hitac nanize ili navise L[1].Po=Vector(2.0,0.4,-2.0);
Vp=Vector(0,40,0);//Pocetna brzina za navise L[1].r=0.4;
L[1].m=0.3;
//Vp=Vector(0,-40,0);//Pocetna brzina za nanize, testirati i jedno i drugo
//analizirati grafik L[2].Vo=Vector(0,0,0);
L[2].G=Vector(0.0,-9.81,0);
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// L[2].Po=Vector(1.8,5.0,-2.01);
//za 8.2 L[2].r=0.5;
k=0.5;//Koeficijent viskozog trenja L[2].m=0.4;
m=0.05; //razmisliti sta treba postaviti od ovih parametara da bi bio
slobodan pad
Po=Pp;//Podesi pocetne pozicije i brzine sa Ojler i RK integraciju }
Prk=Pp;
Vo=Vp;
Vrk=Vp;
if(sudar){//ako je doslo do sudara dodaj impulsnu silu koja nastaje kao rekacija na sudar
F+=Fsudara;
}
else{//Nema sudara
//moze se sotaviti kao ranije samo slobodan pad, ali se moze dodati i utica vetra
Vector SmerVetra(1,0,0);
double IntenzitetVetra=2;//Intenzitet vetra m/s
Vector Fvetra=SmerVetra*(0.5 * 1.23 * IntenzitetVetra*IntenzitetVetra*(3.14159 * r*r)*0.5);
}
void ProveriSudarStepenice(){//Funkcija za proveru sudara //Sada provera za medjusobne kontakte loptica
} L[k].Euler1();//Integracija
//Gotova provera za ravni objekte k-brojac }
korak++;
if(korak==5){//Crtaj svaki 5-ti frejm
rwin->Render();
korak=0;
}
};
int main(int argc, char* argv[])
{
DefinisiObjekte_sa_Stepenicama(); //definisanje dve ravni stepenice
vtkActor* aC1=vtkActor::New();
aC1->SetMapper(maperCube1);
aC1->GetProperty()->SetOpacity(0.2);
vtkActor* aC2=vtkActor::New();
aC2->SetMapper(maperCube2);
aC2->GetProperty()->SetOpacity(0.2);
vtkPolyDataMapper* maper[br_loptica];
vtkActor* aL[br_loptica];
maper[i]=vtkPolyDataMapper::New();
maper[i]->SetInput(sphere[i]->GetOutput());
aL[i]=vtkActor::New();
aL[i]->SetMapper(maper[i]);
}
aL[0]->GetProperty()->SetColor(0,1,0);
aL[1]->GetProperty()->SetColor(0,0,1);
aL[2]->GetProperty()->SetColor(1,0,0);
vtkRenderer* ren=vtkRenderer::New();
for(int i=0;i<br_loptica;i++){//Dodajemo loptice u scenu
ren->AddActor(aL[i]);//Loptice
}
ren->AddActor(aC1);//ravan 0
ren->AddActor(aC2);//ravan 1
rwin=vtkRenderWindow::New();
rwin->AddRenderer(ren);
rwin->SetSize(1000,800);
vtkRenderWindowInteractor* iren=vtkRenderWindowInteractor::New();
iren->SetRenderWindow(rwin);
rwin->Render();
iren->SetRenderWindow(rwin);
iren->Initialize();
iren->Start();
return 0;