Gambas-it

Gambas3 => Programmazione => Topic aperto da: Golia - 27 Gennaio 2011, 16:55:26

Titolo: [Risolto] Intercettare coordinate di una linea in drawingarea
Inserito da: Golia - 27 Gennaio 2011, 16:55:26
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
Titolo: Re: Intercettare coordinate di una linea in drawingarea
Inserito da: fsurfing - 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
Titolo: Re: Intercettare coordinate di una linea in drawingarea
Inserito da: Golia - 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
Titolo: Re: Intercettare coordinate di una linea in drawingarea
Inserito da: fsurfing - 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
Titolo: Re: Intercettare coordinate di una linea in drawingarea
Inserito da: Golia - 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..

Titolo: Re: Intercettare coordinate di una linea in drawingarea
Inserito da: Golia - 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
Titolo: Re: Intercettare coordinate di una linea in drawingarea
Inserito da: Golia - 29 Gennaio 2011, 00:57:40
Funziona alla grande nella drawingarea :-*
Ciao grazie
Titolo: Re: [Risolto] Intercettare coordinate di una linea in drawingarea
Inserito da: Golia - 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?
Titolo: Re: [Risolto] Intercettare coordinate di una linea in drawingarea
Inserito da: Taurus dei miracoli - 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:
Titolo: Re: [Risolto] Intercettare coordinate di una linea in drawingarea
Inserito da: Golia - 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
Titolo: Re: [Risolto] Intercettare coordinate di una linea in drawingarea
Inserito da: Taurus dei miracoli - 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
Titolo: Re: [Risolto] Intercettare coordinate di una linea in drawingarea
Inserito da: Golia - 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:
Titolo: Re: [Risolto] Intercettare coordinate di una linea in drawingarea
Inserito da: Golia - 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:
Titolo: Re: [Risolto] Intercettare coordinate di una linea in drawingarea
Inserito da: Taurus dei miracoli - 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:
Titolo: Re: [Risolto] Intercettare coordinate di una linea in drawingarea
Inserito da: fsurfing - 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?
Titolo: Re: [Risolto] Intercettare coordinate di una linea in drawingarea
Inserito da: Ceskho - 30 Gennaio 2011, 18:58:00
giusto per curiosità hai provato a vedere la memoria occupata dal tuo programma di prova con un array da 10.000.000 di punti?

Basta fare un calcolo veloce...se ogni intero occupa 16 bit e gli interi sono 10 milioni allora saranno 160 milioni di bit ...ovvero 20 milioni di byte ovvero circa 20 Megabyte (poco più di 19 in realtà)....ad occhio e croce...questo solo per le variabili in questione....
Titolo: Re: [Risolto] Intercettare coordinate di una linea in drawingarea
Inserito da: fsurfing - 30 Gennaio 2011, 19:06:15
ma a me interessava verificare che effettivamente il consumo di ram del programma fosse quello che ci si aspettava..per quello chiedevo di controllare la memoria occupata
Titolo: Re: [Risolto] Intercettare coordinate di una linea in drawingarea
Inserito da: Golia - 30 Gennaio 2011, 22:29:53
Come faccio a misurare?
La prova che ho fatto è semplice
Codice: gambas [Seleziona]
Public Sub Button1_Click()

  Dim coord As New Float[]
 
  Dim Nx As Integer
 
        For Nx = 0 To 10000000
           coord.Add(12345)
        Next 
       
       Message(coord[9999999], "ok")
End

Dite che diventa pesante il discorso?
Titolo: Re: [Risolto] Intercettare coordinate di una linea in drawingarea
Inserito da: Taurus dei miracoli - 31 Gennaio 2011, 17:00:48
ma a me interessava verificare che effettivamente il consumo di ram del programma fosse quello che ci si aspettava..per quello chiedevo di controllare la memoria occupata

per rispondere a questa domanda potresti lanciare la tua procedura e vedere la lettura della ram che ti fa Uextras di vaillant86 che trovi nei progetti in cerca di aiuto.
così rispondi a fsurfing e testi il programma di vaillant86. :2birre:
Titolo: Re: [Risolto] Intercettare coordinate di una linea in drawingarea
Inserito da: fsurfing - 31 Gennaio 2011, 19:33:24
oppure utilizzi il classico taskmanager ...
Titolo: Re: [Risolto] Intercettare coordinate di una linea in drawingarea
Inserito da: Golia - 02 Febbraio 2011, 23:30:49
Questo è il risultato del monitor di sistema
Titolo: Re: [Risolto] Intercettare coordinate di una linea in drawingarea
Inserito da: Taurus dei miracoli - 04 Febbraio 2011, 08:31:59
Questo è il risultato del monitor di sistema

Ad occhio sembrerebbe che durante l'elaborazione utilizzi CPU ma la RAM resti tutto sommato inalterata nonostante si carica un'array di grandi dimensioni.
Probabilmente il conto che faceva Ceskho è corretto...
...come al solito ;D