Il Bar dell'Ingegneria

problema di geometria

« Older   Newer »
 
  Share  
.
  1. ninja turtle
        +1   -1
     
    .

    User deleted


    non mi viene in mente un posto migliore dove porre il quesito, quindi lo pongo qui (in fin dei conti, una volta risolto il problema teorico, dovrei ricavarne una routine in vb).

    dato un poligono chiuso di cui conosciamo le coordinate dei vertici e il loro ordine (e quindi tutto il conoscibile) e dato un punto (sempre di coordinate note), come determinare se il punto si trova all'interno del poligono oppure no?

    dopo averci pensato un po', sono giunto alla seguenti conclusioni:
    supponiamo per un attimo che il poligono sia convesso; in tal caso, il punto è interno se la somma degli angoli centrati su esso e che puntano su due vertici consecutivi è pari a 360°, è esterno se la somma è minore di 360° (la dimostrazione è ovvia, un punto esterno "vede" il poligono sotto un angolo che è minore di 180°, quindi la somma di questi angoli, pari al doppio, è sicuramente minore di 360°).

    e se il poligono invece non è convesso?
    mi vien da pensare che la cosa sia analoga, purchè si prendano gli angoli col segno (ovvero, fissato un verso di percorrenza del poligono, per esempio antiorario, gli angoli che "vanno" in quel verso sono positivi, quelli in verso contrario negativi).
    se il punto è interno, sicuramente la somma fa ancora 360°; se esso è esterno, la somma questa volta fa 0° (e lo stesso nel caso precedente, con queste "nuove regole").
    ammettendo che sia corretto (vi sembra corretto?), come costruire una funzione che mi restituisca il "segno" dell'angolo?

    (PS: ricavare il valore dell'angolo è facile, basta calcolare il coefficiente angolare delle due rette e ricordarsi che esso è pari all'arcotangente dell'angolo sotteso)

    Oppure vi viene in mente qualche altro metodo più semplice?
     
    Top
    .
  2. lapalisse
        +1   -1
     
    .

    User deleted


    c'era un teorema sul calcolo delle aree dei poligoni mediante le coordinate.... Credo si tratti della formula di Gauss.... L'area è sempre un risultato positivo, ma il calcolo intermedio a naso può aiutare coi segni.... dovrei andarmela a rivedere.
    Forse è una cacchiata, ma magari può esssere la strada...
     
    Top
    .
  3. gio..
        +1   -1
     
    .

    User deleted


    CITAZIONE (ninja turtle @ 20/6/2006, 11:42)
    non mi viene in mente un posto migliore dove porre il quesito, quindi lo pongo qui (in fin dei conti, una volta risolto il problema teorico, dovrei ricavarne una routine in vb).

    dato un poligono chiuso di cui conosciamo le coordinate dei vertici e il loro ordine (e quindi tutto il conoscibile) e dato un punto (sempre di coordinate note), come determinare se il punto si trova all'interno del poligono oppure no?

    dopo averci pensato un po', sono giunto alla seguenti conclusioni:
    supponiamo per un attimo che il poligono sia convesso; in tal caso, il punto è interno se la somma degli angoli centrati su esso e che puntano su due vertici consecutivi è pari a 360°, è esterno se la somma è minore di 360° (la dimostrazione è ovvia, un punto esterno "vede" il poligono sotto un angolo che è minore di 180°, quindi la somma di questi angoli, pari al doppio, è sicuramente minore di 360°).

    e se il poligono invece non è convesso?
    mi vien da pensare che la cosa sia analoga, purchè si prendano gli angoli col segno (ovvero, fissato un verso di percorrenza del poligono, per esempio antiorario, gli angoli che "vanno" in quel verso sono positivi, quelli in verso contrario negativi).
    se il punto è interno, sicuramente la somma fa ancora 360°; se esso è esterno, la somma questa volta fa 0° (e lo stesso nel caso precedente, con queste "nuove regole").
    ammettendo che sia corretto (vi sembra corretto?), come costruire una funzione che mi restituisca il "segno" dell'angolo?

    (PS: ricavare il valore dell'angolo è facile, basta calcolare il coefficiente angolare delle due rette e ricordarsi che esso è pari all'arcotangente dell'angolo sotteso)

    Oppure vi viene in mente qualche altro metodo più semplice?

    Non so se e' il modo piu' semplice, ma la strategia della conta delle intersezioni tra poligono e semiretta avente origine nel punto e' quella migliore.

    image

    La strategia consiste in:

    - si fissa una direzione qualsiasi per una semiretta che ha origine nel punto P ma che non passi per nessuno dei vertici;
    - si procede al test di intersezione tra tale semiretta e ciascuno dei segmenti costituenti i lati del poligono;
    - si contano i lati intercettati dalla semiretta;
    - se il numero totale dei lati intercettati e' pari allora il punto è esterno altrimenti e' interno.

    Ciao
     
    Top
    .
  4. ninja turtle
        +1   -1
     
    .

    User deleted


    la soluzione è molto brillante, complimenti.
    tra l'altro essa è estendibile anche al caso di "lati" del poligono costituiti da archi o cmq curve di formula nota.
    dal punto di vista computazionale (=velocità) mi pare di prestazioni inferiori:

    detto p il punto e vi i vertici con i da 1 a n,
    passi per soluzione "ad angoli" (per ogni i):
    -calcolare atan (m(p-vi) )
    -calcolare sgn dell'angolo (?)
    -sommare

    passi per soluzione a semiretta:
    -calcolare m della semiretta in modo che non intersechi nessun vertice
    quindi (per ogni i):
    -calcolare m(vi-vj)
    -calcolare intersezione
    -verificare che stia dentro il segmento vi-vj
    -sommare

    in pratica, essere sicuri che la semiretta non intersechi nessun vertice significa effettuare i calcoli di tutti gli angoli con tutti i vertici, quindi corrisponde già da solo a quasi tutta la "fatica" della soluzione ad angoli.
    Supponendo quindi di avere poligoni non troppo fitti, meglio sarebbe "sperare" di averci preso:

    passi per soluzione a semiretta:
    -fissare m della semiretta
    quindi (per ogni i):
    -calcolare m(vi-vj)
    -calcolare intersezione
    -verificare che stia dentro il segmento vi-vj, e che non sia vi (altrimenti ricomincio dall'inizio)
    -sommare

    per fissare la semiretta, piuttosto che scegliere a caso o partire sempre con angolo fisso (orizzontale), tenderei ad adottare una strategia tipo spostarmi di un angolo molto piccolo dal 1° vertice.



    mi automodifico: è di prestazioni inferiori qualora debba verificare 1 solo punto, ma nel momento in cui ne devo verificare molti, i calcoli dei coefficienti angolari dei lati restano fissi, quindi progressivamente dovrebbe diventare conveniente.
    occorre inoltre tener conto che se il punto si trova sulla frontiera, il metodo non è più affidabile, salvo eliminare dal computo l'intersezione dovuta al punto stesso.

    molte grazie, magari rigurgito qui il codice della routine (ammesso che ci metta meno del vostro ragioniere...)
     
    Top
    .
  5. enrico..
        +1   -1
     
    .

    User deleted


    mah,
    se non ho capito male, si tratta proprio di un solo passaggio e posso anche tirare a caso quanto riguarda la semiretta.
    le soluzioni sono
    a) semiretta non incontra lati poligono = punto esterno
    b) semiretta incontra lati poligono (n° pari di intersezioni) = punto ancora esterno
    c) semiretta incontra lati poligono (n° dispari di intersezioni) = punto interno

    quindi,
    determino se il punto sta sulla frontiera, così mi calcolo anche i coefficienti dei lati del poligono,
    se no allora invento una semiretta a caso, posso anche prendere sempre la stessa e sicuramente sto dentro ad uno dei tre casi sopracitati.
     
    Top
    .
  6. gio..
        +1   -1
     
    .

    User deleted


    CITAZIONE (enrico.. @ 20/6/2006, 16:59)
    mah,
    se non ho capito male, si tratta proprio di un solo passaggio e posso anche tirare a caso quanto riguarda la semiretta.
    le soluzioni sono
    a) semiretta non incontra lati poligono = punto esterno
    b) semiretta incontra lati poligono (n° pari di intersezioni) = punto ancora esterno
    c) semiretta incontra lati poligono (n° dispari di intersezioni) = punto interno

    quindi,
    determino se il punto sta sulla frontiera, così mi calcolo anche i coefficienti dei lati del poligono,
    se no allora invento una semiretta a caso, posso anche prendere sempre la stessa e sicuramente sto dentro ad uno dei tre casi sopracitati.

    esatto enrico. Se poi consideri lo 0 come numero pari allora le soluzioni sono solo due:
    b) semiretta incontra lati poligono (n° pari di intersezioni) = punto esterno
    c) semiretta incontra lati poligono (n° dispari di intersezioni) = punto interno

    Inoltre la semiretta e' solo una e scelta a caso, nel senso che prendi una memiretta a casaccio (e solo una purchè non passi per nessuno dei vertici del poligono).



    CITAZIONE (enrico.. @ 20/6/2006, 16:59)
    mah,
    se non ho capito male, si tratta proprio di un solo passaggio e posso anche tirare a caso quanto riguarda la semiretta.
    le soluzioni sono
    a) semiretta non incontra lati poligono = punto esterno
    b) semiretta incontra lati poligono (n° pari di intersezioni) = punto ancora esterno
    c) semiretta incontra lati poligono (n° dispari di intersezioni) = punto interno

    quindi,
    determino se il punto sta sulla frontiera, così mi calcolo anche i coefficienti dei lati del poligono,
    se no allora invento una semiretta a caso, posso anche prendere sempre la stessa e sicuramente sto dentro ad uno dei tre casi sopracitati.

    Volendo generalizzare il problema si puo' pensare anche di controllare preventivamente se il punto sta sulla frontiera. E la cosa sarebbe banale:
    a- controllo se il punto e' uno dei vertici
    b- controllo per ciascun lato i-j l'uguaglianza dei due raapporti:
    (yi-yj)/(xi-xj) = (y-yj)/(x-xj)
    evidentemente se e' verificata l'uguaglianza allora il punto si trova sul lato i-j e termino qui il controllo di appartenenza del punto alla frontiera.

    Se tutti e due i precedenti controlli sono negativi allora il punto e' interno o esterno e quindi procedo a verificarne la sua posizione relativa.

    Qui potrei pensare di scegliere come semiretta quella passante per P e parallela all'asse x (verificndo prima che nessun vertice abbia stessa ascissa del punto) oppure una semiretta parallela a y (sempre previa verifica che nessuno dei vertici del poligono abbia stessa ordinata del punto).

    Ma nel caso in cui uno o piu vertici avessero stessa ascissa del punto si potrebbe pensare di controllare se l'ordinata del punto e' all'interno o all'esterno del range entro cui variano le ordinate (stesso discorso a coordinate invertite nel caso di y).. e cosi via dicendo.

    Oppure evitare tutte queste preventive menate e scegliere una retta passante per il punto P e per un punto prossimo al primo vertice e discosto da questo di una quantita piccolisisma. Soluzione gia pensata da ninja.

    Spero solo che in tartingia scriva qualcosa e lo renda pubblico qui.

    ciao


     
    Top
    .
  7. enrico..
        +1   -1
     
    .

    User deleted


    ma alla fine penso sia più semplice la soluzione di semiretta verticale o orizzontale con verifica rispettivamente dell'odinata o dell'ascissa dei vertici.

    aspettiamo news dal tartingia

    saluti
     
    Top
    .
  8. ninja turtle
        +1   -1
     
    .

    User deleted


    non conviene, ci ho pensato su ieri, grazie a un "provvidenziale" (grrr) ritardo ferroviario.

    supponiamo di aver risolto in qualche modo la questione del segno dell'angolo, e confrontiamo il metodo A (angoli) con il metodo I (intersezioni); per applicare il metodo I devo prima calcolare tutti i coefficienti angolari dei lati del poligono: trascuriamo questa fase, visto che la devo fare solo una volta, per tutti i punti di cui devo verificare la posizione.
    fatto questo, devo scegliere la semiretta: trascuriamo per ora anche il tempo necessario a svolgere questa fase.

    scelta la semiretta, devo verificare la presenza di intersezioni con i lati: come si svolge questa operazione? A me sembra che l'unica maniera sia calcolare l'intersezione con la retta che contiene il segmento, e verificare che il punto di intersezione stia tra i due vertici del lato: tale operazione è di complessità computazionale superiore a quella di calcolarmi l'angolo con il metodo A, e quindi possiamo supporre che sia equivalente a quella di calcolarmi pure il segno (supposizione da verificare, ovviamente).

    A questo punto i due metodi sarebbero equivalenti come tempo, ma c'è un ma: come effettuo la scelta della semiretta?
    è ovvio che posso fare un primo tentativo "semplice", orizzontale o verticale, e poi magari se non va bene affinarlo con il metodo da me proposto (pigliare un vertice, e poi spostarmi di un poco).
    Però, qualsiasi sia la scelta che faccio, essa impone una verifica che sia stata corretta, che si traduce in verificare che l'intersezione che calcolo sia diversa dagli estremi del lato, e quindi aumenta il numero di operazioni da compiere.

    Mi si impone anche la scelta di una strategia di "recupero": ovvero se la semiretta non è andata bene, come eseguo un nuovo tentativo?

    Ma soprattutto, all'aumentare del numero dei lati del poligono, diventa sempre più probabile "incocciare" in un vertice (notate che quando la matematica viene tradotta in programmazione, le intersezioni "esatte" non esistono, e si deve quindi introdurre delle tolleranze), il che mi rende (con poligoni di molti lati) conveniente impostare una strategia di eliminazione, fin da prima del primo tentativo, di tutte le angolazioni da evitare: tale strategia consiste nel calcolare gli angoli con tutti i vertici, e dunque ha una complessità computazione equivalente a quella dell'INTERO metodo A!

    Tutto questo è valido se supponiamo (come nel mio caso) di voler classificare come interni i punti sulla frontiera (il metodo A infatti non distingue, la somma degli angoli per un punto sulla frontiera fa ancora 360°), viceversa il metodo I potrebbe recuperare terreno (ma non molto: per escludere il caso sarebbe sufficiente controllare i singoli angoli, e verificare che non ce ne sia uno da 180°).

    Quindi resto dell'idea che il metodo A sarebbe più efficiente, oltre che più "pulito" come stesura del codice.
    Resta aperta però la questione teorica della determinazione del segno...

    Edited by ninja turtle - 21/6/2006, 11:30
     
    Top
    .
  9. gio..
        +1   -1
     
    .

    User deleted


    CITAZIONE (ninja turtle @ 21/6/2006, 11:16)
    non conviene, ci ho pensato su ieri, grazie a un "provvidenziale" (grrr) ritardo ferroviario.

    supponiamo di aver risolto in qualche modo la questione del segno dell'angolo, e confrontiamo il metodo A (angoli) con il metodo I (intersezioni); per applicare il metodo I devo prima calcolare tutti i coefficienti angolari dei lati del poligono: trascuriamo questa fase, visto che la devo fare solo una volta, per tutti i punti di cui devo verificare la posizione.
    fatto questo, devo scegliere la semiretta: trascuriamo per ora anche il tempo necessario a svolgere questa fase.

    scelta la semiretta, devo verificare la presenza di intersezioni con i lati: come si svolge questa operazione? A me sembra che l'unica maniera sia calcolare l'intersezione con la retta che contiene il segmento, e verificare che il punto di intersezione stia tra i due vertici del lato: tale operazione è di complessità computazionale superiore a quella di calcolarmi l'angolo con il metodo A, e quindi possiamo supporre che sia equivalente a quella di calcolarmi pure il segno (supposizione da verificare, ovviamente).

    A questo punto i due metodi sarebbero equivalenti come tempo, ma c'è un ma: come effettuo la scelta della semiretta?
    è ovvio che posso fare un primo tentativo "semplice", orizzontale o verticale, e poi magari se non va bene affinarlo con il metodo da me proposto (pigliare un vertice, e poi spostarmi di un poco).
    Però, qualsiasi sia la scelta che faccio, essa impone una verifica che sia stata corretta, che si traduce in verificare che l'intersezione che calcolo sia diversa dagli estremi del lato, e quindi aumenta il numero di operazioni da compiere.

    Mi si impone anche la scelta di una strategia di "recupero": ovvero se la semiretta non è andata bene, come eseguo un nuovo tentativo?

    Ma soprattutto, all'aumentare del numero dei lati del poligono, diventa sempre più probabile "incocciare" in un vertice (notate che quando la matematica viene tradotta in programmazione, le intersezioni "esatte" non esistono, e si deve quindi introdurre delle tolleranze), il che mi rende (con poligoni di molti lati) conveniente impostare una strategia di eliminazione, fin da prima del primo tentativo, di tutte le angolazioni da evitare: tale strategia consiste nel calcolare gli angoli con tutti i vertici, e dunque ha una complessità computazione equivalente a quella dell'INTERO metodo A!

    Tutto questo è valido se supponiamo (come nel mio caso) di voler classificare come interni i punti sulla frontiera (il metodo A infatti non distingue, la somma degli angoli per un punto sulla frontiera fa ancora 360°), viceversa il metodo I potrebbe recuperare terreno (ma non molto: per escludere il caso sarebbe sufficiente controllare i singoli angoli, e verificare che non ce ne sia uno da 180°).

    Quindi resto dell'idea che il metodo A sarebbe più efficiente, oltre che più "pulito" come stesura del codice.
    Resta aperta però la questione teorica della determinazione del segno...

    La semiretta con origine in P la possiamo fissare fissando il passaggio di essa per un secondo punto che chiamiamo Q.

    [b]Vedremo poi quale strategia adottare per fissare convenietemente Q [/b], intanto note le coordinate di P(x,y), di Q(Xo,Yo) e degli estremi i e j del segmento che costituisce il generico lato del poligono, e' facile determinare le coordinate di intersezione tra la retta PQ e la retta IJ (lo si potrebbe anche fare per via matriciale dato che si tratta di risolvere un sistema a due equazioni e due incognite) e noto il punto di intersezione che chiamo Z e' facile verificare con unica condizione logica se esso si trova dal lato Q nella semiretta PQ e internamente agli estremi IJ.

    La condizione che la semiretta non deve passare per nessuno dei vertici nasce dal fatto che esiste una possibilità, con punto P esterno, di indeterminazione della posizione di P rispetto al poligono. Nel caso generale, pertanto, il passaggio della semiretta per uno dei vertici del poligono costituisce una normale intersezione alla stessa stregua delle altre.

    image

    Se riuscissimo a filtrare a monte, mediante opportuna scelta di Q, la circostanza evidenziata nella figura sopra, quella segnata in rosso, che ci porta alla indeterminazione, allora potremmo trattare il passaggio per un vertice alla stessa stregua di una normale intersezione.

    Intanto che ci ragiono noto :
    - nel caso in cui il punto fosse interno, il passaggio della semiretta per un vertice costituisce normale intersezione
    - nel caso di punto esterno, il passaggio per un vertice costituisce "anomalia solo quando la semiretta risulta essere tangente al poligono. Ovviamente ho esteso il concetto di tangenza confidando nella vostra comprensione (non mi veine termine adatto al caso)
    - in questo ultimo caso noto che i vertici adiacenti a quello intersecato si trovano entrambi nello stesso semispazio rispetto alla semiretta.

    I casi pero' possono essere i piu' vari al crescere della complessità del poligono, potendo avere un vertice intercettato e successivamente due lati tagliati o ancora piu vertici intercettati in serie. Risulta pertanto fondamentale riuscire a filtrare all'inizio con opportuna scelta del punto Q i casi possibili.

    Anticipo adesso il fatto che posso gia individuare quattro rette che chiamerei Xmax, Xmin, Ymax Ymin che sarebbero poi i lati del rettangolo che circoscrive il poligono. Si puo fin da subito verificare se il punto si trova internamente o esternamente a tale rettangolo.
    Poi posso individuare altre due rette che chiamerei Xg e Yg passanti per il punto medio tra i vertici.
    Queste due rette dividono in 4 l'intero piano e sarebbe possibile vedere in quale dei quattro quadranti si trova il punto di cui si vuol conoscere la posizione relativa rispetto al poligono.
    Queste rette ausiliari ci potranno essere utili per la scelta del secondo punto Q della semiretta.


    Edited by gio.. - 21/6/2006, 13:32
     
    Top
    .
  10. gio..
        +1   -1
     
    .

    User deleted


    CITAZIONE (gio.. @ 21/6/2006, 13:18)
    CITAZIONE (ninja turtle @ 21/6/2006, 11:16)
    non conviene, ci ho pensato su ieri, grazie a un "provvidenziale" (grrr) ritardo ferroviario.

    supponiamo di aver risolto in qualche modo la questione del segno dell'angolo, e confrontiamo il metodo A (angoli) con il metodo I (intersezioni); per applicare il metodo I devo prima calcolare tutti i coefficienti angolari dei lati del poligono: trascuriamo questa fase, visto che la devo fare solo una volta, per tutti i punti di cui devo verificare la posizione.
    fatto questo, devo scegliere la semiretta: trascuriamo per ora anche il tempo necessario a svolgere questa fase.

    scelta la semiretta, devo verificare la presenza di intersezioni con i lati: come si svolge questa operazione? A me sembra che l'unica maniera sia calcolare l'intersezione con la retta che contiene il segmento, e verificare che il punto di intersezione stia tra i due vertici del lato: tale operazione è di complessità computazionale superiore a quella di calcolarmi l'angolo con il metodo A, e quindi possiamo supporre che sia equivalente a quella di calcolarmi pure il segno (supposizione da verificare, ovviamente).

    A questo punto i due metodi sarebbero equivalenti come tempo, ma c'è un ma: come effettuo la scelta della semiretta?
    è ovvio che posso fare un primo tentativo "semplice", orizzontale o verticale, e poi magari se non va bene affinarlo con il metodo da me proposto (pigliare un vertice, e poi spostarmi di un poco).
    Però, qualsiasi sia la scelta che faccio, essa impone una verifica che sia stata corretta, che si traduce in verificare che l'intersezione che calcolo sia diversa dagli estremi del lato, e quindi aumenta il numero di operazioni da compiere.

    Mi si impone anche la scelta di una strategia di "recupero": ovvero se la semiretta non è andata bene, come eseguo un nuovo tentativo?

    Ma soprattutto, all'aumentare del numero dei lati del poligono, diventa sempre più probabile "incocciare" in un vertice (notate che quando la matematica viene tradotta in programmazione, le intersezioni "esatte" non esistono, e si deve quindi introdurre delle tolleranze), il che mi rende (con poligoni di molti lati) conveniente impostare una strategia di eliminazione, fin da prima del primo tentativo, di tutte le angolazioni da evitare: tale strategia consiste nel calcolare gli angoli con tutti i vertici, e dunque ha una complessità computazione equivalente a quella dell'INTERO metodo A!

    Tutto questo è valido se supponiamo (come nel mio caso) di voler classificare come interni i punti sulla frontiera (il metodo A infatti non distingue, la somma degli angoli per un punto sulla frontiera fa ancora 360°), viceversa il metodo I potrebbe recuperare terreno (ma non molto: per escludere il caso sarebbe sufficiente controllare i singoli angoli, e verificare che non ce ne sia uno da 180°).

    Quindi resto dell'idea che il metodo A sarebbe più efficiente, oltre che più "pulito" come stesura del codice.
    Resta aperta però la questione teorica della determinazione del segno...

    La semiretta con origine in P la possiamo fissare fissando il passaggio di essa per un secondo punto che chiamiamo Q.

    [b]Vedremo poi quale strategia adottare per fissare convenietemente Q [/b], intanto note le coordinate di P(x,y), di Q(Xo,Yo) e degli estremi i e j del segmento che costituisce il generico lato del poligono, e' facile determinare le coordinate di intersezione tra la retta PQ e la retta IJ (lo si potrebbe anche fare per via matriciale dato che si tratta di risolvere un sistema a due equazioni e due incognite) e noto il punto di intersezione che chiamo Z e' facile verificare con unica condizione logica se esso si trova dal lato Q nella semiretta PQ e internamente agli estremi IJ.

    La condizione che la semiretta non deve passare per nessuno dei vertici nasce dal fatto che esiste una possibilità, con punto P esterno, di indeterminazione della posizione di P rispetto al poligono. Nel caso generale, pertanto, il passaggio della semiretta per uno dei vertici del poligono costituisce una normale intersezione alla stessa stregua delle altre.

    (IMG:http://img216.imageshack.us/img216/2734/aa4hu.th.jpg)

    Se riuscissimo a filtrare a monte, mediante opportuna scelta di Q, la circostanza evidenziata nella figura sopra, quella segnata in rosso, che ci porta alla indeterminazione, allora potremmo trattare il passaggio per un vertice alla stessa stregua di una normale intersezione.

    Intanto che ci ragiono noto :
    - nel caso in cui il punto fosse interno, il passaggio della semiretta per un vertice costituisce normale intersezione
    - nel caso di punto esterno, il passaggio per un vertice costituisce "anomalia solo quando la semiretta risulta essere tangente al poligono. Ovviamente ho esteso il concetto di tangenza confidando nella vostra comprensione (non mi veine termine adatto al caso)
    - in questo ultimo caso noto che i vertici adiacenti a quello intersecato si trovano entrambi nello stesso semispazio rispetto alla semiretta.

    I casi pero' possono essere i piu' vari al crescere della complessità del poligono, potendo avere un vertice intercettato e successivamente due lati tagliati o ancora piu vertici intercettati in serie. Risulta pertanto fondamentale riuscire a filtrare all'inizio con opportuna scelta del punto Q i casi possibili.

    Anticipo adesso il fatto che posso gia individuare quattro rette che chiamerei Xmax, Xmin, Ymax Ymin che sarebbero poi i lati del rettangolo che circoscrive il poligono. Si puo fin da subito verificare se il punto si trova internamente o esternamente a tale rettangolo.
    Poi posso individuare altre due rette che chiamerei Xg e Yg passanti per il punto medio tra i vertici.
    Queste due rette dividono in 4 l'intero piano e sarebbe possibile vedere in quale dei quattro quadranti si trova il punto di cui si vuol conoscere la posizione relativa rispetto al poligono.
    Queste rette ausiliari ci potranno essere utili per la scelta del secondo punto Q della semiretta.


    Penso di aver trovato una soluzione logica.

    Tolgo la limitazione iniziale che la semiretta non deve passare per nessuno dei vertici ma quando vado a determinare le intersezioni procedo come segue:

    - distinguo due tipi di intersezione:
    tipo 1: viene intercettato un lato.. sommo 1 al contatore delle intesezioni
    tipo 2: viene intercettato un vertice... procedo ad ulteriore controllo sui vertici adiacenti:

    tipo 2.1.. i due vertici adiacenti a quello intercettato si trovano nello stesso semispazio rispetto alla semiretta: non incremento il contatore
    tipo 2.2..i due vertici adiacenti a quello intercettato non si trovano nello stesso semispazio rispetto alla semiretta: incremento il contatore

    Fine
     
    Top
    .
  11. enrico..
        +1   -1
     
    .

    User deleted


    caxxo gio, però è un bel casino computazionale l'ultima verifica...(=da pensarci su un po')
     
    Top
    .
  12. ninja turtle
        +1   -1
     
    .

    User deleted


    CITAZIONE (gio.. @ 21/6/2006, 13:18)
    La condizione che la semiretta non deve passare per nessuno dei vertici nasce dal fatto che esiste una possibilità, con punto P esterno, di indeterminazione della posizione di P rispetto al poligono.

    eh, se così fosse tutto questo ambaradan non sarebbe necessario, prenderei come secondo punto per la semiretta il punto medio del primo lato e così mi assicuro che la semiretta non sarà mai tangente.

    in realtà possono esserci casi di sfiga assai peggiori, tipo quello di figura (punto interno con un numero pari di intersezioni).

    la soluzione potrebbe essere la seguente:
    considerare il vertice i-1 e i+1 rispetto a quello intersecato: se essi finiscono tutti e due sopra o sotto la semiretta, è una "tangenza" e dunque conta per 2, viceversa è un'intersezione vera e propria, e conta per 1. Questo mi consentirebbe di semplificare radicalmente il metodo, scegliendo sempre la semiretta orizzontale.

    ribadisco infatti che si vuole un metodo soprattutto ottimizzato per la velocità senza tante complicazioni (quadrato inscritto, rette ausiliarie, e così via: tutto tempo computazionale che non vorrei consumare)


    ODIO QUANDO MI CANCELLA IL MESSAGGIO!!!

    stavo dicendo, pare che siamo arrivati contemporaneamente alla stessa conclusione. La verifica di appartenenza allo stesso semispazio è banale, se la semiretta è di equazione
    ax+by+c=0
    per un punto che sta "sopra" vale ax+by+c>0, per uno che sta sotto <0

    meglio ancora, scelgo sempre la semiretta verticale, così elimino il caso "singolare" della più compatta notazione y=mx+q; un lato verticale non verrà mai intersecato, e può quindi essere ignorato: anche se il punto si trovasse proprio sul prolungamento di questo lato, e quindi avesse infinite intersezioni, basta ignorarlo e il pari-dispari funziona ancora)

    Edited by ninja turtle - 21/6/2006, 14:38
    Attached Image
    Image2.gif

     
    Top
    .
  13. gio..
        +1   -1
     
    .

    User deleted


    CITAZIONE (enrico.. @ 21/6/2006, 13:54)
    caxxo gio, però è un bel casino computazionale l'ultima verifica...(=da pensarci su un po')

    non credo.. ma devo pensarci sopra.

     
    Top
    .
  14. ninja turtle
        +1   -1
     
    .

    User deleted


    sulla retta y=mx+q
    nel semipiano sopra y>mx+q
    nel semipiano sotto y<mx+q

    ok, direi che la questione si può considerare risolta
     
    Top
    .
  15. gio..
        +1   -1
     
    .

    User deleted


    CITAZIONE (ninja turtle @ 21/6/2006, 14:23)
    CITAZIONE (gio.. @ 21/6/2006, 13:18)
    La condizione che la semiretta non deve passare per nessuno dei vertici nasce dal fatto che esiste una possibilità, con punto P esterno, di indeterminazione della posizione di P rispetto al poligono.

    eh, se così fosse tutto questo ambaradan non sarebbe necessario, prenderei come secondo punto per la semiretta il punto medio del primo lato e così mi assicuro che la semiretta non sarà mai tangente.

    in realtà possono esserci casi di sfiga assai peggiori, tipo quello di figura (punto interno con un numero pari di intersezioni).

    eheheh
    E' la dura legge di Murphy
    CITAZIONE (ninja turtle @ 21/6/2006, 14:23)
    la soluzione potrebbe essere la seguente:
    considerare il vertice i-1 e i+1 rispetto a quello intersecato: se essi finiscono tutti e due sopra o sotto la semiretta, è una "tangenza" e dunque conta per 2, viceversa è un'intersezione vera e propria, e conta per 1. Questo mi consentirebbe di semplificare radicalmente il metodo, scegliendo sempre la semiretta orizzontale.

    In buona ostanza e' la soluzione a cui avevo pensato io..

    CITAZIONE (ninja turtle @ 21/6/2006, 14:23)
    ribadisco infatti che si vuole un metodo soprattutto ottimizzato per la velocità senza tante complicazioni (quadrato inscritto, rette ausiliarie, e così via: tutto tempo computazionale che non vorrei consumare)


    ODIO QUANDO MI CANCELLA IL MESSAGGIO!!!

    stavo dicendo, pare che siamo arrivati contemporaneamente alla stessa conclusione. La verifica di appartenenza allo stesso semispazio è banale, se la semiretta è di equazione
    ax+by+c=0
    per un punto che sta "sopra" vale ax+by+c>0, per uno che sta sotto <0

    meglio ancora, scelgo sempre la semiretta verticale, così elimino il caso "singolare" della più compatta notazione y=mx+q; un lato verticale non verrà mai intersecato, e può quindi essere ignorato: anche se il punto si trovasse proprio sul prolungamento di questo lato, e quindi avesse infinite intersezioni, basta ignorarlo e il pari-dispari funziona ancora)

    Mi pare che adesso tutto torni.

    Io ho immaginato il viaggio di un punto mobile lungo una semiretta. Questo inizialmente si trova in uno stato OFF e cambiera il suo stato in ON ogni volta che incontrando un qualche ostacolo (sia esso segmento sia esso vertice) riesce a passare dall'altro lato dell'ostacolo.
    Quando incontra comeostacolo un punto di tangenza (nella accezione che stiamo intendendo) varierà il suo stato in ON solo se riesce a passare al di la della frontiera delimitata dai due lati che convergono in quel vertice. Chiaramente se lo stato fosse ON allora lo varierebbe in OFF.
    Quindi si puo pensare di attribuire uno stato iniziale al punto P (che viaggerà poi sulla semiretta PQ), se alla fine del suo viaggio lo stato permarra allora il punto e' esterno, altrimenti e' interno.

    ciao
     
    Top
    .
40 replies since 20/6/2006, 10:42   1711 views
  Share  
.