Newsgroup: it.comp.www.php
Titolo: Generare un punto nei "pressi" di un altro.

Buongiorno, ho la necessità di generare dei punti definiti da due
coordinate (un po come se fossero latitudide e longitudine) che siano
nelle vicinanze di punti generati precedentemente.
Ad esempio ammettendo che il primo punto sia (0,0) il secondo dovrà
discostarsi al massimo di un + o - 5 (quindi ad esempio 2,-4), il
terzo a sua volta dovrà trovarsi nelle vicinanze di entrambi, non solo
del secondo altrimenti rischio di discostarmi troppo dalla zona
iniziale nel giro di pochi punti senza averla riempita in maniera
soddisfacente.
Ora, la quantità di punti che devo generare è nell'ordine delle decine
di migliaia e devo fare in modo che si generino partendo da un punto e
procedendo allargandosi in maniera quanto più omogenea possibile e che
quindi riempiano gli spazi "più prossimi" al centro prima di
allargarsi.
I punti non devono inoltre essere generati tutti assieme ma un punto
alla volta (sarà un evento onclick).
Io ho qualche idea ma non sono convinto sopratutto dell'efficienza del
codice che ho in testa (pensavo a una cosa come caricare in un array i
valori presi dalla tabella del db e di fare dei controlli su questo
array per decidere dove generare il punto...)
Grazie anticipatamente.
Andrea

alla volta (sar� un evento onclick).
Decine di migliaia di eventi onclick? :-O
Leonardo
-- 
The cock doth craw, the day doth daw,
the channerin' worm doth chide:
gin we be mist oot o' oor place,
a sair pain we maun bide.

 Decine di migliaia di eventi onclick? :-O
Mai detto che debbano essere fatti dallo stesso utente. Quel che
intendo è che le coppie di numeri non devono essere generate tutte
immediatamente, bensì si genera un punto ogni volta che verrà
richiamata la funzione.

richiamata la funzione.
Un sistema, usando un DB, potrebbe essere quello di assegnare un punto ad
ogni punto gia' presente nell'archivio. Ogni volta che generi un punto ti
tocca di fare circa (3.2*N*N-1) inserimenti o update... spostando i punti
in un raggio N dal punto appena scelto da "vuoti" a "candidati" (ci sono,
quindi, tre stati: vuoto, candidato, attivo), e ogni volta selezionando i
punti in stato candidato.
Pero' ti serve avere in tabella con tutti i punti fin dall'inizio.
	CREATE TABLE punti (x integer, y integer, status integer);
	CREATE INDEX punti_ndx ON punti(status, x, y);
In pratica selezioni ogni nuovo punto con
	SELECT x, y FROM punti WHERE status = 1 ORDER BY RAND();       [*]
(la prima volta prendi x, y come ti pare)
e quando hai x, y lo marchi e selezioni i nuovi candidati:
	UPDATE punti SET status = 2 WHERE x=$x AND y=$y;
	UPDATE punti SET status = 1 WHERE ((x-$x)*(x-$x)+(y-$y)*(y-$y))<25
	AND status = 0;
Se la griglia e' molto grande si puo' pensare a campi partitori extra, ma
forse e' eccessivo.
Questo tipo di generazione tende a rinforzare l'effetto massa, per questo
ti ho chiesto se volevi modellare qualcosa. Se volessi modellare - giusto
per fare un esempio - la diffusione di una epidemia, va mediamente. Ma se
volessi modellare l'erosione di una lamina metallica, ti fa arrivare a un
risultato sbagliato. E per la diffusione di una diceria e' ottimo :-)
Leonardo
[*] in questo punto puoi aggiungere un bias geometrico, per esempio, come
    fattore moltiplicativo: RAND()*F(X,Y). Il fatto che i punti vuoti per
    stato abbiano 0 puo' tornare utile.


 allargarsi.
io procederei cos�
il primo punto ha coordinate (x,y)
la funzione per generare nuovi punti dovrebbe prendere 2 parametri
1) le coordinate del punto di riferimento (
2) Di quanto ogni punto si pu� discostare dal punto di riferimento.
Es.
primo punto ( x=500, y=500) ( id 1 in tabella )
per generare un secondo punto lanci
function ( 1, +-10 )
e cos� fai per i successivi N punti
dopo N punti incrementi la funzione prendendo come coordinate di 
riferimento i dati del 2 punto
function ( 2, +-10 )
ovviamente nel loop puoi cmq variare il valore +-10 a tuo piacimento.
con un totale di circa 3 parametri puoi quindi personalizzare la 
funzione in modo estremamente veloce.
saluti