elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Curso de javascript por TickTack


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP)
| | | |-+  Programación Visual Basic (Moderadores: LeandroA, seba123neo)
| | | | |-+  poner tanto por ciento en el grafico circular
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: poner tanto por ciento en el grafico circular  (Leído 3,015 veces)
corlo

Desconectado Desconectado

Mensajes: 120


Ver Perfil
poner tanto por ciento en el grafico circular
« en: 30 Marzo 2022, 12:30 pm »

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:


Código
  1.  
  2.  
  3. Option Explicit
  4. Private Type departamento
  5. d As Date
  6. w As Double
  7. x As Double
  8. y As Double
  9. z As Double
  10. zl As Double
  11. End Type
  12.  
  13. Dim dpto As departamento
  14. Dim NumRecs As Long
  15.  
  16. Private Sub Command1_Click()
  17. 'Grafico
  18. DrawPie
  19. End Sub
  20.  
  21. Private Sub DrawPiePiece(lColor As Long, ByVal fStart As Double, ByVal fEnd As Double)
  22.  Const PI As Double = 3.14159265359
  23.  Const CircleEnd As Double = -2 * PI
  24.  Dim dStart As Double
  25.  Dim dEnd As Double
  26.  
  27.  Picture2.FillColor = lColor
  28.  Picture2.FillStyle = 0
  29.  dStart = fStart * (CircleEnd / 100)
  30.  dEnd = fEnd * (CircleEnd / 100)
  31.  Picture2.Circle (170, 150), 100, , dStart, dEnd
  32. End Sub
  33.  
  34. Private Sub DrawPie()
  35.  Dim Disp As Single, Alq As Single, i As Byte, Vt As Integer, Ang1 As Single, Ang2 As Single
  36.  
  37.  Picture2.Cls
  38.  
  39.  Picture2.AutoRedraw = True
  40.  Picture2.BackColor = &H8000000E
  41.  Picture2.ScaleMode = vbPixels
  42.  
  43.  
  44.  Dim xx As Double
  45.  Dim yy As Double
  46.  Dim zz As Double
  47.  Dim uu As Double
  48.  
  49.  
  50.  With dpto
  51.    If .w = 0 Then MsgBox "No hay registros para" & DateTime.Date & "para ser mostrado"
  52.        Text1.Text = .d
  53.        If .w > 0 Then
  54.        xx = (.x * 100) / .w
  55.        yy = xx + (.y * 100) / .w
  56.        zz = yy + (.z * 100) / .w
  57.        uu = zz + (.zl * 100) / .w
  58.  
  59.        Call DrawPiePiece(QBColor(1), 0.001, xx)
  60.        Call DrawPiePiece(QBColor(6), xx, yy)
  61.        Call DrawPiePiece(QBColor(3), yy, zz)
  62.        Call DrawPiePiece(QBColor(5), zz, uu)
  63.    End If
  64.  
  65.  End With
  66. End Sub
  67.  
  68. Private Sub Command2_Click()
  69. 'Guardar
  70. With dpto
  71.      .d = Date
  72.      .w = 650
  73.      .x = 301
  74.      .y = 39
  75.      .z = 109
  76.      .zl = 201
  77.    End With
  78.  
  79.    NumRecs = 1
  80.    Open App.Path & "\PieData.dat" For Random As #1 Len = 64
  81.      Put #1, 1, NumRecs
  82.      Put #1, NumRecs + 1, dpto
  83.    Close #1
  84. End Sub
  85.  
  86. Private Sub Command3_Click()
  87. 'Leer
  88. If FileLen(App.Path & "\PieData.dat") > 60 Then
  89.    Open App.Path & "\PieData.dat" For Random As #1 Len = 64
  90.      Get #1, 1, NumRecs
  91.      Get #1, NumRecs + 1, dpto
  92.    Close #1
  93.    DrawPie
  94.  End If
  95. End Sub
  96.  
  97. Private Sub Command4_Click()
  98. End
  99. End Sub
  100.  
  101. Private Sub Command5_Click()
  102. Picture2.Cls
  103. End Sub
  104.  
  105.  
  106.  
  107.  




gracias


En línea

corlo

Desconectado Desconectado

Mensajes: 120


Ver Perfil
Re: poner tanto por ciento en el grafico circular
« Respuesta #1 en: 31 Marzo 2022, 22:01 pm »

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


Código
  1.  
  2.  
  3.  
  4. Option Explicit
  5. Private Type departamento
  6. d As Date
  7. x As Double
  8. y As Double
  9. z As Double
  10. w As Double
  11. End Type
  12.  
  13. Dim dpto As departamento
  14. Dim NumRecs As Long
  15.  
  16. Private Sub Command1_Click()
  17. 'Grafico
  18. DrawPie
  19. End Sub
  20.  
  21.  
  22.  
  23. Private Sub DrawPie()
  24. Const PI As Double = 3.14159265359
  25. Dim x1 As Double, y1 As Double, z1 As Double, w1 As Double
  26. Dim x As Double, y As Double, z As Double, w As Double
  27. Dim r As Double, midx As Double, midy As Double
  28. Dim sum As Double
  29. 'Text1.Text = Format$(Date, "dd/mm/yyyy")
  30.  Picture2.Cls
  31.  
  32.  Picture2.FillStyle = 0
  33.  
  34.  x1 = Val(Text2.Text)
  35.  y1 = Val(Text3.Text)
  36.  z1 = Val(Text4.Text)
  37.  w1 = Val(Text5.Text)
  38.  
  39.  sum = x1 + y1 + z1 + w1
  40.  
  41.  x = x1 / sum
  42.  y = y1 / sum
  43.  z = z1 / sum
  44.  w = w1 / sum
  45.  
  46.  midx = Picture2.Width / 2
  47.  midy = Picture2.Height / 2
  48.  
  49.  r = Picture2.Width / 2 - 300
  50.  
  51.  If x <> 0 And y <> 0 And z <> 0 Then
  52.  
  53.  Picture2.FillColor = vbRed
  54.  Picture2.Circle (midx, midy), r, , -2 * PI, -2 * PI * x, 2 / 3
  55.  Picture2.FillColor = vbYellow
  56.  Picture2.Circle (midx, midy), r, , -2 * PI * x, -2 * PI * (x + y), 2 / 3
  57.  Picture2.FillColor = vbBlue
  58.  Picture2.Circle (midx, midy), r, , -2 * PI * (x + y), -2 * PI * (x + y + z), 2 / 3
  59.  Picture2.FillColor = vbGreen
  60.  Picture2.Circle (midx, midy), r, , -2 * PI * (x + y + z), -2 * PI, 2 / 3
  61.  End If
  62.  
  63. End Sub
  64.  
  65. Private Sub Command2_Click()
  66. 'Guardar
  67. With dpto
  68.      .d = Text1.Text
  69.      .x = Val(Text2.Text)
  70.      .y = Val(Text3.Text)
  71.      .z = Val(Text4.Text)
  72.      .w = Val(Text5.Text)
  73.    End With
  74.  
  75.    NumRecs = 1
  76.    Open App.Path & "\PieData.dat" For Random As #1 Len = Len(dpto)
  77.      Put #1, 1, NumRecs
  78.      Put #1, NumRecs + 1, dpto
  79.    Close #1
  80. End Sub
  81.  
  82. Private Sub Command3_Click()
  83. 'Leer
  84.  
  85.  
  86.  
  87.  
  88. 'If FileLen(App.Path & "\PieData.dat") > 60 Then
  89.    Open App.Path & "\PieData.dat" For Random As #1 Len = Len(dpto)
  90.      Get #1, 1, NumRecs
  91.      Get #1, NumRecs + 1, dpto
  92.  
  93.      With dpto
  94.       Text1.Text = .d
  95.       Text2.Text = Val(.x)
  96.       Text3.Text = Val(.y)
  97.       Text4.Text = Val(.z)
  98.       Text5.Text = Val(.w)
  99. End With
  100.  
  101.  
  102.  
  103.  
  104.    Close #1
  105.    DrawPie
  106.  'End If
  107. End Sub
  108.  
  109. Private Sub Command4_Click()
  110. End
  111. End Sub
  112.  
  113. Private Sub Command5_Click()
  114. Picture2.Cls
  115. Text2.SetFocus
  116. End Sub
  117.  
  118.  
  119.  
  120.  
  121. Private Sub Form_Load()
  122. Text1.Text = Format$(Date, "dd/mm/yyyy")
  123. End Sub
  124.  
  125.  
  126.  
  127.  
  128.  






Gracias


En línea

Serapis
Colaborador
***
Desconectado Desconectado

Mensajes: 3.391


Ver Perfil
Re: poner tanto por ciento en el grafico circular
« Respuesta #2 en: 1 Abril 2022, 13:31 pm »

    ...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 Desconectado

Mensajes: 120


Ver Perfil
Re: poner tanto por ciento en el grafico circular
« Respuesta #3 en: 1 Abril 2022, 14:02 pm »

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
Colaborador
***
Desconectado Desconectado

Mensajes: 3.391


Ver Perfil
Re: poner tanto por ciento en el grafico circular
« Respuesta #4 en: 3 Abril 2022, 03:31 am »

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:
Código
  1. Const PI2           As Double = (3.14159265359 * 2)
  2.  
  3. Private Sub DrawPie()
  4.    Dim x1 As Double, y1 As Double, z1 As Double, w1 As Double
  5.    Dim v1 As Double, v2 As Double, v3 As Double, v4 As Double
  6.    Dim Radio As Double, midX As Double, midY As Double
  7.    Dim sum As Double
  8.    Dim RadioTxt As Single, Angulo As Single, ang1 As Single, ang2 As Single, tX As Integer, tY As Integer
  9.  
  10. 'Text1.Text = Format$(Date, "dd/mm/yyyy")
  11.    Picture2.Cls
  12.    Picture2.FillStyle = 0
  13.  
  14.    x1 = Val(Text2.Text)
  15.    y1 = Val(Text3.Text)
  16.    z1 = Val(Text4.Text)
  17.    w1 = Val(Text5.Text)
  18.  
  19.    sum = (x1 + y1 + z1 + w1)
  20.  
  21.    v1 = (x1 / sum)
  22.    v2 = (y1 / sum)
  23.    v3 = (z1 / sum)
  24.    v4 = (w1 / sum)
  25.  
  26.    midX = (Picture2.Width / 2)
  27.    midY = (Picture2.Height / 2)
  28.    Radio = (Picture2.Width / 3)    ' - 300
  29.    RadioTxt = (Radio / 1.3)
  30.  
  31.    If v1 <> 0 And v2 <> 0 And v3 <> 0 Then
  32.        tY = (Picture2.TextHeight("Y") / 2) ' el alto de la fuente es el mismo para todo caracter o string.
  33.  
  34.        Picture2.FillColor = vbRed
  35.        ang1 = -PI2: ang2 = (-PI2 * v1)
  36.        Picture2.Circle (midX, midY), Radio, , ang1, ang2, 1 ' 2 / 3
  37.        Angulo = (ang2 / 2)
  38.        tX = (Picture2.TextWidth(x1) / 2)
  39.        Call DrawTexto(RadioTxt, Angulo, midX - tX, midY - tY, CStr(x1))  ' Valor absoluto: cstr(x1).     Valor relativo (porcentaje): (cstr(v1) & "%")
  40.  
  41.        Picture2.FillColor = vbYellow
  42.        ang1 = ang2: ang2 = (-PI2 * (v1 + v2))
  43.        Picture2.Circle (midX, midY), Radio, , ang1, ang2, 1 ' 2 / 3
  44.        Angulo = ((ang2 + ang1) / 2)
  45.        tX = (Picture2.TextWidth(y1) / 2)
  46.        Call DrawTexto(RadioTxt, Angulo, midX - tX, midY - tY, CStr(y1))
  47.  
  48.        Picture2.FillColor = vbBlue
  49.        ang1 = ang2: ang2 = (-PI2 * (v1 + v2 + v3))
  50.        Picture2.Circle (midX, midY), Radio, , ang1, ang2, 1 ' 2 / 3
  51.        Angulo = ((ang2 + ang1) / 2)
  52.        tX = (Picture2.TextWidth(z1) / 2)
  53.        Call DrawTexto(RadioTxt, Angulo, midX - tX, midY - tY, CStr(z1))
  54.  
  55.        Picture2.FillColor = vbGreen
  56.        ang1 = ang2: ang2 = -PI2
  57.        Picture2.Circle (midX, midY), Radio, , ang1, ang2, 1 '  2 / 3
  58.        Angulo = ((ang2 + ang1) / 2)
  59.        tX = (Picture2.TextWidth(w1) / 2)
  60.        Call DrawTexto(RadioTxt, Angulo, midX - tX, midY - tY, CStr(w1))
  61.    End If
  62. End Sub
  63.  
  64.  
  65. ' Dibuja el texto centrado en el angulo del arco, y con menor radio que el arco.
  66. ' NOTA: Si el angulo fuera excesivamente pequeno, podria no caber el texto.
  67. ' NOTA: Para el texto puede elegirse entre el valor absoluto (caso actual), o el valor relativo (porcentaje).
  68. Private Sub DrawTexto(ByVal Radio As Single, ByVal Angulo As Single, ByVal EjeX As Integer, ByVal EjeY As Integer, ByRef Texto As String)
  69.    Picture2.CurrentX = (Cos(Angulo) * Radio) + EjeX
  70.    Picture2.CurrentY = (Sin(Angulo) * Radio) + EjeY
  71.    Picture2.ForeColor = vbBlack
  72.    Picture2.Print Texto
  73. End Sub
  74.  

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 Desconectado

Mensajes: 120


Ver Perfil
Re: poner tanto por ciento en el grafico circular
« Respuesta #5 en: 3 Abril 2022, 13:44 pm »

perfecto justo lo que necesitaba


muchisimas gracias serapis
En línea

Serapis
Colaborador
***
Desconectado Desconectado

Mensajes: 3.391


Ver Perfil
Re: poner tanto por ciento en el grafico circular
« Respuesta #6 en: 3 Abril 2022, 15:35 pm »

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 Desconectado

Mensajes: 120


Ver Perfil
Re: poner tanto por ciento en el grafico circular
« Respuesta #7 en: 3 Abril 2022, 15:48 pm »

ok

he puesto el valor relativo en los 4 cajos


Valor relativo (porcentaje): (cstr(v1) & "%")


muchas gracias
En línea

Serapis
Colaborador
***
Desconectado Desconectado

Mensajes: 3.391


Ver Perfil
Re: poner tanto por ciento en el grafico circular
« Respuesta #8 en: 3 Abril 2022, 15:54 pm »

También puedes poner una 'sombra' bajo el círculo, previo a su dibujado:
Código
  1. If ((v1 <> 0) And (v2 <> 0) And (v3 <> 0)) Then
  2.        Picture2.ForeColor = &HB09090
  3.        Picture2.FillColor = &HB09090  'gris perla
  4.        Picture2.Circle (midX + 105, midY + 75), Radio ' simula una sombra de 7x5 píxeles
  5.  
  6.        Picture2.ForeColor = vbBlack
  7.        tY = (Picture2.TextHeight("Y") / 2) ' el alto de la fuente es el mismo para todo carácter o string.
  8.       '... el resto del dibujado.
  9. end if
  10.  
En línea

corlo

Desconectado Desconectado

Mensajes: 120


Ver Perfil
Re: poner tanto por ciento en el grafico circular
« Respuesta #9 en: 3 Abril 2022, 16:21 pm »

ok

es algo parecido en 3d

porque en 3d seria de mas grosor
un ejemplo en 3d

gracias
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
una lista circular en c#
.NET (C#, VB.NET, ASP)
Fingerling 2 13,232 Último mensaje 24 Septiembre 2010, 17:23 pm
por -=[ §ÂßÂÑÐØ ]=-
Convolución Circular
Programación C/C++
drbeat 5 7,166 Último mensaje 2 Marzo 2011, 15:57 pm
por drbeat
El 10 por ciento de las webs son maliciosas
Noticias
wolfbcn 0 1,275 Último mensaje 7 Mayo 2012, 17:49 pm
por wolfbcn
El 74,3 por ciento de los emails son spam
Noticias
wolfbcn 0 1,449 Último mensaje 15 Abril 2013, 14:33 pm
por wolfbcn
Lista circular simple (LCS)
Programación C/C++
Cpp 1 2,367 Último mensaje 11 Diciembre 2014, 01:50 am
por engel lex
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines