sdl:collisione cn una linea
  • In diretta da GamesVillage.it
    • News
    • -
    • In Evidenza
    • -
    • Recensioni
    • -
    • RetroGaming
    • -
    • Anteprime
    • -
    • Video
    • -
    • Cinema

Pag 1 di 2 12 UltimoUltimo
Visualizzazione risultati da 1 a 15 di 23

Discussione: sdl:collisione cn una linea

Cambio titolo
  1. #1
    Il pazzo!! L'avatar di roby65
    Registrato il
    07-04
    Messaggi
    1.294

    sdl:collisione cn una linea

    allora, ho un grandissimo problema: nn riesco a fare un codice ke funzioni efficacemente ke controlli la collisione cn una linea ed un rettangolo, ho provato trovando le coordinate in basso del rettangolo e poi trovando la y ke dobrebbe avere a quella x, ma nn funziona bene xke la linea risulta spostata......qualuno sa propormi una soluzione + efficace?

  2. #2
    Untochable L'avatar di squall88
    Registrato il
    05-03
    Località
    Nella CPU!
    Messaggi
    639
    okokok calma e spiegati meglio, magari capiamo qualcosa...

  3. #3
    Bannato L'avatar di Eclipse
    Registrato il
    02-04
    Località
    C++atania
    Messaggi
    5.604
    Citazione roby65
    allora, ho un grandissimo problema: nn riesco a fare un codice ke funzioni efficacemente ke controlli la collisione cn una linea ed un rettangolo, ho provato trovando le coordinate in basso del rettangolo e poi trovando la y ke dobrebbe avere a quella x, ma nn funziona bene xke la linea risulta spostata......qualuno sa propormi una soluzione + efficace?
    Mettiamo che l'origine della linea sia linea[0] e che la fine linea[1]
    mentre il rettangolo è identificato dai vertici box[0],box[1],box[2],box[3]
    Poi ovviamente sistemi il tutto per funzionare con il tuo codice...

    Codice:
    // invece di testare la collisione, diamo per scontato che ci sia e testiamo
    // la non collisione per fare meno prove
    // infatti basta vedere se i vertici della linea stanno entrambi da un lato o
    // dall'altro rispetto la proiezione del rettangolo su x e poi se non su y
    // per confermare
    bool cx=true, collisione=true;
    
    //controllo su X
    if (linea[0].x<box[0].x&&linea[1].x<box[0].x) cx=false;
    else if (linea[0].x>box[1].x&&linea[1].x>box[1].x) cx=false;
    
    if (cx)
    {
    	//controllo su Y
    	if (linea[0].y<box[0].y&&linea[1].y<box[0].y) collisione=false;
    	else if (linea[0].y>box[2].y&&linea[1].y>box[2].y) collisione=false;
    }
    non ho provato il codice ma funziona sicuro
    E' inteso che box[0] sia il vertice in alto a sinistra del rettangolo, 1 quello in alto o in basso a destra (basta che sia a destra), e 2 quello in basso a sinistra o destra (anche qui basta che sia in basso)

    Citazione squall88
    okokok calma e spiegati meglio, magari capiamo qualcosa...
    chiedeva come calcolare la collisione tra una retta e un rettagolo
    Ultima modifica di Eclipse; 13-04-2007 alle 13:58:15

  4. #4
    Il pazzo!! L'avatar di roby65
    Registrato il
    07-04
    Messaggi
    1.294
    ho gia fatto in un altro modo, in pratica avendo i 2 punti della retta calcolo ke y dovrebbe avere la figura a quella x, e se la y attuale è maggiore alora c'è collisione

  5. #5
    l' oscuro nemico L'avatar di morgoth90
    Registrato il
    05-06
    Località
    C LikeLandia
    Messaggi
    2.275
    modestamente con un pizzico del mio aiuto
    @roby65: erch&#232; nn sei in msn?



    ESISTE UN UNICO AMMINISTRATORE


  6. #6
    Bannato L'avatar di Eclipse
    Registrato il
    02-04
    Località
    C++atania
    Messaggi
    5.604
    eh beh ma il mio algoritmo &#232; pi&#249; veloce

  7. #7
    Il pazzo!! L'avatar di roby65
    Registrato il
    07-04
    Messaggi
    1.294
    veramente eclipse nn riesco a capire come funziona concettualmente il tuo algortimo

  8. #8
    FRAK! L'avatar di The Dix
    Registrato il
    09-05
    Località
    Roma
    Messaggi
    11.830
    si xo in quel modo sbaglio o potrebbe venire fuori una roba del genere?


    ?
    Ultima modifica di The Dix; 13-04-2007 alle 22:56:28

  9. #9
    Bannato L'avatar di Eclipse
    Registrato il
    02-04
    Località
    C++atania
    Messaggi
    5.604
    Citazione The Dix
    si xo in quel modo sbaglio o potrebbe venire fuori una roba del genere?


    ?
    in quel caso la collisione la fa addirittura senza neanche passare al secondo if perch&#232; la fine della linea sta dentro la proiezione su X del rettangolo

    ho spiegato il funzionamento a roby cmq

  10. #10
    Untochable L'avatar di squall88
    Registrato il
    05-03
    Località
    Nella CPU!
    Messaggi
    639
    Citazione Eclipse
    chiedeva come calcolare la collisione tra una retta e un rettagolo
    andavo di corsa... si in effetti rileggendolo con calma ho capito!

  11. #11
    Ex ***** VIPz Estathé L'avatar di nicjedi
    Registrato il
    12-02
    Località
    non vivo
    Messaggi
    16.158
    Citazione Eclipse
    Mettiamo che l'origine della linea sia linea[0] e che la fine linea[1]
    mentre il rettangolo &#232; identificato dai vertici box[0],box[1],box[2],box[3]
    Poi ovviamente sistemi il tutto per funzionare con il tuo codice...

    Codice:
    // invece di testare la collisione, diamo per scontato che ci sia e testiamo
    // la non collisione per fare meno prove
    // infatti basta vedere se i vertici della linea stanno entrambi da un lato o
    // dall'altro rispetto la proiezione del rettangolo su x e poi se non su y
    // per confermare
    bool cx=true, collisione=true;
    
    //controllo su X
    if (linea[0].x<box[0].x&&linea[1].x<box[0].x) cx=false;
    else if (linea[0].x>box[1].x&&linea[1].x>box[1].x) cx=false;
    
    if (cx)
    {
        //controllo su Y
        if (linea[0].y<box[0].y&&linea[1].y<box[0].y) collisione=false;
        else if (linea[0].y>box[2].y&&linea[1].y>box[2].y) collisione=false;
    }
    non ho provato il codice ma funziona sicuro
    E' inteso che box[0] sia il vertice in alto a sinistra del rettangolo, 1 quello in alto o in basso a destra (basta che sia a destra), e 2 quello in basso a sinistra o destra (anche qui basta che sia in basso)



    chiedeva come calcolare la collisione tra una retta e un rettagolo
    il tuo codice &#232; buono, dato che si basa sul metodo degli assi separati, ma essendo linea e rettangolo entit&#224; di grado diverso, ci sono casi in cui non funzioner&#224;, come questo:


    l'unico metodo esatto, se ricordo bene, &#232; calcolare il "vettore segmento", e i 4 vettori che uniscono il punto iniziale del segmento con i 4 vertici del rettangolo. Si fanno poi 4 prodotti vettoriali (in XY, tanto sono elementi a 2 dimensioni) tra il "vettore segmento" e i 4 vettori calcolati sopra. Se i risultati hanno lo stesso segno allora non collide
    &#232; pi&#249; difficile da spiegare che da fare

    In ogni caso, se serve, luned&#236; posso controllare sul libro di Collision Detection che ho al lavoro...
    "La violenza è l'ultimo rifugio degli incapaci"
    "Non lasciare mai che la morale ti impedisca di fare la cosa giusta"
    "La disumanità del computer sta nel fatto che, una volta programmato e messo in funzione, si comporta in maniera perfettamente onesta."
    "fare molte cose alla volta significa non farne bene nessuna"


  12. #12
    FRAK! L'avatar di The Dix
    Registrato il
    09-05
    Località
    Roma
    Messaggi
    11.830
    Citazione Eclipse
    in quel caso la collisione la fa addirittura senza neanche passare al secondo if perchè la fine della linea sta dentro la proiezione su X del rettangolo

    ho spiegato il funzionamento a roby cmq
    sisi ho postato poco prima di spenge re il pc e poi quando ho spento mi sono accorto che avevo scritto una cavolata e che, come dice nicjedi, la retta può benissimo sconfinare nella x del rettangolo senza che percò ci siano collisioni


    libro di collision detection ? lo voglioooo voglio un po di libri di teoria dei giochi

    scusa nicjedi ma che lavoro fai?(se si può dire)

  13. #13
    Bannato L'avatar di Eclipse
    Registrato il
    02-04
    Località
    C++atania
    Messaggi
    5.604
    Citazione nicjedi
    il tuo codice &#232; buono, dato che si basa sul metodo degli assi separati, ma essendo linea e rettangolo entit&#224; di grado diverso, ci sono casi in cui non funzioner&#224;, come questo:
    vero, bisognerebbe fare molti + calcoli per aggiustare quei casi a quel punto per&#242; viene pi&#249; semplice calcolarsi la funzione di una retta che passa per due punti e calcolare la x alle y dei vertici sopra e sotto del rettangolo.
    Da notare che se si usa la formula della retta si avranno anche punti fuori dal segmento, perci&#242; per calcolare solo sul segmento si devono scartare i valori che ne escono fuori
    Ultima modifica di Eclipse; 14-04-2007 alle 11:01:58

  14. #14
    Ex ***** VIPz Estathé L'avatar di nicjedi
    Registrato il
    12-02
    Località
    non vivo
    Messaggi
    16.158
    Citazione Eclipse
    vero, bisognerebbe fare molti + calcoli per aggiustare quei casi a quel punto per&#242; viene pi&#249; semplice calcolarsi la funzione di una retta che passa per due punti e calcolare la x alle y dei vertici sopra e sotto del rettangolo.
    Da notare che se si usa la formula della retta si avranno anche punti fuori dal segmento, perci&#242; per calcolare solo sul segmento si devono scartare i valori che ne escono fuori
    Esatto...la Collision Detection &#232; un mondo cattivo

    EDIT: mi &#232; venuto in mente che neanche il metodo del prodotto vettoriale &#232; giusto...dato che il segmento non &#232; infinito come la retta, non si formano due semipiani (in pratica il metodo del prodotto vettoriale controlla se il rettangolo si trova interamente in uno dei due semipiani). quindi ci possono essere casi in cui il rettangolo sta tra un semipiano e l'altro, ma dato che si trova "sotto" o "sopra" il segmento, non collide.
    Ultima modifica di nicjedi; 14-04-2007 alle 11:33:02
    "La violenza è l'ultimo rifugio degli incapaci"
    "Non lasciare mai che la morale ti impedisca di fare la cosa giusta"
    "La disumanità del computer sta nel fatto che, una volta programmato e messo in funzione, si comporta in maniera perfettamente onesta."
    "fare molte cose alla volta significa non farne bene nessuna"


  15. #15
    Ex ***** VIPz Estathé L'avatar di nicjedi
    Registrato il
    12-02
    Località
    non vivo
    Messaggi
    16.158
    Citazione The Dix
    sisi ho postato poco prima di spenge re il pc e poi quando ho spento mi sono accorto che avevo scritto una cavolata e che, come dice nicjedi, la retta può benissimo sconfinare nella x del rettangolo senza che percò ci siano collisioni


    libro di collision detection ? lo voglioooo voglio un po di libri di teoria dei giochi

    scusa nicjedi ma che lavoro fai?(se si può dire)
    Programmatore di software CAD/CAM...e dato che abbiamo tra i nostri software un simulatore real-time delle lavorazioni "progettate", mi son dovuto studiare un po' di Collision Detection per controllare se per caso il mandrino non va a collidere con un altro braccio ecc...
    "La violenza è l'ultimo rifugio degli incapaci"
    "Non lasciare mai che la morale ti impedisca di fare la cosa giusta"
    "La disumanità del computer sta nel fatto che, una volta programmato e messo in funzione, si comporta in maniera perfettamente onesta."
    "fare molte cose alla volta significa non farne bene nessuna"


Pag 1 di 2 12 UltimoUltimo

Regole di Scrittura

  • Tu non puoi inviare nuove discussioni
  • Tu non puoi inviare risposte
  • Tu non puoi inviare allegati
  • Tu non puoi modificare i tuoi messaggi
  •