Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

103
Vistas
gráfico circular con lienzo - algoritmo - resultado incorrecto

Escribí este algoritmo que, basado en los datos de la matriz, crea un gráfico circular usando el elemento canvas:

 function pieChart() { canvas = document.getElementById('pie-chart'); canvas.width = 300; canvas.height = 300; context = canvas.getContext('2d'); const data = [1, 5, 4, 3]; const colors = ['brown', 'yellow', 'purple', 'pink']; let summ = 0; for (let index = 0; index < data.length; index++) { summ += data[index]; } function deg(num) { return num / summ * 360; } function rad(deg) { return deg * (Math.PI / 180); } let start = 3 * Math.PI / 2; for (let index = 0; index < data.length; index++) { context.beginPath(); context.moveTo(150, 150); context.arc(150, 150, 150, start, rad(deg(data[index])), false); context.lineTo(150, 150); context.fillStyle = colors[index]; context.fill(); start = rad(deg(data[index])); } }
 <body onload="pieChart();"> <canvas id="pie-chart"></canvas> </body>

Aquí está el resultado que obtuve:
ingrese la descripción de la imagen aquí

¿Qué estoy haciendo mal?

about 4 years ago · Juan Pablo Isaza
2 Respuestas
Responde la pregunta

0

Hay dos problemas notables.

  1. start = rad(deg(data[index]));

Está moviendo su ángulo de inicio para que tenga el tamaño de la cuña anterior, cuando en realidad desea agregar el tamaño de la cuña anterior. En cambio, esto debería ser:

 start += rad(deg(data[index]));
  1. context.arc(150, 150, 150, start, rad(deg(data[index])), false);

El ángulo final que especifique aquí es el tamaño del ángulo de cuña. En cambio, debe compensarse desde el ángulo de inicio (es decir, debe agregarle el ángulo de inicio). En cambio, esto debería ser:

 context.arc(150, 150, 150, start, start + rad(deg(data[index])), false); 

 function pieChart() { canvas = document.getElementById('pie-chart'); canvas.width = 300; canvas.height = 300; context = canvas.getContext('2d'); const data = [1, 5, 4, 3]; const colors = ['brown', 'yellow', 'purple', 'pink']; let summ = 0; for (let index = 0; index < data.length; index++) { summ += data[index]; } function deg(num) { return num / summ * 360; } function rad(deg) { return deg * (Math.PI / 180); } let start = 3 * Math.PI / 2; for (let index = 0; index < data.length; index++) { context.beginPath(); context.moveTo(150, 150); context.arc(150, 150, 150, start, start + rad(deg(data[index])), false); context.lineTo(150, 150); context.fillStyle = colors[index]; context.fill(); start += rad(deg(data[index])); } }
 <body onload="pieChart();"> <canvas id="pie-chart"></canvas> </body>

about 4 years ago · Juan Pablo Isaza Denunciar

0

Estabas dibujando cada arco desde el ángulo del último arco hasta el ángulo del nuevo arco pero AMBOS comenzando desde 0. Necesitas SUMAR el ángulo del nuevo arco al resultado anterior.

También tenga en cuenta el último parámetro de la función de arc . Si es falso, el arco se dibuja en el sentido de las agujas del reloj, si es verdadero, se dibuja en el sentido contrario a las agujas del reloj.

https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/arc

 document.addEventListener("DOMContentLoaded", function(){ canvas = document.getElementById('pie-chart'); canvas.width = 300; canvas.height = 300; context = canvas.getContext('2d'); const data = [1, 5, 4, 3]; const colors = ['brown', 'yellow', 'purple', 'pink']; let summ = 0; for (let index = 0; index < data.length; index++) { summ += data[index]; } function deg(num) { return (num / summ) * 360; } function rad(deg) { return deg * (Math.PI / 180); } let lastAngle = 2 * Math.PI; //Starting angle let thisAngle = lastAngle; for (let index = 0; index < data.length; index++) { thisAngle += rad(deg(data[index])); context.beginPath(); context.moveTo(150, 150); context.arc(150, 150, 150, lastAngle, thisAngle, false); context.lineTo(150, 150); context.fillStyle = colors[index]; context.fill(); lastAngle = thisAngle; } } );
 <html> <body> <canvas id="pie-chart"> </canvas> </body> </html>

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda