Novità

Cerchio Ciclometrico

esselotto

Advanced Member >GOLD<
Trovato tra gli script prova di Spaziometria
Chi sarebbe in grado gentilmente di adattarlo come Cerchio Ciclometrico,
che faccia vedere solo i 90 numeri e relativi gradi di divisione
 
Codice:
Option Explicit
Dim aPos(360,2) ' memorizza le coordinate relative ai 360 gradi serve per poter disegnare le corde
Sub Main
	Dim nRaggio ' raggio ddel cerchio
	Dim cX,cY ' centro del cerchio x e y
	Dim Base,Altezza ' dimensioni area disegno
	Dim Angolo ' gestisce il ciclo per disegnare il cerchio
	Dim pi ' pigreco
	Dim x1,y1,x2,y2 ' coordinate generiche pr i segmenti
	Dim cLung ' distanza per stampare i gradi
	Dim k ' ciclo generico
	cLung = 2
	pi = 3.14
	Base = 150
	Altezza = 150
	nRaggio = 60
	' preimposto le dimensioni dell'area
	Call PicSetDimensioni(Base,Altezza,Base,Altezza)
	' calcolo il centro del cerchio
	cX = Base / 2
	cY = Altezza / 2
	
	
	Call PicCerchio(cX,cY,3)
	Call PicRiempi(cX,cY,vbRed)
	
	' ciclo per disegnare i semiraggi
	For Angolo = 0 To 360
		' calcolo cordinate per il segmento raggio
		x1 = cX +((nRaggio) * Cos(- Angolo *(pi / 180)))
		y1 = cY +((nRaggio) * Sin(- Angolo *(pi / 180)))
		' memorizzo nell'array globale le coordinate appena calcolate
		' cosi potranno essere riusate per disegnare le corde
		aPos(Angolo,1) = x1
		aPos(Angolo,2) = y1
		If Angolo Mod 5 = 0 Then
			' ogni 5 gradi disegno un semiraggio un po' piu lungo
			' e stampo i gradi in corripondenza
			If Angolo <> 0 Then
				x2 = cX +((nRaggio + cLung*3) * Cos(- Angolo *(pi / 180)))
				y2 = cY +((nRaggio + cLung*3) * Sin(- Angolo *(pi / 180)))
				Call PicLinea(x1,y1,x2,y2)
				x2 = cX +((nRaggio + cLung*4) * Cos(-(Angolo + 2) *(pi / 180)))
				y2 = cY +((nRaggio + cLung*4) * Sin(-(Angolo + 2) *(pi / 180)))
				Call PicStampaTestoRT(x2,y2,Angolo,Angolo)
			End If
		Else
			' disegno il semiraggio
			x2 = cX +((nRaggio + cLung) * Cos(- Angolo *(pi / 180)))
			y2 = cY +((nRaggio + cLung) * Sin(- Angolo *(pi / 180)))
			Call PicLinea(x1,y1,x2,y2)
		End If
	Next
	' come esempio disegno un poligono di lato 20
	For k = 0 To 340 Step 20
		Call DisegnaCorda(k,k + 20,vbRed)
	Next
	' mostro la figura in output
	Call PicEsegui
End Sub
Sub DisegnaCorda(p1,p2,colore)
	' p1 e p2 sono i gradi a cui si riferiscono inizio e fine della corda
	'Call PicLineaTratteggiata(aPos(p1,1),aPos(p1,2),aPos(p2,1),aPos(p2,2),colore)
	Call PicLinea(aPos(p1,1),aPos(p1,2),aPos(p2,1),aPos(p2,2),colore)
	Call PicPunto(aPos(p1,1),aPos(p1,2),6,colore)
	Call PicPunto(aPos(p2,1),aPos(p2,2),6,colore)
End Sub
 
scusa esse ti serve proprio in quel modo ?
Perceh senno si potrebbe fare cosi , lo avevi gia visto ?

Codice:
Option Explicit
Sub Main
	
	ReDim aN(2)
	
	aN(1) = 1
	aN(2) = 45
	call DisegnaCerchioCiclometrico (aN)
	
End Sub
 
quote:Originally posted by LuigiB

scusa esse ti serve proprio in quel modo ?
Perceh senno si potrebbe fare cosi , lo avevi gia visto ?

Codice:
Option Explicit
Sub Main
	
	ReDim aN(2)
	
	aN(1) = 1
	aN(2) = 45
	call DisegnaCerchioCiclometrico (aN)
	
End Sub


Si Luigi serve in quel modo, sto provando a capire come disegnare un cerchio in vb6.
Ho già un'altro codice in vb6 che disegna il cerchio, ma non riesco a dividerlo.
Almeno per quanto io abbia provato.
 
Se vuoi posso anche metterlo in questa pagina il mio codice trovato in rete.

Ho una pictureBox e 4 textbox per inserimento numeri.
e un command Button.


Per dividere e disegnare i numeri nel cerchio, ho usato un'immagine (con cerchio e numeri).
E sopra questa immagine faccio disegnare il mio cerchio. e le corde.

un po primitivo come soluzione, ma efficace.:)
 
questo script lo puoi riadattare in vb6 attraverso l'uso delle funzioni Circle , Line , la funzione che scrive il testo ruotato
PicStampaTestoRT sostituiscila con il metodo print della picturebox.


Codice:
Option Explicit
Dim aPos(90,2) ' memorizza le coordinate relative ai 90 numeri  
Sub Main
	Dim nRaggio ' raggio ddel cerchio
	Dim cX,cY ' centro del cerchio x e y
	Dim Base,Altezza ' dimensioni area disegno
	Dim Angolo ' gestisce il ciclo per disegnare il cerchio
	Dim pi ' pigreco
	Dim x1,y1,x2,y2 ' coordinate generiche pr i segmenti
	Dim cLung ' distanza per stampare i gradi
	Dim k ' ciclo generico
	Dim n 
	Dim z 
	
	cLung = 2
	pi = 3.14
	Base = 150
	Altezza = 150
	nRaggio = 60
	' preimposto le dimensioni dell'area
	Call PicSetDimensioni(Base,Altezza,Base,Altezza)
	' calcolo il centro del cerchio
	cX = Base / 2
	cY = Altezza / 2
	
	
	
	Call PicCerchio(cX,cY, nRaggio )

	Angolo = 360
	n = 91
	' ciclo per disegnare i semiraggi
	For z = 90 To 540 Step 4
		
		Angolo = FuoriX( z ,360)
		
		' calcolo cordinate per il segmento raggio
		x1 = cX +((nRaggio) * Cos(- Angolo *(pi / 180)))
		y1 = cY +((nRaggio) * Sin(- Angolo *(pi / 180)))
		' memorizzo nell'array globale le coordinate appena calcolate
		' cosi potranno essere riusate per disegnare le corde
		
		n = n -1
		aPos(n,1) = x1
		aPos(n,2) = y1
		
		
		If n Mod 10 = 0 Then
			' ogni 5 gradi disegno un semiraggio un po' piu lungo
			' e stampo i gradi in corripondenza
			
				x2 = cX +((nRaggio + cLung*3) * Cos(- Angolo *(pi / 180)))
				y2 = cY +((nRaggio + cLung*3) * Sin(- Angolo *(pi / 180)))
				Call PicLinea(x1,y1,x2,y2)
				x2 = cX +((nRaggio + cLung*4) * Cos(-(Angolo + 2) *(pi / 180)))
				y2 = cY +((nRaggio + cLung*4) * Sin(-(Angolo + 2) *(pi / 180)))
				Call PicStampaTestoRT(x2,y2,n,Angolo)
			
		Else
			' disegno il semiraggio
			x2 = cX +((nRaggio + cLung) * Cos(- Angolo *(pi / 180)))
			y2 = cY +((nRaggio + cLung) * Sin(- Angolo *(pi / 180)))
			Call PicLinea(x1,y1,x2,y2)
			x2 = cX +((nRaggio + cLung) * Cos(-(Angolo + 2) *(pi / 180)))
			y2 = cY +((nRaggio + cLung) * Sin(-(Angolo + 2) *(pi / 180)))
			Call PicStampaTestoRT(x2,y2,n,Angolo)


		End If
	 
		
		
		If n = 0 Then Exit For
	Next
'	 come esempio disegno un poligono di lato 18
	For k = 90 To 1 Step -18
		Call DisegnaCorda(k,Fuori90(k - 18),vbRed)
	Next
	' mostro la figura in output
	Call PicEsegui
End Sub
Sub DisegnaCorda(p1,p2,colore)
	' p1 e p2 sono i gradi a cui si riferiscono inizio e fine della corda
	'Call PicLineaTratteggiata(aPos(p1,1),aPos(p1,2),aPos(p2,1),aPos(p2,2),colore)
	Call PicLinea(aPos(p1,1),aPos(p1,2),aPos(p2,1),aPos(p2,2),colore)
	Call PicPunto(aPos(p1,1),aPos(p1,2),6,colore)
	Call PicPunto(aPos(p2,1),aPos(p2,2),6,colore)
End Sub
 
Ti ringrazio del codice spedito ho iniziato a capire il meccanismo.

Però mi sono bloccato in questo punto
PicStampaTestoRT sostituiscila con il metodo print della picturebox.

Per sostituite PicStampaTestoRT

ho fatto cosi ho dato le coordinate
a pset

Picture1.PSet (x2, y2)
Picture1.Print n

ma non mi scrive in modo ordinato

Provo a Spiegarti senza un'immagine.
Un quarto dei numeri vengono scritti al posto corretto
l'altro quarto sulla riga del cerchio e altro ancora dentro il cerchio.

Anche se escludo il PSet vengono scritti disordinatamente.


Ho provato a manipolare x2 e y2 con il valore dell'angolo e di Clung
facendo un -Angolo + Angolo .ma niente.

Mi chiedo Adesso.

Pset(coordinate in orriz. , coordinate in verticale)
E ho notato che i numeri vengono scritti in modo seguente 89 88 87 86 85 84


Dov'è che sbaglio?

Ritorno quindi al mio vecchio problema, di cui ho scritto post precedente
 
ciao Esse , il motivo è molto semplice.
Per settare le coordinate per iniziare la stampa si usano le proprietà
currentX e currentY , non pset anche se pure lui aggiorna le proprietà
suddette pset serve per disegnare un punto non propriamente per settare le coordinate.
Tuttavia anche usando currentx e currenty vedresti che i numeri non appaiono in modo simmetrico seguendo i contorni del cerchio questo
per che un testo non ruotato si estende sempre da sinistra a destra
questo potrebeb andar bene per la meta destra del cerchio ma per la meta sinistra finirebbe che il numero si sivrapponga al cerchio.
Allora come si fa ?
Bene vedi che ai bordi del cerchio compaiono delle stanghette ogni 10 numeri ne compare una piu lunga , bene con lo stesso procedimento
con il quale si calcolano le coordinate piu esterne di ciascuna stanghetta noi calcoleremo una nuova coordinata .
Questa nuova coordinata sara il centro della scritta che contiene il numero da 01 a 90
Mi spiego : quando noi impostiamo currentx e currenty per poi usare il metodo picture1.print "ciao"</u> vedremo che l'angolo sinistro alto della prima lettera ovvero la c combacia con le nostre coordinate x e y , non è quell oche vogliamo , noi vogliamo che le nostre coordinate x e y cadano al centro tra la I e la A sia in larghezza che altezza , allo stesso modo se stampiamo Picture1.print "01" vogliamo che x e y combacino tra lo 0 e l'1 a meta sia verticale sia orizzontale , solo cosi i numeri verranno stampat bene
in modo simmetrico.
Bene allora la nuova coordinata di cui parlavo prima è proprio il centro che vogliamo percio ricevuta quella coordinata in base alle dimensioni di altezza e larghezza della scritta dobbiamo calcolare
le coordinate per scrivere il nostro numero.
E' facilissimo ricevuta una x e una y che sappiamo essere il centro
della scritta per calcolare l'angolo in alto a sinistra bastera
per la larghezza ovvero la nuova X sottrarre alla X che gia abbiamo la meta della larghezza della scritta "01" e per calcolare la nuova y Bastera sottrarre dalla Y che abbiamo la meta dell'altezza della scritta, avemo cosi due nuove coordinate x e y che sono proprio
il pundo dove dobbiamo scrivere per fare in modo che x e y che avevamo all'inizio cadano proprio al centro della nostra scritta.
Quindi la funzione picTestoRt potra esere sostitita da

Codice:
Function PicStampaTesto(ByVal x, ByVal y, testo)

    x = x - Picture1.TextWidth(testo) / 2
    y = y - Picture1.TextHeight(testo) / 2
    
    
    
    Picture1.CurrentX = x
    Picture1.CurrentY = y
    Picture1.Print testo
    
End Function


tutto il codice da mettere in vb6 è il seguente pero prima crea un form con una picturebox (picture1) e un commandbutton (command1)
poi apri la finestra del codice e posizionati sulla prima riga
dove c'è option expllicit , cancellalo e incolla tutto il seguente
ciao !

Codice:
Option Explicit
Dim aPos(90, 2) ' memorizza le coordinate relative ai 90 numeri
Sub Test()
    Dim nRaggio ' raggio ddel cerchio
    Dim cX, cY ' centro del cerchio x e y
    Dim Base, Altezza ' dimensioni area disegno
    Dim Angolo ' gestisce il ciclo per disegnare il cerchio
    Dim pi ' pigreco
    Dim x1, y1, x2, y2 ' coordinate generiche pr i segmenti
    Dim cLung ' distanza per stampare i gradi
    Dim k ' ciclo generico
    Dim N
    Dim z
    
    cLung = 2
    pi = 3.14
    Base = 150
    Altezza = 150
    nRaggio = 60
    ' preimposto le dimensioni dell'area
    Call PicSetDimensioni(Base, Altezza, Base, Altezza)
    ' calcolo il centro del cerchio
    cX = Base / 2
    cY = Altezza / 2
    
    
    
    Call PicCerchio(cX, cY, nRaggio)

    Angolo = 360
    N = 91
    ' ciclo per disegnare i semiraggi
    For z = 90 To 540 Step 4
        
        Angolo = FuoriX(z, 360)
        
        ' calcolo cordinate per il segmento raggio
        x1 = cX + ((nRaggio) * Cos(-Angolo * (pi / 180)))
        y1 = cY + ((nRaggio) * Sin(-Angolo * (pi / 180)))
        ' memorizzo nell'array globale le coordinate ap
 
Codice:
Favoloso anzi direi Grandioso 
grazie Luigi per il codice VB. E ti ringrazio sopratutto per la
spiegazione molto chiara. Mi hai fatto capire lo sbaglio.

Non voglio ripetermi, era questo il punto che no riuscivo a capire
a pensarlo mi veniva facile. ma quando modificavo il codice lo sbagliavo.
dopo inviato l'ultimo post avevo provato anche con 
currentX e Y 
e print n 

ma come da te citato, ancora non tutti numeri venivano scritti al posto giusto. 


Mi sono aiutato anche con codici sorgente trovati in giro su google.
siti appositamente per vb6. esempi di orologi analogici, simulatori di radar.
ecc tutto quello che disegnava il cerchio e aveva a che fare con coordinate.
E per finire avevo trovato anche quello che cercavo un cerchio diviso in 90 parti.

Ma nessun codice sorgente mi ha aiutato a farmi capire come ordinare i numeri
in modo corretto.Perchè.
L'orologio usava un'immagine sovrapposta (come ho fatto anch'io)
il Radar e il cerchio ciclometrico, scrivevano si i numeri (attorno) , ma non disposti 

ordinatamente. I numeri sulla sinistra Guardando il monitor erano spostati verso il centro.


Comunque ritornando sul tuo Codice sorgente,
erano queste le due righe che bisognava ritoccare. 

  x = x - Picture1.TextWidth(testo) / 2
  y = y - Picture1.TextHeight(testo) / 2

 anzi per meglio dire

         - Picture1.TextWidth(testo) / 2
         - Picture1.TextHeight(testo) / 2
    
e bisognava (sopratutto) pensare ai numeri che vengono sempre scritti a partire 
da sinistra verso destra.
Grandioso Luigi.


Ti ringrazio nuovamente con stima esselotto
 
Anzi colgo l'occasione per inserire l'immagine del cerchio Risultato in Visual Basic
col codice Sopra.


cerchioy.jpg
[/URL][/img]
 
ACC....e per chi.....è un po......!!! si può avere il listato completo...........se non si invade l'orto altrui......?
 

Ultima estrazione Lotto

  • Estrazione del lotto
    martedì 21 gennaio 2025
    Bari
    78
    09
    70
    03
    23
    Cagliari
    32
    88
    30
    13
    45
    Firenze
    87
    23
    15
    39
    86
    Genova
    71
    48
    67
    59
    23
    Milano
    58
    50
    80
    85
    29
    Napoli
    90
    81
    79
    82
    62
    Palermo
    70
    33
    90
    05
    10
    Roma
    15
    71
    55
    85
    76
    Torino
    89
    09
    18
    33
    69
    Venezia
    44
    80
    82
    73
    58
    Nazionale
    80
    25
    13
    63
    17
    Estrazione Simbolotto
    Bari
    39
    36
    34
    14
    31
Indietro
Alto