¿como obtener el angulo de una coordenada? VB 6.0

Iniciado por AlxSpy, 9 Mayo 2011, 04:02 AM

0 Miembros y 1 Visitante están viendo este tema.

AlxSpy

Holas tengo unas imagenes como estas:






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?

Dunkansdk

#1
Código (vb) [Seleccionar]
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

AlxSpy


BlackZeroX

#3
.
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.

Código (vb) [Seleccionar]


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!¡.
The Dark Shadow is my passion.

BlackZeroX

#4
Cita de: Dunkansdk en  9 Mayo 2011, 04:19 AM
Código (Vb) [Seleccionar]


    '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!¡.
.
The Dark Shadow is my passion.