Autor
|
Tema: poner tanto por ciento en el grafico circular (Leído 3,015 veces)
|
corlo
Desconectado
Mensajes: 120
|
estoy haciendo un pequeño programa con el cual hay unos datos fijos y quisiera poner esos datos en el grafico circular hay cuatro datos pero hay un quinto dato que falta dibujar que es la variable z1 en el grafico y poner el dato en el grafico. en el programa faltaria controlar el indice de introducir los datos que empezara por 1,2,3,4,5, etc el ejemplo que tengo hasta ahora es el siguiente: Option Explicit Private Type departamento d As Date w As Double x As Double y As Double z As Double zl As Double End Type Dim dpto As departamento Dim NumRecs As Long Private Sub Command1_Click() 'Grafico DrawPie End Sub Private Sub DrawPiePiece(lColor As Long, ByVal fStart As Double, ByVal fEnd As Double) Const PI As Double = 3.14159265359 Const CircleEnd As Double = -2 * PI Dim dStart As Double Dim dEnd As Double Picture2.FillColor = lColor Picture2.FillStyle = 0 dStart = fStart * (CircleEnd / 100) dEnd = fEnd * (CircleEnd / 100) Picture2.Circle (170, 150), 100, , dStart, dEnd End Sub Private Sub DrawPie() Dim Disp As Single, Alq As Single, i As Byte, Vt As Integer, Ang1 As Single, Ang2 As Single Picture2.Cls Picture2.AutoRedraw = True Picture2.BackColor = &H8000000E Picture2.ScaleMode = vbPixels Dim xx As Double Dim yy As Double Dim zz As Double Dim uu As Double With dpto If .w = 0 Then MsgBox "No hay registros para" & DateTime.Date & "para ser mostrado" Text1.Text = .d If .w > 0 Then xx = (.x * 100) / .w yy = xx + (.y * 100) / .w zz = yy + (.z * 100) / .w uu = zz + (.zl * 100) / .w Call DrawPiePiece(QBColor(1), 0.001, xx) Call DrawPiePiece(QBColor(6), xx, yy) Call DrawPiePiece(QBColor(3), yy, zz) Call DrawPiePiece(QBColor(5), zz, uu) End If End With End Sub Private Sub Command2_Click() 'Guardar With dpto .d = Date .w = 650 .x = 301 .y = 39 .z = 109 .zl = 201 End With NumRecs = 1 Open App.Path & "\PieData.dat" For Random As #1 Len = 64 Put #1, 1, NumRecs Put #1, NumRecs + 1, dpto Close #1 End Sub Private Sub Command3_Click() 'Leer If FileLen(App.Path & "\PieData.dat") > 60 Then Open App.Path & "\PieData.dat" For Random As #1 Len = 64 Get #1, 1, NumRecs Get #1, NumRecs + 1, dpto Close #1 DrawPie End If End Sub Private Sub Command4_Click() End End Sub Private Sub Command5_Click() Picture2.Cls End Sub
gracias
|
|
|
En línea
|
|
|
|
corlo
Desconectado
Mensajes: 120
|
he mejorado el codigo del grafico ahora introduzco los datos fijos y los lee solo quisiera poner el porcentaje en el grafico circular el codigo es el siguiente Option Explicit Private Type departamento d As Date x As Double y As Double z As Double w As Double End Type Dim dpto As departamento Dim NumRecs As Long Private Sub Command1_Click() 'Grafico DrawPie End Sub Private Sub DrawPie() Const PI As Double = 3.14159265359 Dim x1 As Double, y1 As Double, z1 As Double, w1 As Double Dim x As Double, y As Double, z As Double, w As Double Dim r As Double, midx As Double, midy As Double Dim sum As Double 'Text1.Text = Format$(Date, "dd/mm/yyyy") Picture2.Cls Picture2.FillStyle = 0 x1 = Val(Text2.Text) y1 = Val(Text3.Text) z1 = Val(Text4.Text) w1 = Val(Text5.Text) sum = x1 + y1 + z1 + w1 x = x1 / sum y = y1 / sum z = z1 / sum w = w1 / sum midx = Picture2.Width / 2 midy = Picture2.Height / 2 r = Picture2.Width / 2 - 300 If x <> 0 And y <> 0 And z <> 0 Then Picture2.FillColor = vbRed Picture2.Circle (midx, midy), r, , -2 * PI, -2 * PI * x, 2 / 3 Picture2.FillColor = vbYellow Picture2.Circle (midx, midy), r, , -2 * PI * x, -2 * PI * (x + y), 2 / 3 Picture2.FillColor = vbBlue Picture2.Circle (midx, midy), r, , -2 * PI * (x + y), -2 * PI * (x + y + z), 2 / 3 Picture2.FillColor = vbGreen Picture2.Circle (midx, midy), r, , -2 * PI * (x + y + z), -2 * PI, 2 / 3 End If End Sub Private Sub Command2_Click() 'Guardar With dpto .d = Text1.Text .x = Val(Text2.Text) .y = Val(Text3.Text) .z = Val(Text4.Text) .w = Val(Text5.Text) End With NumRecs = 1 Open App.Path & "\PieData.dat" For Random As #1 Len = Len(dpto) Put #1, 1, NumRecs Put #1, NumRecs + 1, dpto Close #1 End Sub Private Sub Command3_Click() 'Leer 'If FileLen(App.Path & "\PieData.dat") > 60 Then Open App.Path & "\PieData.dat" For Random As #1 Len = Len(dpto) Get #1, 1, NumRecs Get #1, NumRecs + 1, dpto With dpto Text1.Text = .d Text2.Text = Val(.x) Text3.Text = Val(.y) Text4.Text = Val(.z) Text5.Text = Val(.w) End With Close #1 DrawPie 'End If End Sub Private Sub Command4_Click() End End Sub Private Sub Command5_Click() Picture2.Cls Text2.SetFocus End Sub Private Sub Form_Load() Text1.Text = Format$(Date, "dd/mm/yyyy") End Sub
Gracias
|
|
|
En línea
|
|
|
|
Serapis
|
...solo quisiera poner el porcentaje en el grafico circular...
...poner esos datos en el grafico circular hay cuatro datos pero hay un quinto dato que falta dibujar que es la variable z1 en el grafico y poner el dato en el grafico.
en el programa faltaria controlar el indice de introducir los datos que empezara por 1,2,3,4,5, etc
No se entiende que quieres. Como siempre te expresas para tí, los demás no tenemos las perspectiva del resto de datos que están en tu cabeza, tampoco adjuntas (nunca), una imagen con lo que tienes y dibujando (si fuere preciso), lo que esperas, para ayudar a comprender qué es lo que quieres. Quieres dibujar un dato que se llama z1... y qué es ese dato: Una imagen, un color, un área, un círculo, una línea, un texto, un icono, una transparencia, un gráfico????. ¿Y dónde y cómo ha de dibujarse?. Tampoco entiendo que son esos "índices" y qué significa eso de "controlar el índice" ni mucho menos lo de "introducir los datos que empezara por 1,2..." Una captura de la ventana y dibujando encima a mano alzada como ha de quedar, aclararía las cosas sin tener que dar demasiadas explicaciones.
|
|
|
En línea
|
|
|
|
corlo
Desconectado
Mensajes: 120
|
lo que quiero es poner los valores numericos que hay en los textbox osea text2,text3,text4,text5,en cada particion del grafico circular que sean visibles
lo del indice no hace falta, ya lo he solucionado
y perdona si no me expreso bien
gracias
|
|
|
En línea
|
|
|
|
Serapis
|
Hoy estuve todo el día fuera y acabo de llegar hace un rato. Ayer te hubiera respondido, diciendo que el problema es simplemente hayar la mitad del ángulo... el punto medio en el arco y con algo menos del radio (si lo quieres dentro del gráfico), y ya... ...hay que tener en cuenta además, que dadas las cordenadas de impresión de texto (el eje 0,0) el texto debe considerarse con su alineación centrada tanto vertical como horizontalmente, es decir el punto calculado debe ser el centro del texto. Si el punto de calculado fuera el inicio del texto, pués el texto se desplazaría hacia la derecha, el resultado es que el arco que queda a la izquierda se vería bien, pero el de la derecha no... pasaría lo mismo con los textos de los arcos verticales. Y con esas dos consideraciones bastaría... pero al final ibas a volver para decir que no entiendes las cordenadas polares y en fin... ...te pongo el código... espero que lo estudies y no que solamente copies y pegues: Const PI2 As Double = (3.14159265359 * 2) Private Sub DrawPie() Dim x1 As Double, y1 As Double, z1 As Double, w1 As Double Dim v1 As Double, v2 As Double, v3 As Double, v4 As Double Dim Radio As Double, midX As Double, midY As Double Dim sum As Double Dim RadioTxt As Single, Angulo As Single, ang1 As Single, ang2 As Single, tX As Integer, tY As Integer 'Text1.Text = Format$(Date, "dd/mm/yyyy") Picture2.Cls Picture2.FillStyle = 0 x1 = Val(Text2.Text) y1 = Val(Text3.Text) z1 = Val(Text4.Text) w1 = Val(Text5.Text) sum = (x1 + y1 + z1 + w1) v1 = (x1 / sum) v2 = (y1 / sum) v3 = (z1 / sum) v4 = (w1 / sum) midX = (Picture2.Width / 2) midY = (Picture2.Height / 2) Radio = (Picture2.Width / 3) ' - 300 RadioTxt = (Radio / 1.3) If v1 <> 0 And v2 <> 0 And v3 <> 0 Then tY = (Picture2.TextHeight("Y") / 2) ' el alto de la fuente es el mismo para todo caracter o string. Picture2.FillColor = vbRed ang1 = -PI2: ang2 = (-PI2 * v1) Picture2.Circle (midX, midY), Radio, , ang1, ang2, 1 ' 2 / 3 Angulo = (ang2 / 2) tX = (Picture2.TextWidth(x1) / 2) Call DrawTexto(RadioTxt, Angulo, midX - tX, midY - tY, CStr(x1)) ' Valor absoluto: cstr(x1). Valor relativo (porcentaje): (cstr(v1) & "%") Picture2.FillColor = vbYellow ang1 = ang2: ang2 = (-PI2 * (v1 + v2)) Picture2.Circle (midX, midY), Radio, , ang1, ang2, 1 ' 2 / 3 Angulo = ((ang2 + ang1) / 2) tX = (Picture2.TextWidth(y1) / 2) Call DrawTexto(RadioTxt, Angulo, midX - tX, midY - tY, CStr(y1)) Picture2.FillColor = vbBlue ang1 = ang2: ang2 = (-PI2 * (v1 + v2 + v3)) Picture2.Circle (midX, midY), Radio, , ang1, ang2, 1 ' 2 / 3 Angulo = ((ang2 + ang1) / 2) tX = (Picture2.TextWidth(z1) / 2) Call DrawTexto(RadioTxt, Angulo, midX - tX, midY - tY, CStr(z1)) Picture2.FillColor = vbGreen ang1 = ang2: ang2 = -PI2 Picture2.Circle (midX, midY), Radio, , ang1, ang2, 1 ' 2 / 3 Angulo = ((ang2 + ang1) / 2) tX = (Picture2.TextWidth(w1) / 2) Call DrawTexto(RadioTxt, Angulo, midX - tX, midY - tY, CStr(w1)) End If End Sub ' Dibuja el texto centrado en el angulo del arco, y con menor radio que el arco. ' NOTA: Si el angulo fuera excesivamente pequeno, podria no caber el texto. ' NOTA: Para el texto puede elegirse entre el valor absoluto (caso actual), o el valor relativo (porcentaje). Private Sub DrawTexto(ByVal Radio As Single, ByVal Angulo As Single, ByVal EjeX As Integer, ByVal EjeY As Integer, ByRef Texto As String) Picture2.CurrentX = (Cos(Angulo) * Radio) + EjeX Picture2.CurrentY = (Sin(Angulo) * Radio) + EjeY Picture2.ForeColor = vbBlack Picture2.Print Texto End Sub
Nota que la constante PI ahora se llama PI2 (su valor ha cambiado) y se ha trasladado al módulo. Para que te funcione en tú código entonces: - primero pega la línea de la constante, - comenta tu función 'Drawpie' y pega la que aquí está modificada, - pega también la nueva función 'DrawTexto'. - Ejecuta y prueba... Por cierto, recuerda tener el forecolor en un color que destaque, yo he puesto el negro, pero si siempre van a ser los mismos colores, mejor optar por señalarlo en la interfaz. Te pongo una imagen de ejemplo... Si no entiendes algo, pregunta.
|
|
« Última modificación: 3 Abril 2022, 03:36 am por Serapis »
|
En línea
|
|
|
|
corlo
Desconectado
Mensajes: 120
|
perfecto justo lo que necesitaba
muchisimas gracias serapis
|
|
|
En línea
|
|
|
|
Serapis
|
Nota que yo puse el valor, no el porcentaje... la línea 39 tiene un comentario al respecto, pero recuerda que el valor también debe correspondenser con la línea anterior que mide el ancho del string, para los 4 'gajos'.
|
|
|
En línea
|
|
|
|
corlo
Desconectado
Mensajes: 120
|
ok
he puesto el valor relativo en los 4 cajos
Valor relativo (porcentaje): (cstr(v1) & "%")
muchas gracias
|
|
|
En línea
|
|
|
|
Serapis
|
También puedes poner una 'sombra' bajo el círculo, previo a su dibujado: If ((v1 <> 0) And (v2 <> 0) And (v3 <> 0)) Then Picture2.ForeColor = &HB09090 Picture2.FillColor = &HB09090 'gris perla Picture2.Circle (midX + 105, midY + 75), Radio ' simula una sombra de 7x5 píxeles Picture2.ForeColor = vbBlack tY = (Picture2.TextHeight("Y") / 2) ' el alto de la fuente es el mismo para todo carácter o string. '... el resto del dibujado. end if
|
|
|
En línea
|
|
|
|
corlo
Desconectado
Mensajes: 120
|
ok
es algo parecido en 3d
porque en 3d seria de mas grosor un ejemplo en 3d
gracias
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
una lista circular en c#
.NET (C#, VB.NET, ASP)
|
Fingerling
|
2
|
13,232
|
24 Septiembre 2010, 17:23 pm
por -=[ §ÂßÂÑÐØ ]=-
|
|
|
Convolución Circular
Programación C/C++
|
drbeat
|
5
|
7,166
|
2 Marzo 2011, 15:57 pm
por drbeat
|
|
|
El 10 por ciento de las webs son maliciosas
Noticias
|
wolfbcn
|
0
|
1,275
|
7 Mayo 2012, 17:49 pm
por wolfbcn
|
|
|
El 74,3 por ciento de los emails son spam
Noticias
|
wolfbcn
|
0
|
1,449
|
15 Abril 2013, 14:33 pm
por wolfbcn
|
|
|
Lista circular simple (LCS)
Programación C/C++
|
Cpp
|
1
|
2,367
|
11 Diciembre 2014, 01:50 am
por engel lex
|
|