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

    Muoversi attorno una circonfernza in modo analogico???

    avrei bisogno di sapre un modo (se esiste) per far si che lutente riesca a far ruotare un oggietto lungo il perimetro di una circonferenza in modo fluido
    grazie a tutti

  2. #2
    Utente di HTML.it L'avatar di MMarzia
    Registrato dal
    Mar 2001
    Messaggi
    1,781
    ti è già stato detto una volta: specifica linguaggio e versione, anche nel titolo
    io sono festosamente cicciottello :: e. cartman

    t'amo senza sapere come, nè quando nè da dove,
    t'amo direttamente senza problemi nè orgoglio:
    così ti amo perchè non so amare altrimenti

  3. #3
    scusate ma mi e proprio passato di mente
    in ogni caso e per la versione VB6

  4. #4
    Ciao !
    Sebbene sia complesso da implementare, un modo c'è !
    Dato che lo chiedi presumo tu non hai mai fatto cose simili,
    quindi prima ti spiego con che cosa avrai a che fare, poi passo a darti qualche soluzione.

    Prima di tutto tieni presente che dovrai lavorare con coordinate assolute e coordinate relative:
    Se il tuo utente potrà muovere oggetti (suppongo trascinandoli con il mouse) avrai a disposizione le coordinate assolute della posizione dell'oggetto o del puntatore del mouse.

    Poichè questo oggetto si deve muovere attorno ad una circonferenza, dovrai trasformare queste coordinate assolute in coordinate relative al centro della tua circonferenza.

    Grazie a queste coordinate relative potrai calcolare l'angolo di posizionamento dell'oggetto sulla circonferenza.
    A questo angolo dovrai applicare alcune formule trigonometriche, moltiplicare i risultati per il raggio del tuo cerchio ottentendo così i valori per posizionare correttamente l'oggetto sulla circonferenza.

    Eccoti un po' di codice:

    '
    Private Function Get360Angle(ByVal X As Single, ByVal Y As Single, ByVal OrigX As Single, ByVal OrigY As Single) As Single

    ' - Calcola l'ampiezza di un'angolo di 360° in base alle coordinate di un punto
    ' e le coordinate di un centro.
    ' Richiede
    ' Coordinate assolute del punto (X, Y)
    ' Coordinate assolute del centro (OrigX, OrigY)

    Dim CurX, CurY, CurAngle As Single
    Dim Xsp, Ysp As Long


    If X >= OrigX Then 'X
    Xsp = 1 'Right
    CurX = X - OrigX
    Else
    Xsp = 0 'Left
    CurX = OrigX - X
    End If

    If Y >= OrigY Then 'Y
    Ysp = 1 'Bottom
    CurY = Y - OrigY
    Else
    Ysp = 0 'Top
    CurY = OrigY - Y
    End If

    'Calcola l'ampiezza sull'angolo retto
    'x : (x + y ) = * : 90
    CurAngle = (CurX * 90) / (CurX + CurY)

    'In base allo spicchio (angolo 90°), calcola l'angolo
    Select Case Xsp & Ysp
    Case "00" '270° / 360°
    CurAngle = 270 + (90 - CurAngle)
    Case "01" '180° / 270°
    CurAngle = 180 + CurAngle
    Case "10" '0° / 90°
    CurAngle = CurAngle
    Case "11" '90° / 180°
    CurAngle = 90 + (90 - CurAngle)
    End Select

    'RetVal.
    Get360Angle = CurAngle

    End Function


    Questa funzione accetta come argomenti le coordinate di un punto e quelle del punto che vuoi come centro della circonferenza e restituisce l'ampiezza dell'angolo formato.
    Per provarla, metti una picturebox (picture1) su un form e incolla il segente codice nel suo evento mousemove:

    If Button = 0 Then Exit Sub

    Dim CenterX As Single, CenterY As Single
    Dim Angle As Single

    ' Coordinate del centro di Picture1
    CenterX = Me.Picture1.Width / 2
    CenterY = Me.Picture1.Height / 2
    ' Calcola l'angolo della posizione
    Angle = Get360Angle(X, Y, CenterX, CenterY)

    Cls
    Picture1.Refresh
    ' disegna il mirino nel centro di picture1
    Picture1.Line (CenterX - 120, CenterY)-(CenterX + 120, CenterY)
    Picture1.Line (CenterX, CenterY - 120)-(CenterX, CenterY + 120)
    ' disegna una linea dal punto corrente al centro
    Picture1.Line (X, Y)-(CenterX, CenterY)

    Me.Caption = "Angolo corrente: " & Round(Angle, 2) & "°"


    Se mandi in esecuzione e muovi il mouse sulla picturebox premendo un pulsante qualunque vedrai calcolato l'angolo ottenuto dal tuo posizionamento.
    Questa funzione, apparentemente semplice, può risultare in realtà complicata da capire. Se vuoi chiarimenti, scrivimi pure: simibino@virgilio.it

    Arrivato a questo punto hai già ottenuto l'angolo.
    Sei a metà strada !

    Ora devi applicare le formule di Seno e Coseno (SIN e COS di VB) all'angolo ottanuto, moltiplicare il risultato per il raggio della tua circonferenza per ottenere rispettivamente la coordinata x e la coordinata y del punto in cui posizionare l'oggetto.

    Seno e coseno sono due formule trigonometriche che hanno proprio questo scopo: applicata all'ampiezza di un'angolo restituiscono valori che, moltiplicati per un raggio, danno come risultato le coordinate del punto sulla circonferenza in cui "cade" quell'angolo.

    In VB queste devono essere applicata ai radianti anzichè ai gradi. Ti serve una funzione che converta gradi in radianti.
    Una funzione del genere è semplice da realizzare, basta una proporzione: considera che PGreco è il radiante di un angolo di 180°:

    '
    Private Function GetRadiant(ByVal Angle As Single) As Single

    ' Restituisce il radiante di un angolo (angle)
    Const p = 6.28318 'P Greco

    'Calcola il radiante dell'angolo con la proporzione "
    'Angolo : 360 = x : p"
    GetRadiant = (Angle * p) / 360
    End Function


    A questo punto puoi aggiungere questo codice a quello della picturebox:

    Const RAY As Long = 500
    X = Sin(GetRadiant(Angle)) * RAY
    Y = Cos(GetRadiant(Angle)) * RAY


    ovviamente, il raggio lo stabilisci tu.
    A questo punto hai le coordinate sulla circonferenza.
    Si tratta di coordinate relative (al centro del cerchio)
    quindi devono essere convertite in assolute.
    Queste possono avere valori negativi o positivi.
    Per la x, un valore negativo indica che il punto si trova alla destra del centro del cerchio; un valore positivo indica che si trova alla sua sinistra.
    Puoi calcolare la x assoluta semplicemente facendo:

    x = CenterX + x


    Per la y vale + o - lo stesso:
    un valore negativo indica che il punto si trova al di sotto del centro del cerchio; un valore positivo indica che si trova al di sopra.
    Se ci pensi è esattamente il contrario di quanto accade normalmente alla y durante un mousemove.
    Per questo motivo devi "invertire" la direzione di y prima di calcolarne il valore assoluto:

    If Y < 0 Then
    Y = Abs(Y) ' rendo positivo se negativo
    Else
    Y = 0 - Y ' rendo negativo se positivo
    End If
    Y = CenterY + Y


    Ed ecco fatto !!!
    Hai le coordinate assolute per posizionare il tuo oggetto sulla circonferenza.
    Aggiungi questo codice e prova il risultato
    (anche questo, come quelli precendenti, aggiungilo al mousemove della picturebox):

    ' disegna circonferenza
    Picture1.Circle (CenterX, CenterY), RAY, vbRed
    ' disegna l'oggetto
    Picture1.Circle (X, Y), 100, vbBlue


    E' ciò che ti serviva ?
    Spero di si (altrimenti avresti sprecato mezz'ora in letture inutili)

    Ciao
    Simo

  5. #5
    Fargli girare il monitor, se il cerchio è al centro dello schermo ottieni lo stesso effetto.. .

  6. #6
    Utente di HTML.it
    Registrato dal
    Aug 2009
    Messaggi
    1
    Ottimo codice SimoneVB, un piccolo suggerimento per:

    codice:
    Per questo motivo devi "invertire" la direzione di y prima di calcolarne il valore assoluto:
    
    If Y < 0 Then
    Y = Abs(Y) ' rendo positivo se negativo
    Else
    Y = 0 - Y ' rendo negativo se positivo
    End If
    Y = CenterY + Y
    In un modo + semplice:

    Y = CenterY + (Y * -1)


    Ciao a tutti.

  7. #7
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,462

    Moderazione

    Originariamente inviato da gncarlo
    Ottimo codice SimoneVB, un piccolo suggerimento per [...]
    Non risollevare discussioni concluse da tempo, peraltro per aggiungere precisazioni a messaggi il cui interesse è probabilmente decaduto da tempo, dato che la discussione risale al 2004 (5 anni fa!).

    Vedi il Regolamento per ulteriori informazioni in proposito.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

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 © 2025 vBulletin Solutions, Inc. All rights reserved.