Holas tengo unas imagenes como estas:
(http://s2.subirimagenes.com/otros/previo/thump_6374555circulo.jpg) (http://www.subirimagenes.com/otros-circulo-6374555.html)
(http://s2.subirimagenes.com/otros/previo/thump_6374537circulo2.jpg) (http://www.subirimagenes.com/otros-circulo2-6374537.html)
tienen un punto azul en un lugar,debo hallar el angulo (0 - 360) en que se encuentran los puntos azules,en la primera parece mas o menos 280 grados, en la segunda imagen se puede sacar que el angulo es 90 con solo mirar, por ahora hice un codigo que usa el api get pixel para buscar el punto azul y me devuelven el x,y donde se encuentra el punto, ¿que funcion o formula podria usar para obtener el angulo a partir de esas coordenadas en VB 6.0?
Option Explicit
Public Const DegreeToRadian As Single = 0.0174532925
Sub main()
MsgBox DegreeToRadian * Engine_GetAngle(50, 22, 67, 33)
End Sub
Public Function Engine_GetAngle(ByVal CenterX As Integer, ByVal CenterY As Integer, ByVal TargetX As Integer, ByVal TargetY As Integer) As Single
Dim SideA As Single
Dim SideC As Single
On Error GoTo ErrOut
'Check for horizontal lines (90 or 270 degrees)
If CenterY = TargetY Then
'Check for going right (90 degrees)
If CenterX < TargetX Then
Engine_GetAngle = 90
'Check for going left (270 degrees)
Else
Engine_GetAngle = 270
End If
'Exit the function
Exit Function
End If
'Check for horizontal lines (360 or 180 degrees)
If CenterX = TargetX Then
'Check for going up (360 degrees)
If CenterY > TargetY Then
Engine_GetAngle = 360
'Check for going down (180 degrees)
Else
Engine_GetAngle = 180
End If
'Exit the function
Exit Function
End If
'Calculate Side C
SideC = Sqr(Abs(TargetX - CenterX) ^ 2 + Abs(TargetY - CenterY) ^ 2)
'Side B = CenterY
'Calculate Side A
SideA = Sqr(Abs(TargetX - CenterX) ^ 2 + TargetY ^ 2)
'Calculate the angle
Engine_GetAngle = (SideA ^ 2 - CenterY ^ 2 - SideC ^ 2) / (CenterY * SideC * -2)
Engine_GetAngle = (Atn(-Engine_GetAngle / Sqr(-Engine_GetAngle * Engine_GetAngle + 1)) + 1.5708) * 57.29583
'If the angle is >180, subtract from 360
If TargetX < CenterX Then Engine_GetAngle = 360 - Engine_GetAngle
'Exit function
Exit Function
'Check for error
ErrOut:
'Return a 0 saying there was an error
Engine_GetAngle = 0
Exit Function
End Function
gracias me sirvio de mucho.
.
El angulo se calcula con estas dos formulas...
x = d * sin(grados)
y = d * cos(grados)
Donde ( d = Distancia entre dos puntos )
d = RaizCuadrada( (x1-x2)(x1-x2) + (y1-y2)(y1-y2) ) // Se puede omitir la raíz...
Calculando los grados:
Sustituyendo y haciendo una sola ecuación con dos incógnitas...
d = x/sin(grados) // despejando a d de la 1ra ecuación para sustituirla en la 2da.
y = (x/sin(grados)) * cos(grados)
y = (x*cos(grados))/sin (grados) // aplicando la identidad trigonométrica cos(x)/sin(x) = cot(x)
y = x * Cot(grados)
Calculando los grados:
grados = arctan(y/x) // con esta formula sabes los grados entre dos puntos dados.
El angulo sera entre 0 a 180 para saber si es mayor tienes que hacer una comparación con el eje X o Y según desees; mira este enlace tuve el mismo problema solo que en coordenadas 3D:
http://foro.elhacker.net/foro_libre/ayuda_matematica-t324169.0.html;msg1600888#msg1600888
Si tienes dudas: http://es.wikipedia.org/wiki/Identidades_trigonométricas
Espero no tenga horrores... los grados los da en sentido horario empesgando como en el reloj de maesillas a las 12 coo los 0 grados, con unos ajustes se puede corregir esto lo haria yo pero ya no tengo tiempo.
Option Explicit
Public Function GetAngle2Points(ByVal x1 As Long, ByVal y1 As Long, ByVal x2 As Long, ByVal y2 As Long) As Double
GetAngle2Points = GetAngleXY((x2 - x1), (y2 - y1))
End Function
Public Function GetAngleXY(ByVal x As Double, ByVal y As Double) As Double
Dim dblres As Double
dblres = 0
If (y <> 0) Then
dblres = Radianes2Grados(Atn(x / y))
If (x <= 0 And y < 0) Then
dblres = dblres + 180
ElseIf (x > 0 And y < 0) Then
dblres = dblres + 180
ElseIf (x < 0 And y > 0) Then
dblres = dblres + 360
End If
Else
If (x > 0) Then
dblres = 90
ElseIf (x < 0) Then
dblres = 270
End If
End If
GetAngleXY = dblres
End Function
Public Function Grados2Radianes(ByVal Grados As Double) As Double
Grados2Radianes = Grados * (3.14159265358979 / 180)
End Function
Public Function Radianes2Grados(ByVal Radianes As Double) As Double
Radianes2Grados = Radianes * 180 / 3.14159265358979
End Function
Private Sub Form_Load()
MsgBox GetAngle2Points(79, 0, 90, 90)
End Sub
Dulces Lunas!¡.
Cita de: Dunkansdk en 9 Mayo 2011, 04:19 AM
'Calculate Side C
SideC = Sqr(Abs(TargetX - CenterX) ^ 2 + Abs(TargetY - CenterY) ^ 2)
'Side B = CenterY
'Calculate Side A
SideA = Sqr(Abs(TargetX - CenterX) ^ 2 + TargetY ^ 2)
No tienes por que hacer un
abs(), las potencia pares dan un valor positivo.
P.D.: No es necesario realizar la raíz para calcular los grados entre dos puntos.
Dulces Lunas!¡.
.