Skocz do zawartości

Skrypt sprawdzający przecięcie odcinków


Rekomendowane odpowiedzi

Hejo.

Przedstawiam wam mój skrypt sprawdzający, czy 2 odcinki się przecinają xd

Do poprawnego działania skryptu, potrzebujemy 2 skrypt , obliczający kąt pomiędzy 2 kierunkami:

DirDiv (Skrypt na obliczanie różnicy kąta):

GML
var dif

if(argument1>argument0+180)

{

dif=-((360-argument1)+argument0)

}

else{

if(argument0>argument1+180)

{

dif=((360-argument0)+argument1)

}

else{

dif=argument1-argument0

}

}

return dif

I tu sam skrypt sprawdzania czy linie się przecinają:

Lines_collide:

GML
CH_XSTART_1=argument0

CH_YSTART_1=argument1

CH_XEND_1=argument2

CH_YEND_1=argument3

 

CH_XSTART_2=argument4

CH_YSTART_2=argument5

CH_XEND_2=argument6

CH_YEND_2=argument7

 

MAINDIR=DirDiv(point_direction( CH_XSTART_1 ,CH_YSTART_1 , CH_XEND_1 , CH_YEND_1 ),0)

 

DIR=point_direction(CH_XSTART_1,CH_YSTART_1, CH_XSTART_2 , CH_YSTART_2 )

DIST=point_distance(CH_XSTART_1,CH_YSTART_1, CH_XSTART_2 , CH_YSTART_2 )

CH_XSTART_2=lengthdir_x(DIST,DIR+MAINDIR)

CH_YSTART_2=lengthdir_y(DIST,DIR+MAINDIR)

 

DIR=point_direction(CH_XSTART_1,CH_YSTART_1, CH_XEND_2 , CH_YEND_2 )

DIST=point_distance(CH_XSTART_1,CH_YSTART_1, CH_XEND_2 , CH_YEND_2 )

CH_XEND_2=lengthdir_x(DIST,DIR+MAINDIR)

CH_YEND_2=lengthdir_y(DIST,DIR+MAINDIR)

 

DIST=point_distance(CH_XSTART_1,CH_YSTART_1,CH_XEND_1,CH_YEND_1)

CH_XSTART_1=0

CH_YSTART_1=0

CH_XEND_1=DIST

CH_YEND_1=0

 

if CH_YSTART_2>0

{

CH_YSTART_2=-CH_YSTART_2

CH_YEND_2=-CH_YEND_2

}

 

if CH_XSTART_2<0 && CH_XEND_2<0 {return 0; exit}

if CH_XSTART_2>DIST && CH_XEND_2>DIST {return 0; exit}

if CH_YEND_2<0 {return 0; exit}

 

if DirDiv( point_direction(CH_XSTART_2,CH_YSTART_2,0,0) , point_direction(CH_XSTART_2,CH_YSTART_2,CH_XEND_2,CH_YEND_2) ) < 0 {return 0; exit}

if DirDiv( point_direction(CH_XSTART_2,CH_YSTART_2,DIST,0) , point_direction(CH_XSTART_2,CH_YSTART_2,CH_XEND_2,CH_YEND_2) ) > 0 {return 0; exit}

return 1;

Zeby było wszystko jasne, dam przykład :P

https://gmclan.org/up808_12_lies.html (gmk)

Prosze mnie nie pytać, czemu nie ma komentarzy, czy czegoś takiego. Jest to skrypt, a nie Przykład pokazujący jak coś zrobić.(Co nie znaczy, że nie wiem o co chodzi w skrypcie ;p)

Odnośnik do komentarza
Udostępnij na innych stronach

Sory, muszę się czepić...

 

Zamiast

GML
var dif

if(argument1>argument0+180)

{

dif=-((360-argument1)+argument0)

}

else{

if(argument0>argument1+180)

{

dif=((360-argument0)+argument1)

}

else{

dif=argument1-argument0

}

}

return dif

 

Można dać

GML
return ((((argument0-argument1) mod 360)+540) mod 360)-180;
Może się mylę, ale chyba trochę krótszy (heh, nawet minimalnie wydajniejszy może :D) kodzik.
Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...