Witam użytkowników.
Jestem w trakcie pisania pracy na zaliczenie i proszę o pomoc. Praca jest już prawie ukończona (kod poniżej). Niestety pojawił się problem, z którym walczę od kilku dni i wszystko stoi w miejscu.
Praca zaliczeniowa (w skrócie) polega na napisaniu kodu, który ma przedstawiać dwa tory lotu rzutu ukośnego + nawigacja klawiszami po scenie (efekt końcowy ma być taki jak w załączniku o nazwie "Rozwiązanie"). W mojej pracy wszystkie aspekty wizualne + oprogramowane klawisze są już gotowe. Problemem jest uzależniony tor lotu drugiego pocisku od toru lotu pierwszego pocisku (moja praca w załączniku o nazwie "project1"). Pociski mają się poruszać niezależnie od siebie.
Jeśli ktoś jest w stanie mi pomóc proszę o korektę i wytłumaczenie w czym tkwi problem.
Jeżeli rzeczy, które umieszczam są niewystarczające do rozwiązania problemu mogę wysłać wszystkie pliki które posiadam.
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include "math.h"
#include <gl/gl.h>
#include <gl/glu.h>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "CSPIN"
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void TForm1::licz(double V, double kat, double *x, double *y)
{
double g,dx,Z;
g=9.81;
Z=(V*V*sin(2*(kat*3.14/180)))/g;
dx=Z/500.0;
for(int i=0;i<501;i++){
x[i]=i*dx;
y[i]=tan(kat*3.14/180)*x[i]-(g/(2*V*V*pow(cos(kat*3.14/180.0),2.0))*x[i]*x[i]);
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
otworz_OpenGL();
xkam=50; ykam=30; zkam=-70;
xcelu=50; ycelu=2; zcelu=100;
kat=0;
rysuj1=false;
rysuj2=false;
trafil1=false;
kw1 = gluNewQuadric();
gluQuadricDrawStyle(kw1,GLU_FILL);
gluQuadricNormals(kw1,GLU_SMOOTH);
kw2 = gluNewQuadric();
gluQuadricDrawStyle(kw2,GLU_FILL);
gluQuadricNormals(kw2,GLU_SMOOTH);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glLightfv(GL_LIGHT0,GL_AMBIENT, amb);
glLightfv(GL_LIGHT0,GL_POSITION, pos);
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, spec);
glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 10);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormResize(TObject *Sender)
{
inicjuj_projekcje();
inicjuj_scene();
scena();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormPaint(TObject *Sender)
{
scena();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
zamknij_OpenGL();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
scena();
}
//---------------------------------------------------------------------------
bool TForm1 :: otworz_OpenGL( void)
{
PIXELFORMATDESCRIPTOR pfd;
int format_piksela;
hdc = GetDC( Form1->Panel1 -> Handle);
ZeroMemory( &pfd, sizeof( pfd));
pfd.nSize = sizeof( pfd);
pfd.nVersion = 1;
pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
pfd.iPixelType = PFD_TYPE_RGBA;
pfd.cColorBits = 24;
pfd.cDepthBits = 16;
pfd.iLayerType = PFD_MAIN_PLANE;
format_piksela = ChoosePixelFormat(hdc, &pfd);
SetPixelFormat(hdc, format_piksela, &pfd);
hrc = wglCreateContext(hdc);
if (hrc == NULL)
ShowMessage( "Nie uchwycilem kontekstu grafiki: hrc == NULL");
if (wglMakeCurrent(hdc, hrc) == false)
ShowMessage("Nie uaktywniłem grafiki");
return true;
}
//---------------------------------------------------------------------------
void TForm1 :: inicjuj_projekcje( void)
{
glViewport(0,0,Panel1->Width,Panel1->Height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(-0.5,0.5,-0.5,0.5,1,400);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
//---------------------------------------------------------------------------
void TForm1 :: inicjuj_scene( void)
{
glShadeModel(GL_SMOOTH);
glClearColor(0.0f, 0.0f, 0.0f, 0.5f);
glClearDepth(1.0f);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
}
//---------------------------------------------------------------------------
void TForm1 :: strzalka1()
{
glPushMatrix();
glTranslatef(0,0,50);
glRotatef(90,0,1,0);
glRotatef(-StrToInt(CSpinEdit1->Value),1,0,0);
gluCylinder(kw2,0.2,0.2,2,8,8);
glTranslatef(0,0,2);
gluCylinder(kw2,0.6,0.0,1.5,8,8);
glPopMatrix();
}
//---------------------------------------------------------------------------
void TForm1 :: strzalka2()
{
glPushMatrix();
glTranslatef(100,0,50);
glRotatef(-90,0,1,0);
glRotatef(-StrToInt(CSpinEdit3->Value),1,0,0);
gluCylinder(kw2,0.2,0.2,2,8,8);
glTranslatef(0,0,2);
gluCylinder(kw2,0.6,0.0,1.5,8,8);
glPopMatrix();
}
//---------------------------------------------------------------------------
void TForm1 :: scena( void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
gluLookAt(xkam,ykam,zkam,xcelu,ycelu,zcelu,0,1,0);
glMaterialfv(GL_FRONT, GL_EMISSION, emisja2);
strzalka1();
strzalka2();
glMaterialfv(GL_FRONT, GL_EMISSION, emisja);
glBegin(GL_LINES);
for(int i=0;i<=20;i++){
glVertex3f(i*5,0,0);
glVertex3f(i*5,0,100);
glVertex3f(0,0,i*5);
glVertex3f(100,0,i*5);
}
glEnd();
glTranslatef(0,0,50);
if(rysuj1==true)
torLotu(x1,y1);
glTranslatef(100,0,0);
if(rysuj2==true)
torLotu2(x2,y2);
glFlush();
SwapBuffers(hdc);
}
//---------------------------------------------------------------------------
void TForm1 :: torLotu(double *x, double *y)
{
if(rysuj1==true){
if(ii1<500)
ii1=ii1+1;
}
glMaterialfv(GL_FRONT, GL_EMISSION, emisja2);
glBegin(GL_LINES);
for(int i=0;i<=ii1-1;i++){
glVertex3f(x[i],y[i],0);
glVertex3f(x[i+1],y[i+1],0);
}
glEnd();
glTranslatef(x[ii1],y[ii1],0);
gluSphere(kw1,1,30,30);
glMaterialfv(GL_FRONT, GL_EMISSION, emisja3);
}
//---------------------------------------------------------------------------
void TForm1 :: torLotu2(double *x, double *y)
{
if(rysuj2==true) {
if(ii2<500)
ii2=ii2+1;
}
glMaterialfv(GL_FRONT, GL_EMISSION, emisja2);
glBegin(GL_LINES);
for(int i=0;i<=ii2-1;i++){
glVertex3f(x[i],y[i],0);
glVertex3f(x[i+1],y[i+1],0);
}
glEnd();
glTranslatef(x[ii2],y[ii2],0);
gluSphere(kw1,1,30,30);
glMaterialfv(GL_FRONT, GL_EMISSION, emisja3);
}
//---------------------------------------------------------------------------
void TForm1 :: zamknij_OpenGL( void)
{
wglMakeCurrent( NULL, NULL);
wglDeleteContext( hrc);
ReleaseDC( Form1 -> Handle, hdc);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ApplicationEvents1ShortCut(TWMKey &Msg,
bool &Handled)
{
if(Msg.CharCode == 'W'){
xkam=xkam+2*sin(kat*3.14/180);
zkam=zkam+2*cos(kat*3.14/180);
xcelu=xkam+200*sin(kat*3.14/180);
zcelu=zkam+200*cos(kat*3.14/180);
}
if(Msg.CharCode == 'Z'){
xkam=xkam-2*sin(kat*3.14/180);
zkam=zkam-2*cos(kat*3.14/180);
xcelu=xkam+200*sin(kat*3.14/180);
zcelu=zkam+200*cos(kat*3.14/180);
}
if(Msg.CharCode == 'A'){
kat=kat+4;
xcelu=xkam+200*sin(kat*3.14/180);
zcelu=zkam+200*cos(kat*3.14/180);
}
if(Msg.CharCode == 'D'){
kat=kat-4;
xcelu=xkam+200*sin(kat*3.14/180);
zcelu=zkam+200*cos(kat*3.14/180);
}
if(Msg.CharCode == 'Q'){
ykam=ykam+1;
ycelu=ycelu+1;
}
if(Msg.CharCode == 'E'){
ykam=ykam-1;
ycelu=ycelu-1;
}
if(Msg.CharCode == 'R'){
ycelu=ycelu+1;
}
if(Msg.CharCode == 'T'){
ycelu=ycelu-1;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
gluDeleteQuadric(kw1);
gluDeleteQuadric(kw2);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
ii1=0;
rysuj1=true;
licz(StrToInt(CSpinEdit2->Value), StrToInt(CSpinEdit1->Value), x1, y1);
Timer1->Enabled=true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
ii2=0;
rysuj2=true;
licz(StrToInt(CSpinEdit4->Value), -StrToInt(CSpinEdit3->Value), x2, y2);
Timer1->Enabled=true;
}
//---------------------------------------------------------------------------