Newsgroup: it.comp.lang.visual-basic
Titolo: Algoritmo

Qualcuno sa un'algoritmo che permetta di sapere se il mouse ha clikkato
dentro un area racchiusa da una serie di vertici disposti in qualsiasi
modo.(un esempio di area potrebbe essere quella di una T)
Grazie
Marcus

...

Una volta capito che il punto e' interno al piu' piccolo rettangolo che
racchiude l'area dovresti calcolare le intersezioni tra la retta orizzontale
che passa su quel punto e tutti i segmenti del poligono. Se a destra del tuo
punto il numero di intersezioni e' dispari sei all'interno del poligono.
Attenzione ai lati orizzontali!
Ciao.

Un modo piuttosto banale (e non efficiente) per risolvere il problema
è il seguente:
i vertici se presi a coppie formano dei segmenti di retta nel piano,
noti ( i segmenti) nella loro forma analitica. Prendi le equazioni di tutte
le rette e poi forma un sistema di disequazioni dove la intersezione
tra la loro validità (quando sono >= 0) sia proprio l'area che ti
serve intercettare. Se il punto (x,y) del mouse soddisfa tale sistema
allora significa che il click è avvenuto all'interno.
Questa tecnica vale se il poligono descritto dalle rette è convesso:
le concavità devi trattarle come casi particolari. Altrimenti cerca in
rete le intersezioni tra poligoni.
Spero di averti dato qualche idea. Buon Lavoro, Davide.







...


Questo lavoro potresti farlo anche con chiamate API. Esiste una funzione
PtInregion che determina se un punto è interno o esterno ad una regione di
ritaglio (nel tuo caso il poligono). La cosa funziona bene con i
rettangoli un po' meno con i poligoni con un numero di vertici > 4 (sempre
meglio comunque del metodo senza chiamate API). Il tuo poligono devi
crearlo con la funzione API 
CreatePolygonRgn.
Declare Function CreatePolygonRgn& Lib "gdi32" (lpPoint As POINTAPI, ByVal
_
nCount As Long, ByVal nPolyFillMode As Long)
Description
Creates a region out of an arbitrary series of points. Windows
automatically closes the polygon by connecting the last and first points if
necessary.
Parameter	Type/Description
lpPoint	POINTAPI—The first POINTAPI structure in an array of nCount
POINTAPI structures.
nCount	Long—Number of points in the polygon.
nPolyFillMode	Long—Describes the polygon filling mode. May be either the
ALTERNATE=1 or the WINDING=2 constant.
Return Value
Long—The handle of the region created, or zero on error.
Comments
Be sure to delete the region with the DeleteObject function when it’s no
longer needed.
 ---------------------------------------------------------------------------
-----------
Declare Function PtInRegion& Lib "gdi32" (ByVal hRgn As Long, ByVal x As
Long, _
ByVal y As Long)
Description
Determines if a point is in a specified region.
Parameter	Type/Description
hRgn	Long—Handle to a region.
x	Long—X coordinate of a point in logical coordinates.
y	Long—Y coordinates of a point in logical coordinates.
Return Value
Long—True (nonzero) if the point is in the region, zero otherwise.
 ---------------------------------------------------------------------------
--------------------------------------------
Declare Function DeleteObject& Lib "gdi32" (ByVal hObject As Long)
Description
This function is used to delete GDI objects such as pens, brushes, fonts,
bitmaps, regions, and palettes. All system resources used by the object are
released.
Parameter	Type/Description
hObject	Long— Handle della tua regione
Return Value
Long—Nonzero on success, zero on failure.
Commento
Questa funzione va chiamata nell'evento unload della tua form.
Ciao Marco
-- 
Remove xxx from E-mail.

...


...
