Autore Topic: [Risolto] Intercettare coordinate di una linea in drawingarea  (Letto 2275 volte)

Offline Golia

  • Senatore Gambero
  • ******
  • Post: 1.298
  • no xe mai massa tardi
    • Mostra profilo
Avete qualche idea di come potrei fare per intercettare le coordinate di una linea disegnata in una drawingarea, col puntatore del mouse? Tipo la calamita di fine linea presente in tanti cad.

Grazie
« Ultima modifica: 29 Gennaio 2011, 00:58:04 da Golia »

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.482
    • Mostra profilo
Re: Intercettare coordinate di una linea in drawingarea
« Risposta #1 il: 27 Gennaio 2011, 19:15:42 »
dipende, se vuoi intercettare la griglia, basta sapere con che passo hai realizzato la griglia e quindi alla pressione del mouse controlli se sei vicino a un determinata griglio o meno .


se invece vuoi intercettare un liea disegnata dovresti per ogni linea o parte di disegno memorizzarne la posizione oppure lo spazio occupato .

io in elettricad ero riuscito a risolvere abbastanza bene il problema , peccato che però la versione di gambas con cui è programmato lo renda incompatibile con l' attuale e quindi non si riesce a capire bene come funziona

Offline Golia

  • Senatore Gambero
  • ******
  • Post: 1.298
  • no xe mai massa tardi
    • Mostra profilo
Re: Intercettare coordinate di una linea in drawingarea
« Risposta #2 il: 27 Gennaio 2011, 22:54:45 »
Citazione
io in elettricad ero riuscito a risolvere abbastanza bene il problema , peccato che però la versione di gambas con cui è programmato lo renda incompatibile con l' attuale e quindi non si riesce a capire bene come funziona
infatti ho provato a vedere come avevi fatto ma non riesco a farlo andare.
Agganciare il punto alla griglia lo devo scartare perchè potri avere anche dei decimali.
Forse la soluzione è come dici tu, memorizzando la posizione. In relatà ogni linea viene memorizzata per rigenerare il disegno ad ogni zoom o spostamento, un pò come avevi fatto tu con elettricad ;)
Supponiamo che io salvo tutti i punti in un'array e ho questo risultato

10,0
10,10
20,10
20,0
20,10
30,10

e con un punto del mouse mi restituisce
19,8
come posso ricercare il punto più vicino che sarebbe 20,10 cercando in tutti i dati dell'array?

ciao grazie

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.482
    • Mostra profilo
Re: Intercettare coordinate di una linea in drawingarea
« Risposta #3 il: 28 Gennaio 2011, 19:53:39 »
se parliamo di punti il metodo + veloce è di calcolare la distanza(in questo caso basta un differenza) e poi ordinarli in ordine crescente e quindi "bloccare " la posizione del mouse su quel punto

Offline Golia

  • Senatore Gambero
  • ******
  • Post: 1.298
  • no xe mai massa tardi
    • Mostra profilo
Re: Intercettare coordinate di una linea in drawingarea
« Risposta #4 il: 28 Gennaio 2011, 22:45:34 »
Non riesco a capire.. :hatecomputer: scusami ma le coordinate mi mettono una confusione pazzesca
mi sembra di avere la soluzione in mano ma non riesco ad applicarla   :hard:
provo a ragionarci ancora..


Offline Golia

  • Senatore Gambero
  • ******
  • Post: 1.298
  • no xe mai massa tardi
    • Mostra profilo
Re: Intercettare coordinate di una linea in drawingarea
« Risposta #5 il: 29 Gennaio 2011, 00:15:58 »
Grazie fsurfing  :ok:
Non l'ho ancora applicata alla drawingarea, ma dovrebbe essere circa così:
Codice: gambas [Seleziona]

Public Sub calc()
  Dim coord As New Float[] ' contenitore di coordinate: x = pari , y = dispari
 
  Dim Nx As Integer
  Dim mx As Float
  Dim my As Float

  Dim puntomousex As Float = 18  ' punto x del mouse
  Dim puntomousey As Float = 12  ' punto y del mouse

  Dim distminore As Float = 5
  Dim puntotrovato As Integer

' carico delle coordinate per provare

coord.Add(10)
coord.Add(0)

coord.Add(10)
coord.Add(10)

coord.Add(20)
coord.Add(10)

coord.Add(20)
coord.Add(0)

coord.Add(20)
coord.Add(10)

coord.Add(30)
coord.Add(10)

        For Nx = 0 To coord.Max
           mx = coord[Nx]
           Nx += 1
           my = coord[Nx]
           If Sqr(((puntomousex - mx) ^ 2) + ((puntomousey - my) ^ 2)) < distminore Then
               puntotrovato = Nx - 1
           Endif
        Next   
             
 Message(coord[puntotrovato] & "," & coord[puntotrovato + 1], "ok")

End

Offline Golia

  • Senatore Gambero
  • ******
  • Post: 1.298
  • no xe mai massa tardi
    • Mostra profilo
Re: Intercettare coordinate di una linea in drawingarea
« Risposta #6 il: 29 Gennaio 2011, 00:57:40 »
Funziona alla grande nella drawingarea :-*
Ciao grazie

Offline Golia

  • Senatore Gambero
  • ******
  • Post: 1.298
  • no xe mai massa tardi
    • Mostra profilo
Re: [Risolto] Intercettare coordinate di una linea in drawingarea
« Risposta #7 il: 29 Gennaio 2011, 10:56:11 »
Un dubbio!
Mettere i dati in un'array penso non vada bene, non so quanto può contenere un'array, ci potrebbero essere centinaia e centinaia di punti in un disegno.
Che contenitore mi consigli di usare per rendere la lettura e scrittura veloce?

Offline Taurus dei miracoli

  • Maestro Gambero
  • ****
  • Post: 334
  • In omnia pericula tasta testicula
    • Mostra profilo
Re: [Risolto] Intercettare coordinate di una linea in drawingarea
« Risposta #8 il: 29 Gennaio 2011, 11:49:02 »
Un dubbio!
Mettere i dati in un'array penso non vada bene, non so quanto può contenere un'array, ci potrebbero essere centinaia e centinaia di punti in un disegno.
Che contenitore mi consigli di usare per rendere la lettura e scrittura veloce?

Se cerchi la velocità di lettura e scrittura l'array è la soluzione migliore perchè usa la CPU e la RAM e quindi memoria superveloce.
Se è un problema di dimensioni la cosa è diversa, ma bisogna sicuramente rinunciare alla velocità dell'array.
Puoi fare una prova con un db ma, se la memoria ti regge un array, mi sembra inutile.
 :2birre:
"penso spesso ad acquiloni,
a grandi imprese,
ad una thailandese...
...ma l'impresa eccezionale,
dammi retta,
è essere normale"
(L. Dalla)

Offline Golia

  • Senatore Gambero
  • ******
  • Post: 1.298
  • no xe mai massa tardi
    • Mostra profilo
Re: [Risolto] Intercettare coordinate di una linea in drawingarea
« Risposta #9 il: 29 Gennaio 2011, 12:43:57 »
Si, l'unico dubbio è che l'array non ce la faccia a contenere centinaia se non anche migliaia di dati, in un disegno i punti possono essere una miriade. In una discussione mi sembrava che l'array avesse un limite

Offline Taurus dei miracoli

  • Maestro Gambero
  • ****
  • Post: 334
  • In omnia pericula tasta testicula
    • Mostra profilo
Re: [Risolto] Intercettare coordinate di una linea in drawingarea
« Risposta #10 il: 29 Gennaio 2011, 13:00:05 »
Non conosco se esistono limiti, ma ho trovato questo riferito al C++:
Il primo limite (non dovrebbe mai essere raggiunto) è fissato dalle restrizioni del tipo di formato utilizzato per descrivere un indice nella matrice (e le dimensioni della stessa). È dato dal valore massimo del sistema std::size_t può assumere. Questo tipo di dati deve sempre essere il tipo più grande di un intero sistema.

Poichè Gambas deriva da C credo che si possano applicare le stesse regole.
Percui se tu definisci un'array aperta (senza limiti) e usi delle variabili di controllo di tipo long e non dovresta avere problemi.
Poi, se vuoi, puoi farti in piccolo applicativo con incremento di entrambi i valori e vedi a quale punto ti da l'errore (se te lo da').
Ciao
"penso spesso ad acquiloni,
a grandi imprese,
ad una thailandese...
...ma l'impresa eccezionale,
dammi retta,
è essere normale"
(L. Dalla)

Offline Golia

  • Senatore Gambero
  • ******
  • Post: 1.298
  • no xe mai massa tardi
    • Mostra profilo
Re: [Risolto] Intercettare coordinate di una linea in drawingarea
« Risposta #11 il: 29 Gennaio 2011, 13:38:50 »
Giusto, grazie
Faccio una funzione che carica tot numero in un'array così vedo come va.
Ti faccio sapere grazie  :2birre:
« Ultima modifica: 29 Gennaio 2011, 14:00:48 da Golia »

Offline Golia

  • Senatore Gambero
  • ******
  • Post: 1.298
  • no xe mai massa tardi
    • Mostra profilo
Re: [Risolto] Intercettare coordinate di una linea in drawingarea
« Risposta #12 il: 29 Gennaio 2011, 14:00:57 »
Perfetto, ho fatto una prova e si può caricare tutto quello che si vuole  ;)
con  10.000.000 di elementi il mio pc ci mette circa 7-8 secondi, più che sufficente, con 1.000 è praticamente instantaneo
Grazie  :2birre: :2birre:

Offline Taurus dei miracoli

  • Maestro Gambero
  • ****
  • Post: 334
  • In omnia pericula tasta testicula
    • Mostra profilo
Re: [Risolto] Intercettare coordinate di una linea in drawingarea
« Risposta #13 il: 29 Gennaio 2011, 14:30:09 »
Perfetto, ho fatto una prova e si può caricare tutto quello che si vuole  ;)
con  10.000.000 di elementi il mio pc ci mette circa 7-8 secondi, più che sufficente, con 1.000 è praticamente instantaneo
Grazie  :2birre: :2birre:

Good :ok:
"penso spesso ad acquiloni,
a grandi imprese,
ad una thailandese...
...ma l'impresa eccezionale,
dammi retta,
è essere normale"
(L. Dalla)

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.482
    • Mostra profilo
Re: [Risolto] Intercettare coordinate di una linea in drawingarea
« Risposta #14 il: 30 Gennaio 2011, 18:46:20 »
giusto per curiosità hai provato a vedere la memoria occupata dal tuo programma di prova con un array da 10.000.000 di punti?