Newsgroup: it.comp.lang.pascal
Titolo: Calcolare un angolo

Sto implementando un componente che simuli la manopola del volume di uno
 stereo.
 Ho qualche problema con la parte matematica (io e la trigonometria non
 andiamo molto d'accordo). Qualcuno ha sottomano un algoritmo semplice che,
 date le coordinate del mouse, mi permetta di risalire all'angolo che c'è
tra
 il raggio che va dal cursore al centro e quello tra il centro e il punto
 inferiore della manopola?
 Come spiegazione è una schifezza, ma spero che qualcuno di buon cuore ci
 capisca!
 Grazie
 ============================
 Marco Caselli
 
http://members.tripod.com/dartclub
 Per rispondere togliere tutti i nove dall'indirizzo
 ============================

L'implementazione dipende dal tipo di funzione "arcotangente" di cui
disponi.
Se per esempio il risultato della funzione arcotangente e' tra -pi/2 e
+pi/2 allora puoi fare in questo modo :
date le coordinate del centro (cx, cy) e quelle del punto (a, b)
calcoli DeltaX = (a - cx) e DeltaY = (b - cy), dopodiche' calcoli la
tangente, ovvero t = DeltaY/DeltaX.
Ottieni il coefficiente angolare della retta che unisce il centro al
punto.
Vale quindi :
(t < 0) AND (DeltaX > 0) ALLORA angolo = arctan(t) + 3/2 * pi
(t < 0) AND (DeltaX < 0) ALLORA angolo = arctan(t) + pi/2 
(t > 0) AND (DeltaX > 0) ALLORA angolo = arctan(t)
(t > 0) AND (DeltaX < 0) ALLORA angolo = arctan(t) + pi
Spero di non aver sbagliato nulla.

Un bel di' PkC scrisse:
P> Sto implementando un componente che simuli la manopola del volume di uno
P>  stereo.
P>  Ho qualche problema con la parte matematica (io e la trigonometria non
P>  andiamo molto d'accordo). Qualcuno ha sottomano un algoritmo semplice che,
P>  date le coordinate del mouse, mi permetta di risalire all'angolo che c'è
P> tra
P>  il raggio che va dal cursore al centro e quello tra il centro e il punto
P>  inferiore della manopola?
P> 
se non ho capito male...
x = mouse.x
y = mouse.y
x0 ed y0 sono le coordinate del centro.
x := x - x0;
y := y - y0;
In questo modo, fingiamo che il centro sia nell'origine (0, 0)... i calcoli
risulteranno piu' semplici.
r = x^2 + y^2
Questa e' la distanza tra il punto e il centro
x/r ed y/r sono rispettivamente il coseno ed il seno dell'angolo.
Per calcolare l'angolo puoi fare cosi':
	angolo = arcos (x/r)
questo pero' restituisce un angolo del primo o del secondo quadrante,
non degli altri.
Ma se y/r e' negativo (e lo e' sse y < 0), allora l'angolo sta
rispettivamente nel quarto o nel terzo quadrante.
Dunque:
	if (y < 0) then
		angolo := -angolo;
Eventualmente, se vuoi un valore dell'angolo compreso tra 0 e 360,
devi:
- convertire l'angolo (cosi' e' in radianti)
	angolo := angolo / pi * 180;
- sommargli 360 se e' minore di 0 :-)
	if angolo < 0 then inc (angolo, 360);
Ciao ciao!
-- 
"Esistono solo errori", assioma di Robert
"L'errore di un uomo e' la certezza di un altro uomo", corollario di Berman
-- 
Emanuele Cesena
ami...@iol.it
 :)	Occhio all'antispammer NOSPAZ!!
http://www.geocities.com/SiliconValley/Grid/8879

	angolo = arcos (x/r)
Questo pero' se ha a disposizione una funzione arccos()

>	angolo = arcos (x/r)
AL> 
AL> Questo pero' se ha a disposizione una funzione arccos()
AL> 
Ovvio... senno' la si puo' sempre calcolare, conoscendo alcune altre...
(c'e' la funzione nell'help del Turbo C :) ).
Ciao!
-- 
"L'organizzazione di ogni burocrazia e' molto simile a una cloaca: i pezzi
piu' grossi emergono sempre", legge di Imhoff
