Newsgroup: it.comp.lang.visual-basic
Titolo: [?] Principiante - Problema di trigomometria

Il mio progetto carica tutte le linee presenti in un file DXF di Autocad.
Avendo per ogni linea le coordinate iniziali e finali mi voglio calcolare
la Lunghezza e l'Angolo.
Il file DXF che uso per prova è costituito da 360 linee di lunghezza 5
disposte a cerchio. Es:     _\|/_  (le coordinate iniziali sono sempre le
stesse...)
Con
Const PI = 3.14159265358979
utilizzo questo codice:
        Select Case Cline(x).Item(5)
            Case "0"
                S_x = Val(Cline(x).Item(7))  ' x_iniziale
                S_y = Val(Cline(x).Item(8))  ' y_iniziale
                E_x = Val(Cline(x).Item(10))
                E_y = Val(Cline(x).Item(11))
                L = Sqr((S_x - E_x) * (S_x - E_x) + (S_y - E_y) * (S_y -
E_y))
                L0.Add L
                'Arcsin(X) = Atn(X / Sqr(-X * X + 1))
                    Ang = Sqr((S_x - S_x) * (S_x - S_x) + (E_y - S_y) *
(E_y - S_y)) / L
                    If Ang <> 1 Then ' Se Ang = 1 da errore....
                    Ang = Atn(Ang / Sqr(-Ang * Ang + 1))
                    Ang = Ang * (180 / PI)
                    Else
                    Ang = 0
                    End If
                        L0.Add Ang
       .....
ma l'uotput (in basso) non è dei migliori...
Infatti prendendo gli angoli delle linee
prima e dopo i 90° viene: 87 88 89 0 89 88 87
anziche andare avanti con 90 91 ecc...
Una cosa che poi non mi spiego è il perchè
ci siano lunghezze e angoli diversi visto che le linee
sono tutte copie di una sola linea.
Sarei anche tentato di chiedervi qualche
delucidazione sull'arrotondamento....
ma credo che darò un'occhiata ai vecchi post  : )
Grazie a tutti.
 5,00000000000002     Lunghezza > 5
 86,9999999999985     Angolo  >   87
 5,00000000000001    Lunghezza > 5
 87,9999999999985    Angolo  > 88
 5,00000000000001     Lunghezza ...
 88,9999999999984     Angolo...
 5,00000000000001     L
 0                                  A
 5,00000000000001     L
 89,0000000000017     A > 89
 5                                  L
 88,0000000000018     A
 5,00000000000001     L
 87,0000000000017     A

Stefano:
  se il segmento, di cui vuoi conoscere lunghezza ed angolo, ha come
estremi i punti con coordinate (x1, y1) e (x2, y2) usa queste relazioni:
  Lunghezza = Sqr((x2 - x1)*(x2 - x1) + (y2 - y1)*(y2 - y1))
  Angolo = Atan4Q((y2 - y1), (x2 - x1)) ' se vuoi 0 <= Angolo < 2 * PI.
  Angolo = DATAN2((y2 - y1), (x2 - x1)) ' se vuoi -PI <  Angolo <  <= PI.
Le funzioni da usare sono:
Private Function Atan4Q(ByVal Y#, ByVal X#) As Double
'
'   Ritorna il Valore dell' ArcoTangente di y/x su 4 Quadranti.
'   E':    0 <= Atan2 < 2 * PI.
'
    Select Case X
        Case Is > 0#
        If Y >= 0# Then
            Atan4Q = Atn(Y / X)
        Else
            Atan4Q = Atn(Y / X) + PI2
        End If
'
        Case Is < 0#
        Atan4Q = Atn(Y / X) + PI
'
        Case Is = 0#
        Atan4Q = Sgn(Y) * PI / 2#
    End Select
'
'
'
End Function
e:
Private Function DATAN2(ByVal Y#, ByVal X#) As Double
'
'   Ritorna il Valore dell' ArcoTangente di y/x
'   come implementata dal FORTRAN.
'   E':    -PI < DATAN2 <= PI.
'
    Select Case X
        Case Is > 0#
        DATAN2 = Atn(Y / X)
'
        Case Is < 0#
        If Y >= 0# Then
            DATAN2 = Atn(Y / X) + PI
        ElseIf Y < 0# Then
            DATAN2 = Atn(Y / X) - PI
        End If
'
        Case Is = 0#
        DATAN2 = Sgn(Y) * PI / 2#
    End Select
'
'
'
End Function
E poi, per quanto rigurda l' arcoseno, non usare la formula riportata
dall' "help" di VB perche' va' in errore per x = 1, valore assolutamente
legale, ma:
Public Function Asin(ByVal X As Double) As Double
'
'   Calcola l' ArcoSeno di x con -1 <= x <= 1.
'   Asin e' in radianti.
'
    If Abs(X) < 1# Then
        Asin = Atn(X / Sqr(1# - X * X))
    ElseIf X = 1# Then
        Asin = PI / 2#
    ElseIf X = -1# Then
        Asin = -PI / 2#
    Else
        Err.Raise 5, "Asin Function", "Argomento illegale per Asin"
    End If
'
'
'
End Function
e:
Private Function Acos(ByVal X As Double) As Double
'
'   Calcola l' ArcoCoseno di x con -1 <= x <= 1.
'   Acos e' in radianti.
'
    If 0# < X And X <= 1# Then
        Acos = Atn(Sqr(1# - X * X) / X)
    ElseIf -1# <= X And X < 0# Then
        Acos = PI + Atn(Sqr(1# - X * X) / X)
    ElseIf X = 0# Then
        Acos = PI / 2#
    Else
        Err.Raise 5, "Acos Function", "Argomento illegale per Acos"
    End If
'
'
'
End Function
Ciao ed a risentirci.
Franco

Mitico Franco
Catturate :)
Ciao

 stesse...)
Per conoscere la lunghezza di una retta basta usare il teorema di pitagora
che non sto a riportare.
Per conoscere l'angono di una retta rispetto all'asse Y io mi sono scritto
questa funzioncina.
Attenzione alla convenzione che vuoi adottare per il segno (se non ricordo
male questa segue la scuola di pensiero che preferisco "angolo negativo =
rotazione in senso orario, a meno di non aver lasciato una toppa :))
Ciao
Public Const pi_ = 3.14159265358979
Public Function advAngle(ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As
Long, ByVal Y2 As Long) As Long
    Dim RInv As Double
    RInv = 180# / pi_
    If (X2 - X1) = 0 Then
        If (Y1 > Y2) Then
            advAngle = -90
        Else
            advAngle = 90
        End If
    Else
        advAngle = -Atn((Y2 - Y1) / (X2 - X1)) * RInv
        If (X2 < X1) And (Y2 < Y1) Then advAngle = advAngle + 180
        If (X2 >= X1) And (Y2 < Y1) Then advAngle = advAngle - 180
    End If
End Function
------------------------- SiDB Simple DataBase engine ----
------------------------- adParser Expression evaluator --
 
http://space.virgilio.it/zntf...@tin.it/
----------------------------------------------------------

Grazie davvero a tutti!
Mi sa che quando finisco il programma 
vi cito nei Credits...

 vi cito nei Credits...
Molte grazie, ma per favore correggimi quest'obbrobio (ma come ho fatto a
scrivere una roba del genere? che spreco di risorse!)
If (X2 - X1) = 0 Then
deve diventare
If (X2 = X1) Then
Ciao
