Il Bar dell'Ingegneria

Smussiamo i poligoni

« Older   Newer »
 
  Share  
.
  1.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Member
    Posts
    2,939
    Reputation
    +187

    Status
    Offline
    Mi propongo di risolvere, in maniera migliore di quanto non abbia già fatto in passato, il problema di tener conto di spigoli 'smussati' presenti in un poligono, al fine di determinare, al solito, le caratteristiche geometriche o altro del poligono (non bisogna andare tanto lontano, basta pensare ad un profilo IPE/HEA/UPN).

    In pratica, così come in Autocad utilizziamo il comando 'fillet' (o 'raccorda' in italiano), dovremmo ottenere dal vertice 'puntuto' del nostro poligono, una cosa del genere:

    png

    Ora, siccome siamo abbastanza bravi a manipolare poligoni 'puntuti', in realtà non voglio sobbarcarmi l'onere di determinare aree, inerzie, ecc. considerando il raccordo circolare vero e proprio.
    Mi accontento di 'discretizzare' l'arco di cerchio in un numero finito di segmenti (magari definibile dall'utente, anzi senza il magari), così:

    png

    Diciamo che in partenza ho un paio di idee da inserire in questo topic, ma non sono ancora del tutto sicuro di riuscire a 'finalizzare' il tutto. Vedremo........
     
    Top
    .
  2.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Administrator
    Posts
    8,163
    Reputation
    +294

    Status
    Offline
    Quale deve essere l'input?
     
    Top
    .
  3.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Member
    Posts
    2,939
    Reputation
    +187

    Status
    Offline
    L'input dovrà essere 'per forza' il raggio del raccordo.

    Poi a mio avviso, anche per eseguire qualche controllo (tipo raggio troppo grande, ecc.), dovremmo indicare almeno i due segmenti di 'convergenza' al vertice, oppure le coordinate di tre punti: precedente al vertice da smussare-vertice da smussare-successivo al vertice da smussare.
     
    Top
    .
  4. UncleJack
        +1   -1
     
    .

    User deleted


    La struttura dei dati prevede un insieme di coordinate consecutive che rappresentano il poligono ?

    [Non ho ancora studiato le varie procedure presenti in questo forum, magari avete già delle convenzioni "assodate" - anch'io programmo da quando ho memoria, magari posso contribuire in qualche modo]
     
    Top
    .
  5.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Administrator
    Posts
    8,163
    Reputation
    +294

    Status
    Offline
    CITAZIONE (UncleJack @ 30/12/2013, 23:28) 
    La struttura dei dati prevede un insieme di coordinate consecutive che rappresentano il poligono ?

    [Non ho ancora studiato le varie procedure presenti in questo forum, magari avete già delle convenzioni "assodate" - anch'io programmo da quando ho memoria, magari posso contribuire in qualche modo]

    Nel caso dei poligoni, zax ha definito una sua struttura che include il numero dei vertici e due vettori contenenti le coordinate dei vertici. Poi ha esteso la struttura in esame includendo anche i campi relativi alle caratteristiche geometriche.

    Io invece uso una struttura composta da un unico vettore di dati strutturati. Il dato strutturato ingloba in se le due coordinate del generico punto.

    In VB io uso:

    CODICE
    Public Type TipoPunto
       x As Double
       y As Double
    End Type


    e

    CODICE
    dim Poligono() as Tipopunto


    Naturalmente tu potrai usare qualsiasi struttura a te pù congeniale.

    é anche naturale che il tuo contributo in qualsiasi discussione è più che gradito. Magari fossi arrivato prima!!!
     
    Top
    .
  6.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Member
    Posts
    2,939
    Reputation
    +187

    Status
    Offline
    Uncle, diciamo che nel passato ci siamo divertiti a creare qualche procedura proprio sui poligoni.
    Avendone fatte di cotte e di crude, possiamo pensare a tante alternative.

    Ad esempio afazio aveva creato la struttura dato 'segmento' a sua volta costituita da due strutture 'punto' annidate.

    Io dal canto mio ho sempre lavorato su queste cose con una struttura 'poligono' che contiene di fatto due vettori con le coordinate x,y di ogni vertice, ed il numero complessivo di vertici cui il poligono è costituito.

    Quindi sarà possibile passare alla funzione, semplici numeri che rappresentano le varie coordinate, strutture 'punto' ognuna delle quali rappresentante un vertice, strutture 'segmenti' (il precedente ed il successivo al vertice da smussare), oppure infine l'intero poligono e l'indice di quale vertice andrà smussato.

    Io ad esempio preferirei passare alla funzione l'intero poligono. La funzione a sua volta mi restituirà il poligono con un numero di vertici maggiorato e con i nuovi vertici del raccordo al posto giusto.

    Ma questi saranno poi dettagli implementativi, diciamo, successivi.
    Adesso devo prima sviluppare il ragionamento matematico.
     
    Top
    .
  7. UncleJack
        +1   -1
     
    .

    User deleted


    [OT - piccolino]
    Ho iniziato tempo fa a costruire la mia libreria sulla geometrica computazionale, è ancora embrionale ma usabile. Mi chiedo se abbia un senso estenderla, vista la presenza di librerie come la GPC (General polygon clipper).

    Avevo anche implementato l'integrazione di una funzione lungo la frontiera mediante Green. Poi mi sono occupato di altro, magari è ora di rispolverare un po' di materiale.
    [/OT]
     
    Top
    .
  8.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Member
    Posts
    2,939
    Reputation
    +187

    Status
    Offline
    CITAZIONE (UncleJack @ 30/12/2013, 23:41) 
    [OT - piccolino]
    Ho iniziato tempo fa a costruire la mia libreria sulla geometrica computazionale, è ancora embrionale ma usabile. Mi chiedo se abbia un senso estenderla, vista la presenza di librerie come la GPC (General polygon clipper).

    Avevo anche implementato l'integrazione di una funzione lungo la frontiera mediante Green. Poi mi sono occupato di altro, magari è ora di rispolverare un po' di materiale.
    [/OT]

    Vedi Uncle, stiamo ripercorrendo sentieri battuti, anzi battutissimi.
    E' vero che è possibile trovare dovunque tutto quello che ti serve, e materiale a bizzeffe....ma vuoi mettere??? Riuscire a fare tu quello che anche altri sono riusciti a fare?
     
    Top
    .
  9.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Administrator
    Posts
    8,163
    Reputation
    +294

    Status
    Offline
    CITAZIONE (zax2013 @ 30/12/2013, 23:40) 
    Ad esempio afazio aveva creato la struttura dato 'segmento' a sua volta costituita da due strutture 'punto' annidate.

    E' vero. Quando la cosa rende piu' agevole lo sviluppo del codice posso fare ricorso ad altre strutture come per esempio:

    CODICE
    Public Type TipoSegmento
       start As TipoPunto
       end As TipoPunto
    End Type


    ed in questo caso, dato che il raccordo sarà un arco di cerchio, potrebbe tornare utile la struttura:

    CODICE
    Public Type TipoCerchio
       centro As TipoPunto
       R As Double
    End Type


    oppure altra struttura, da definire meglio, che oltre ad avere il centro ed il raggio del cerchio abbia anche l'angolo di partenza e l'angolo di arrivo (o l'estensione angolare) dell'arco di raccordo.
     
    Top
    .
  10. UncleJack
        +1   -1
     
    .

    User deleted


    Troviamo in quale dei due semipiani individuati dal primo segmento giace il secondo vertice del secondo segmento, lì si troverà il centro del raccordo.

    Dovremmo riuscirci facendo il prodotto vettoriale dei due vettori, se è positivo sta a sinistra, se negativo a destra. Se è zero niente raccordo, i due vettori sono paralleli.

    In generale io preferisco lavorare con gerarchie di classi piuttosto che con strutture di dati più semplici, ma in effetti il codice prettamente algoritmico non cambia.
     
    Top
    .
  11.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Administrator
    Posts
    8,163
    Reputation
    +294

    Status
    Offline
    CITAZIONE (UncleJack @ 30/12/2013, 23:41) 
    [OT - piccolino]
    Ho iniziato tempo fa a costruire la mia libreria sulla geometrica computazionale, è ancora embrionale ma usabile. Mi chiedo se abbia un senso estenderla, vista la presenza di librerie come la GPC (General polygon clipper).

    Avevo anche implementato l'integrazione di una funzione lungo la frontiera mediante Green. Poi mi sono occupato di altro, magari è ora di rispolverare un po' di materiale.
    [/OT]

    In merito al clipping dei poligoni, ci siamo occupati anche noi, in un topic di cui non ricordo il titolo, della questione.

    Non siamo pervenuti a nulla di utilizzabile perchè stanchi ci siamo ritirati prima. Il semplice uso della libreria GPC (di cui ho pure trovato una versione in Delphi), non ci avrebbe fatto capire tante cose sul problema ed anche quando non abbiamo alla fine creato nulla di nostro, personalmente e penso anche zax, è bastato lo studio e l'approfondimento della problematica.
     
    Top
    .
  12. UncleJack
        +1   -1
     
    .

    User deleted


    Sono daccordo con te, sembra di rileggermi :-)
     
    Top
    .
  13.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Administrator
    Posts
    8,163
    Reputation
    +294

    Status
    Offline
    CITAZIONE (UncleJack @ 30/12/2013, 23:51) 
    Troviamo in quale dei due semipiani individuati dal primo segmento giace il secondo vertice del secondo segmento, lì si troverà il centro del raccordo.

    Dovremmo riuscirci facendo il prodotto vettoriale dei due vettori, se è positivo sta a sinistra, se negativo a destra. Se è zero niente raccordo, i due vettori sono paralleli.

    In generale io preferisco lavorare con gerarchie di classi piuttosto che con strutture di dati più semplici, ma in effetti il codice prettamente algoritmico non cambia.

    E se il raggio del raccordo è pari alla metà della distanza tra i due segmenti paralleli?
     
    Top
    .
  14. UncleJack
        +1   -1
     
    .

    User deleted


    Se ho capito bene la domanda, se sono paralleli e consecutivi non c'è motivo di raccordare. Se non sono consecutivi non si tratta di un poligono chiuso o perlomeno di una polilinea.

    Io sto interpretando che si possa semplicemente indicare un vertice e un raggio di raccordo, mi pare tu la stia vedendo più in generale.

    Sbaglio ?
     
    Top
    .
  15.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Member
    Posts
    2,939
    Reputation
    +187

    Status
    Offline
    CITAZIONE (afazio @ 30/12/2013, 23:56) 
    CITAZIONE (UncleJack @ 30/12/2013, 23:51) 
    Troviamo in quale dei due semipiani individuati dal primo segmento giace il secondo vertice del secondo segmento, lì si troverà il centro del raccordo.

    Dovremmo riuscirci facendo il prodotto vettoriale dei due vettori, se è positivo sta a sinistra, se negativo a destra. Se è zero niente raccordo, i due vettori sono paralleli.

    In generale io preferisco lavorare con gerarchie di classi piuttosto che con strutture di dati più semplici, ma in effetti il codice prettamente algoritmico non cambia.

    E se il raggio del raccordo è pari alla metà della distanza tra i due segmenti paralleli?

    Non dimenticare afazio che c'è sempre un vertice tra due segmenti consecutivi del poligono. Ed il caso di vertice all'infinito non lo abbiamo mai affrontato.
    Invece se ricordi abbiamo trattato diffusamente il problema del 'peduncolo' (due segmenti consecutivi e sovrapposti).
     
    Top
    .
35 replies since 30/12/2013, 23:17   1417 views
  Share  
.