[ Príspevkov: 5 ] 
AutorSpráva
Offline

Užívateľ
Užívateľ
C++ triedy, spravna rekurzia

Registrovaný: 01.02.08
Prihlásený: 10.04.15
Príspevky: 31
Témy: 11 | 11
NapísalOffline : 01.12.2010 12:33 | C++ triedy, spravna rekurzia

Zdravim, pracujem na pocitacovej hre a mam problem s funkciu na detekciu kolizi.
Kód:
bool player::moze(float velk, float alph, float beth)
{
     nv->set((kx+velk*cos((3.1428*(beth))/180)*cos((3.1428*alph)/180))/nx,
             (ky-velk*sin((3.1428*(beth))/180))/ny,
             (kz-velk*sin((3.1428*(alph))/180)*cos((3.1428*beth)/180))/nz );
     int mx=(int)round(ppmx), mz=(int)round(ppmz);
     
     if ((mx-1>=0) and (mz-1>=0)) //n4
     {
        at1->set(mx,mapa[mx][mz],mz);
        at2->set((mx-1),(mapa[mx-1][mz]),(mz));
        at3->set((mx),(mapa[mx][mz-1]),(mz-1));
       
        if ((magic_testIntersectionSphereTriangle(*nv,sT->polomer,*at1,*at2,*at3,NULL)) and
            (mapa[mx][mz]) and (mapa[mx-1][mz]) and (mapa[mx][mz-1]) )
        {
            S=*nv;
           
            S-=n4*sT->polomer;
            S+=n4*dist(n4,at1,S);
            V.set(kx/nx,ky/ny,kz/nz);
            V-=n4*dist(n4,at1,V);
            S-=V;
           
            S.x*=nx;
            S.y*=ny;
            S.z*=nz;
           
            if (0<S.x) ddalp = -( atan( (-S.z)/(-S.x) )*180.0 /3.1428);
            if (0>S.x) ddalp = -( atan( (-S.z)/(-S.x) )*180.0 /3.1428)+180;

            if ((sqrt( ((S.x)*(S.x))+((S.z)*(S.z)))))
            ddbet=-atan((S.y)/( sqrt( ((S.x)*(S.x))+((S.z)*(S.z)) ) ) )*180.0/3.1428;
           
            if (moze(S.len(),ddalp,ddbet))
            {
               kx+=S.x;
               ky+=S.y;
               kz+=S.z;
            }
           
            return false;
        }
     }
     
     if ((mz-1>=0) and (mx+1<HMAPR)) //n5 6
     {
        at1->set((mx),(mapa[mx][mz]),(mz));
        at2->set((mx),(mapa[mx][mz-1]),(mz-1));
        at3->set((mx+1),(mapa[mx+1][mz-1]),(mz-1));
       
        if ((magic_testIntersectionSphereTriangle(*nv,sT->polomer,*at1,*at2,*at3,NULL)) and
            (mapa[mx][mz]) and (mapa[mx][mz-1]) and (mapa[mx+1][mz-1]) )
        {
            S=*nv;
           
            S-=n5*sT->polomer;
            S+=n5*dist(n5,at1,S);
            V.set(kx/nx,ky/ny,kz/nz);
            V-=n5*dist(n5,at1,V);
            S-=V;
           
            S.x*=nx;
            S.y*=ny;
            S.z*=nz;
           
            if (0<S.x) ddalp = -( atan( (-S.z)/(-S.x) )*180.0 /3.1428);
            if (0>S.x) ddalp = -( atan( (-S.z)/(-S.x) )*180.0 /3.1428)+180;

            if ((sqrt( ((S.x)*(S.x))+((S.z)*(S.z)))))
            ddbet=-atan((S.y)/( sqrt( ((S.x)*(S.x))+((S.z)*(S.z)) ) ) )*180.0/3.1428;
           
            if (moze(S.len(),ddalp,ddbet))
            {
               kx+=S.x;
               ky+=S.y;
               kz+=S.z;
            }
            return false;
        }
       
        at1->set((mx),(mapa[mx][mz]),(mz));
        at2->set((mx+1),(mapa[mx+1][mz-1]),(mz-1));
        at3->set((mx+1),(mapa[mx+1][mz]),(mz));
       
        if ((magic_testIntersectionSphereTriangle(*nv,sT->polomer,*at1,*at2,*at3,NULL)) and
            (mapa[mx][mz]) and (mapa[mx+1][mz-1]) and (mapa[mx+1][mz]) )
        {
            S=*nv;
           
            S-=n6*sT->polomer;
            S+=n6*dist(n6,at1,S);
            V.set(kx/nx,ky/ny,kz/nz);
            V-=n6*dist(n6,at1,V);
            S-=V;
           
            S.x*=nx;
            S.y*=ny;
            S.z*=nz;
           
            if (0<S.x) ddalp = -( atan( (-S.z)/(-S.x) )*180.0 /3.1428);
            if (0>S.x) ddalp = -( atan( (-S.z)/(-S.x) )*180.0 /3.1428)+180;

            if ((sqrt( ((S.x)*(S.x))+((S.z)*(S.z)))))
            ddbet=-atan((S.y)/( sqrt( ((S.x)*(S.x))+((S.z)*(S.z)) ) ) )*180.0/3.1428;
           
            if (moze(S.len(),ddalp,ddbet))
            {
               kx+=S.x;
               ky+=S.y;
               kz+=S.z;
            }
            return false;
        }
     }
     
     if ((mx-1>=0) and (mz+1<HMAPR)) //n2 3
     {
        at1->set((mx),(mapa[mx][mz]),(mz));
        at2->set((mx),(mapa[mx][mz+1]),(mz+1));
        at3->set((mx-1),(mapa[mx-1][mz+1]),(mz+1));
       
        if ((magic_testIntersectionSphereTriangle(*nv,sT->polomer,*at1,*at2,*at3,NULL)) and
            (mapa[mx][mz]) and (mapa[mx][mz+1]) and (mapa[mx-1][mz+1]) )
        {
            S=*nv;
           
            S-=n2*sT->polomer;
            S+=n2*dist(n2,at1,S);
            V.set(kx/nx,ky/ny,kz/nz);
            V-=n2*dist(n2,at1,V);
            S-=V;
           
            S.x*=nx;
            S.y*=ny;
            S.z*=nz;
           
            if (0<S.x) ddalp = -( atan( (-S.z)/(-S.x) )*180.0 /3.1428);
            if (0>S.x) ddalp = -( atan( (-S.z)/(-S.x) )*180.0 /3.1428)+180;

            if ((sqrt( ((S.x)*(S.x))+((S.z)*(S.z)))))
            ddbet=-atan((S.y)/( sqrt( ((S.x)*(S.x))+((S.z)*(S.z)) ) ) )*180.0/3.1428;
           
            if (moze(S.len(),ddalp,ddbet))
            {
               kx+=S.x;
               ky+=S.y;
               kz+=S.z;
            }
            return false;
        }
       
        at1->set((mx),(mapa[mx][mz]),(mz));
        at2->set((mx-1),(mapa[mx-1][mz]),(mz));
        at3->set((mx-1),(mapa[mx-1][mz+1]),(mz+1));
       
        if ((magic_testIntersectionSphereTriangle(*nv,sT->polomer,*at1,*at2,*at3,NULL)) and
            (mapa[mx][mz]) and (mapa[mx-1][mz]) and (mapa[mx-1][mz+1]) )
        {
            S=*nv;
           
            S-=n3*sT->polomer;
            S+=n3*dist(n3,at1,S);
            V.set(kx/nx,ky/ny,kz/nz);
            V-=n3*dist(n3,at1,V);
            S-=V;
           
            S.x*=nx;
            S.y*=ny;
            S.z*=nz;
           
            if (0<S.x) ddalp = -( atan( (-S.z)/(-S.x) )*180.0 /3.1428);
            if (0>S.x) ddalp = -( atan( (-S.z)/(-S.x) )*180.0 /3.1428)+180;

            if ((sqrt( ((S.x)*(S.x))+((S.z)*(S.z)))))
            ddbet=-atan((S.y)/( sqrt( ((S.x)*(S.x))+((S.z)*(S.z)) ) ) )*180.0/3.1428;
           
            if (moze(S.len(),ddalp,ddbet))
            {
               kx+=S.x;
               ky+=S.y;
               kz+=S.z;
            }
            return false;
        }
     }
     
     if ((mx+1<HMAPR) and (mz+1<HMAPR))//n1
     {
        at1->set((mx),(mapa[mx][mz]),(mz));
        at2->set((mx+1),(mapa[mx+1][mz]),(mz));
        at3->set((mx),(mapa[mx][mz+1]),(mz+1));
       
        if ((magic_testIntersectionSphereTriangle(*nv,sT->polomer,*at1,*at2,*at3,NULL)) and
            (mapa[mx][mz]) and (mapa[mx+1][mz]) and (mapa[mx][mz+1]) )
        {
            S=*nv;
           
            S-=n1*sT->polomer;
            S+=n1*dist(n1,at1,S);
            V.set(kx/nx,ky/ny,kz/nz);
            V-=n1*dist(n1,at1,V);
            S-=V;
           
            S.x*=nx;
            S.y*=ny;
            S.z*=nz;
           
            if (0<S.x) ddalp = -( atan( (-S.z)/(-S.x) )*180.0 /3.1428);
            if (0>S.x) ddalp = -( atan( (-S.z)/(-S.x) )*180.0 /3.1428)+180;

            if ((sqrt( ((S.x)*(S.x))+((S.z)*(S.z)))))
            ddbet=-atan((S.y)/( sqrt( ((S.x)*(S.x))+((S.z)*(S.z)) ) ) )*180.0/3.1428;
           
            if (moze(S.len(),ddalp,ddbet))
            {
               kx+=S.x;
               ky+=S.y;
               kz+=S.z;
            }
            return false;
        }
     }
     
     return true;
}


Program pada na mieste
if (moze(S.len(),ddalp,ddbet))
{
kx+=S.x;
ky+=S.y;
kz+=S.z;
}
ale nie vzdy, hlavne na hranach trojuholnikov: http://pictureup.cz/picture/verejny/12431243chyba.jpg

funkcia magic_testIntersectionSphereTriangle a trieda Vec3f su z kniznice ozcollide

kx,ky,kz su suradnice hraca, nx,ny,nz su globalne premenne na "roztiahnutie" mapy. V,S su triedy Vec3f, patria triede player.
nv,at1,at2,at3 su ukazovatele na Vec3f patria triede player, n1..6 su normalove vektory trojuholnikov ktore tvoria mapu.

Program pada sposobom ako keby som sa snazil zapisat alebo nacitat spoza pola ale ku tomu v programe nedochadza. Mohli by ste mi s tym niekto pomoct?


Offline

Skúsený užívateľ
Skúsený užívateľ
C++ triedy, spravna rekurzia

Registrovaný: 11.01.09
Prihlásený: 26.01.18
Príspevky: 1290
Témy: 9 | 9
Bydlisko: HE
NapísalOffline : 02.12.2010 15:38 | C++ triedy, spravna rekurzia

Zobrazí to nejakú chybovú správu? Ak áno, trocha by to pomohlo.


Offline

Užívateľ
Užívateľ
C++ triedy, spravna rekurzia

Registrovaný: 01.02.08
Prihlásený: 10.04.15
Príspevky: 31
Témy: 11 | 11
Napísal autor témyOffline : 02.12.2010 20:17 | C++ triedy, spravna rekurzia

Na Win xp to nezobrazi nic, len to padne, na viste to zobrazi http://pictureup.cz/picture/verejny/734734untitled.png


Offline

Skúsený užívateľ
Skúsený užívateľ
C++ triedy, spravna rekurzia

Registrovaný: 11.01.09
Prihlásený: 26.01.18
Príspevky: 1290
Témy: 9 | 9
Bydlisko: HE
NapísalOffline : 02.12.2010 21:59 | C++ triedy, spravna rekurzia

Exception Code: c00000fd je chyba stack overflow, to znamená, že daná funkcia je volaná rekurzívne toľko krát, až to zahltí celý zásobník aplikácie. Ak to je možné, bolo by dobré funkciu prerobiť ako nerekurzívnu (prípadne inak zamedziť častému vnáraniu).


Offline

Užívateľ
Užívateľ
C++ triedy, spravna rekurzia

Registrovaný: 01.02.08
Prihlásený: 10.04.15
Príspevky: 31
Témy: 11 | 11
Napísal autor témyOffline : 03.12.2010 8:47 | C++ triedy, spravna rekurzia

Diky moc. Upravil som to a uz to funguje.


 [ Príspevkov: 5 ] 


C++ triedy, spravna rekurzia



Podobné témy

 Témy  Odpovede  Zobrazenia  Posledný príspevok 
V tomto fóre nie sú ďalšie neprečítané témy.

C++ konštantná funkcia triedy

v Assembler, C, C++, Pascal, Java

2

407

07.08.2010 14:17

Loko11

V tomto fóre nie sú ďalšie neprečítané témy.

Triedy a sub triedy

v PHP, ASP

5

351

19.04.2010 19:50

emer

V tomto fóre nie sú ďalšie neprečítané témy.

Správna zostava.

v PC zostavy

15

729

19.04.2008 14:03

Andel6610

V tomto fóre nie sú ďalšie neprečítané témy.

Spravna volba ?

v Notebooky a netbooky

2

564

06.02.2007 21:27

Jaro

V tomto fóre nie sú ďalšie neprečítané témy.

Správna teplota :/ ?

[ Choď na stránku:Choď na stránku: 1, 2, 3 ]

v Chladiče a všetky druhy chladenia

61

1911

20.10.2010 16:02

MagnatWoofer

V tomto fóre nie sú ďalšie neprečítané témy.

Spravna URL

v JavaScript, VBScript, Ajax

12

343

06.08.2010 17:09

Ďuri

V tomto fóre nie sú ďalšie neprečítané témy.

Spravna teplota HDD

v Pevné disky a radiče

2

423

24.05.2011 18:42

PyroSVK

V tomto fóre nie sú ďalšie neprečítané témy.

Spravna BIOS verzia

[ Choď na stránku:Choď na stránku: 1, 2 ]

v Operačné systémy Microsoft

38

406

20.05.2016 20:35

chameleo

V tomto fóre nie sú ďalšie neprečítané témy.

Aká doska je správna?

v Základné dosky

10

303

05.03.2013 1:23

xml

V tomto fóre nie sú ďalšie neprečítané témy.

Gaming PC | Správna zostava ?

[ Choď na stránku:Choď na stránku: 1, 2 ]

v PC zostavy

30

588

22.02.2015 19:02

Miso122

V tomto fóre nie sú ďalšie neprečítané témy.

nejde mi spravna rychlosť na nete

v Sieťové a internetové programy

2

77

19.01.2013 14:46

walther

V tomto fóre nie sú ďalšie neprečítané témy.

Správna rada Apple údajne nespokojná s mierou inovácie

[ Choď na stránku:Choď na stránku: 1, 2 ]

v Novinky

35

599

14.08.2013 10:42

DMaMT

V tomto fóre nie sú ďalšie neprečítané témy.

Forko triedy

v Redakčné systémy

7

544

05.05.2009 21:04

Svolo

V tomto fóre nie sú ďalšie neprečítané témy.

Čo by mala mať podľa vás správna PC hra?

[ Choď na stránku:Choď na stránku: 1, 2 ]

v Počítačové hry

42

1413

18.08.2010 10:08

KingTommy

V tomto fóre nie sú ďalšie neprečítané témy.

Mobil strednej triedy

v Mobilné zariadenia

24

752

15.09.2017 11:54

Nair0n

V tomto fóre nie sú ďalšie neprečítané témy.

Siete triedy B

v Sieťové a internetové programy

1

99

28.01.2013 19:30

majky358



© 2005 - 2018 PCforum, edited by JanoF