Witam! Mam nastepujący problem. Dopiero zaczynam c++ i musze napisac symulacje satelity ktoremu nadajemy predkosc poczatkowa. Grawitacja ma zakrzywiac tor ruchu. rownanie to opisujace to g=V(prostopadle do wektora g)/R*R. Mam to napisac w openGL. Stworzylem sobie klase Vektor i napisalem funkcje NextStep(). Nie wiem natomiast czy wszystko mam dobrze w tej klasie bo pierwszy raz robie program wykorzystujac klasy. Program wyswietla mi tylko polozenie poczatkowe satelity Position.m_fX,Position.m_fY i nie przesuwa jej. Osie sa ustwione X w prawo, Y do góry , Z - prostopadle do monitora. Gdzies jest blad ,poniewaz kiedy sobie wyswietle w konsoli obliczenia to wychodza jakies bzdury. Moze zle napisalem operatory?
class CVektor
{
private:
double m_fX,m_fY;
public:
CVektor(double fX=0.0f,double fY=0.0f);
// przeciazanie operatorow
friend CVektor operator + (const CVektor& vektor1,const CVektor& vektor2)
{
return CVektor(vektor1.m_fX+vektor2.m_fX,
vektor1.m_fY+vektor2.m_fY);
}
friend CVektor operator * (const CVektor& vektor,double fLiczba)
{ return CVektor(vektor.m_fX*fLiczba,vektor.m_fY*fLiczba);}
static CVektor A(CVektor pos);
static void NextStep();
void display();
~CVektor(void);
};
#include "StdAfx.h"
#include "opisRuchu.h"
#include "openGL1.h"
#include <iostream>
#include <math.h>
#include <glut.h>
using namespace std;
CVektor Position,Speed;
CVektor::CVektor(double fX,double fY)
{
Speed.m_fX=0.0;
Speed.m_fY=0.0;
Position.m_fX=0.0;
Position.m_fY=75.0;
}
CVektor::~CVektor(void)
{
}
void CVektor:: NextStep()
{
double h=0.15;
CVektor V = Speed;
CVektor g = A(Position); //funcja zwraca wektor przyspieszenia w danej pozycji
CVektor _V = Position + (V*h);
CVektor _g = Speed + (g*h);
Position=(Position + ( (V + _V)*(h*0.5)));
Speed=(Speed + ( (g + _g)*(h*0.5)));
}
CVektor CVektor::A(CVektor pozycja)
{
CVektor przyspieszenie;
double G=6.67;
double Masa=59.7;
double przyspieszenie_X,przyspieszenie_Y;
przyspieszenie_X =( (G*Masa) / pow(pozycja.m_fX,2.0));
przyspieszenie_Y =( (G*Masa) / pow(pozycja.m_fY,2.0));
przyspieszenie.m_fX=przyspieszenie_X;
przyspieszenie.m_fY=przyspieszenie_Y;
return przyspieszenie;
}
void CVektor::display(void)
{
glClearColor(0,0,0,0); //kolor czarny tla
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //czyscimy bufor
glEnable(GL_DEPTH_TEST); //uruchamiamy bufor glebi
glPushMatrix();
NextStep();
glColor3f(0.0f,0.7f,0.0f);
glutSolidSphere(63.76, 20, 16); /* rysuje Ziemie */
glColor3f(1.0f,0.0f,0.0f);
glTranslatef ((GLfloat) Position.m_fX, (GLfloat)Position.m_fY, 0.0);
glutSolidSphere(5.0, 10, 8); /* rysuje satelite */
glPopMatrix();
glutSwapBuffers();
}
pozniej w pliku głównym
CVektor nastepny;
void Next(void)
{
nastepny.display();
}
i uzywam glutDisplayFunc(Next);*ustawiamy funkcje display i oczywiscie na koncu glutMainLoop(); *uruchamiamy petle opengl