Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    [vb6] precisione nelle rotazioni

    Salve ragazzi, ciao moderatori,

    ho un problema con le rotazioni e vorrei porvelo, fiducioso che qualcuno mi possa dare una mano arisolverlo:

    ho scritto una routine per effettuare un cambiamento di coordinate, per la precisione una rotazione.
    Ho un vettore che contiene le coordinate di un oggetto geometrico (un quadrato) disposto con i suoi lati paralleli ai bordi dello schermo, ossia perfettamente verticali e orizzontali;
    quando vado ad effettuare la rotazione sulle coorodinate, le nuove coorodinate vengono calcolate ma i lati del quadrato non sono più perfettamente verticali e orizzontali.

    Potrebbe essere un problema legato a PiGreco ?

    grazie anticipatamente.

  2. #2
    Non credo, il Pgreco ha tanti di quei decimali da ottenere un'approssimazione pressochè nulla. Occorre vedere la formula che usi, ci possono essere vari motivi. In particolare la dichiarazione delle variabili (ovvero non ci devono essere integer), il calcolo che fai per trovare il centro della figura e la formula che usi per ruotare i punti che ti interessano.

  3. #3
    ciao luciano79,

    guarda sto ripassando unpo' tutto il codice in cerca proprio dell'errore;

    intanto di posto alcune righe del codice:

    ---------------------------------------------
    Const PiGreco As Double = 3.14159265358979


    'sub di rotazione
    Private Function Ruota(Px As Double, Py As Double, a As Double, b As Double, ang As Double) As tpPunto
    'px, py cooridnate da ruotare
    'a, b = centro di rotazione
    'ang = angolo di rotazione
    'Ruota.x, Ruota.y = nuove coordinate

    Ruota.x = Px * Cos(GradToRad(ang_temp)) - Py * Sin(GradToRad(ang_temp)) + a
    Ruota.Y = Px * Sin(GradToRad(ang_temp)) + Py * Cos(GradToRad(ang_temp)) + b

    End Function



    'tpPunto è una variabile tipo
    Private Type tpPunto
    x As Double
    Y As Double
    End Type
    ---------------------------------

  4. #4
    dimenticavo:


    --------
    'Da gradi a radianti
    'accetta tra parentesi un valore in gradi tipo: 180
    Function GradToRad(a_grad As Double) As Single
    If a_grad > 360 Then a_grad = a_grad - 360
    GradToRad = PiGreco * a_grad / 180
    End Function
    ------------


  5. #5
    posto i valori che riscontro nelle routine indicate sopra:

    Px = 0
    Py = 0
    ang = 90

    GradToRad (ang) = 1,5707796
    Cos (GradToRad (ang)) = -4,37113900018644E-08


    il valore di Cos dovrebbe essere 1 ma invece mi viene
    calcolato come -4,37113900018644E-08.

    E' possibile che questo poi generi in cascata tutta una serie di approssimazioni.


  6. #6
    Ok, devo pensarci... in realtà il coseno di 90 è 0, quindi il risultato è giusto (-0.0000000437, praticamente zero). Le formule sembrano ok. Se ragioni in pixel con una decente risoluzione i valore Px e Py dovrebbero avere massimo 4 cifre intere. Mettiamo il caso estremo che Px = 1600 e Py = 1200

    Ruota.x = 1600 * cos(GradToRad(90)) - 1200 * sin(GradToRad(90)) + 0
    Ruota.x = 1600 * 0.0000000437 - 1200 * 0.99999968
    Ruota.x = 0.00006992 - 1199,999616 = -1199.999546

    se guardi solo il valore assoluto 1199.999546 e dici al pc di colorare quel pixel, sicuramente ti colora il 1200, a meno che non utilizzi la Int().
    Ps... io ho approssimato molto più di te, a maggior ragione dovresti avere meno problemi. Puoi postare anche la funzione che unisce gli angoli e l'immagine?

  7. #7
    aspetta,
    il mio problema non è legato alla visualizzazione dell'immagine sullo schermo ma all'esportazione in autocad.
    Le cooridnate che vengono calcolate in vb vengono poi esportate in autocad.
    Esempio: considera un lato che va da x=0,y=1200 a x=0,y=2000.
    Senza il ragionamento che ho fatto mi ritrovo in autocad con dei lati leggermente spostati: e cioè da x=0,y=1200 a x=0.001,y=1200
    mentre con il ragionamento della correzione del coseno e del seno le coordinate sembrano essere correttamente esposrtate.

    Con l'approssimazione che ho fatto, quando vado a esportare in autocad quindi sembra che tutto funzioni.
    Allora la domanda è: è lecito fare il mio ragionamento quando si esporta, oppure ci sono altri metodi?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.