Newsgroup: it.comp.lang.visual-basic
Titolo: [?] Algoritmo calcolo angolo tra 2 vettori

Salve a tutti
Sto realizzando una procedura per generare dei poligoni a partire da linee
consecutive. Ogni linea puň appartenere a piů poligoni adiacenti.
Sapete se c'č del codice di esempio su tale argomento?
In alternativa ho provato a suddividere il problema in diverse parti. Ora
sto provando a realizzare un algoritmo per riuscire a calcolare l'angolo tra
le 2 linee risultanti dall'unione di 3 vertici (x1,y1; x2,y2; x3, y3),
calcolato in senso orario. Avete qualche suggerimento?
Grazie
Chicco

 
mmmh...
allora, rispolveriamo le conoscenze del 4o liceo scientifico (che poi non 
sono tanto lontane, visto che mi sono maturato nel luglio scorso :-) )...
 
          ^
          |     \ /
          |      X 
          |     /g\ 
          |    /   \
          |   /     \     
          |  /a      \ b
----------+-/---------\---->
          |/           \
          /             \
          |
          |
  g = a - b
a sua volta
  tg(g)=tg(a-b)=(tg(b)-tg(a))/(1+tg(a)*tg(b))
dall'equazione della retta passante per (x1,y1) e (x2,y2), considerando 
quest'ultimo il punto di incontro dei due vettori:
 
  (x-x1)/(x2-x1)=(y-y1)/(y2-y1)
prendo il coefficiente angolare, che poi sarebbe tg(a)
  tg(a)=(y2-y1)/(x2-x1)
analogo discorso per tg(b)
  tg(b)=(y3-y2)/(x3-x2)
da notare che se tg(a)*tg(b)=-1 [quindi tg(a)=-1/tg(b)] il denominatore di 
tg(gamma) è 0, quindi l'angolo è retto (pi/2).
ora... tra due rette infatti si formano quattro angoli, a due a due uguali.
la funzione arcotangente restituisce solo l'angolo acuto (il minore). 
L'altro angolo (ottuso) è il supplementare del primo, quindi angolo2=pi-
angolo1 (oppure in gradi angolo2=180-angolo1). scegliere quale dei due 
usare, però, è la cosa più difficile da fare, e ancora di più da 
spiegare...
allora:
  A=(x1,y1)
  V=(x2,y2)
  B=(x3,y3)
             B
            /
           /
          /
A'-------V---------A
ho segnato nel "disegno" anche il simmetrico di A rispetto a V, A'.
le sue coordinate sono:
  A'=(2*x2-x1,2*y2-y1)
ora, se la distanza AB è maggiore di A'B, l'angolo da considerare è quello 
ottuso, altrimenti quello acuto.
ricordo che:
  AB=sqr((x1-x3)^2+(y1-y3)^2)
e lo stesso ragionamento vale per A'B.
il codice, quindi (finalmente!!!)...
'*** Inizio codice ***
private const pi=3.1415 'eccetera eccetera
'[...]
dim tga as single, tgb as single, angolo as single
dim AB as single, A1B as single, x4 as single, y4 as single
tga=(y2-y1)/(x2-x1)
tgb=(y3-y2)/(x3-x2)
if tga*tgb=-1 then
  angolo=pi/2
else
  angolo=abs(atan((tg(b)-tg(a))/(1+tg(a)*tg(b))))
  'prendo il modulo dell'arcotangente perché tale funzione restituisce 
  'un arco orientato, mentre a me serve solo il valore assoluto
end if
x4=2*x2-x1
y4=2*y2-y1
AB=sqr((x1-x3)^2+(y1-y3)^2)
A1B=sqr((x4-x3)^2+(y4-y3)^2)
if AB>A1B then angolo=pi-angolo
'adesso angolo è il valore in radianti,
'se lo vuoi in gradi:
angolo=180*angolo/pi
'*** Fine codice ***
spero di essere stato chiaro (e di non aver sbagliato nulla!!! :-) )...
Ignazio

 Salve a tutti

anzi!!!
per il teorema di carnot:
detti i tre punti A, B e C e volendo calcolare l'angolo in A:
  A=(x1,y1)
  B=(x2,y2)
  C=(x3,y3)
  AB^2=(x1-x2)^2+(y1-y2)^2
  BC^2=(x3-x2)^2+(y3-y2)^2
  AC^2=(x1-x3)^2+(y1-y3)^2
  cos(a)=(AC^2+AB^2-BC^2)/2
in codice
  dim a2 as single, b2 as single, c2 as single, angolo as single
 
  a2=(x3-x2)^2+(y3-y2)^2
  b2=(x1-x3)^2+(y1-y3)^2
  c2=(x1-x2)^2+(y1-y2)^2
  angolo=acos((b2+c2-a2)/2))
anche questo č in radianti (ovviamente)
dicevo che era troppo lungo... :-)
Chiaro?
Ignazio

 Sapete se c'è del codice di esempio su tale argomento?
Tutto molto bello, ma ne vale la pena? Windows mette a disposizione le
Region proprio per gestire i poligoni, e per definire una region basta un
array di coordinate dei vertici (che tu devi già avere se hai i segmenti che
compongono i poligoni).
Prova a dare una occhiata qui (oggi sei già il secondo che ci mando... :-))
http://www.ilook.fsnet.co.uk/vb/vbshape.htm
Ciao
*Roby*