Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
2
respuestas

Ayuda Optimizar Codigo de Flor

Después de leerme las opciones dentro de CanvasRenderingContext2D que mostraron durante la explicación de canvas y pincel me dieron ganas de experimentar un poco con las cosas, así que hice el ejercicio de la Flor como se pedía y además decidí hacer una donde los pétalos son curvas en lugar de círculos pero no me gusta como quedo el código dentro del For que hice en la función dibujarFlorV2. Si alguien se le ocurre como optimizarlo para no tener que hacer un If en cada iteración del For le agradecería que me dijera.

resultado ejercicio Flor

<canvas width="600" height="400"></canvas>

<script>

    var pantalla = document.querySelector("canvas");
    var pincel = pantalla.getContext("2d");
    pincel.fillStyle = "lightgray";
    pincel.fillRect(0, 0, 600, 400);

    function dibujarCirculo(x, y, radio, color) {

        pincel.fillStyle = color;
        pincel.beginPath();
        pincel.arc(x, y, radio, 0, 2*3.14);
        pincel.fill();
    }

    function dibujarFlor(x,y,radio) 
    {
        dibujarCirculo(x, y, radio, "red");
        dibujarCirculo(x, y+(radio*2), radio, "blue");
        dibujarCirculo(x, y-(radio*2), radio, "yellow");
        dibujarCirculo(x-(radio*2), y, radio, "orange");
        dibujarCirculo(x+(radio*2), y, radio, "black");
     }


    function dibujarFlorV2(posX, posY, radio, aperturaPetalo, color, colorCentro)
    {
        pincel.fillStyle = color;
        for (var petalos = 1; petalos <= 4; petalos++) 
        {
            if(petalos == 1){
                pincel.beginPath();
                pincel.moveTo(posX - radio, posY);
                pincel.quadraticCurveTo(posX, posY-aperturaPetalo, posX + radio, posY);
                pincel.fill();
            }
            if(petalos== 2){
                pincel.beginPath();
                pincel.moveTo(posX, posY - radio);
                pincel.quadraticCurveTo(posX + aperturaPetalo, posY, posX, posY+radio);
                pincel.fill();
            }
            if(petalos == 3){
                pincel.beginPath();
                pincel.moveTo(posX - radio, posY);
                pincel.quadraticCurveTo(posX, posY+aperturaPetalo, posX + radio, posY);
                pincel.fill();
            }
            if(petalos == 4){
                pincel.beginPath();
                pincel.moveTo(posX, posY - radio);
                pincel.quadraticCurveTo(posX - aperturaPetalo, posY, posX, posY+radio);
                pincel.fill();
            }
        }
        dibujarCirculo(posX,posY,radio,colorCentro)
    }

    dibujarFlorV2(150,100,25,125,"green", "cyan");
    dibujarFlorV2(450,100,25,125,"green", "cyan");
    dibujarFlorV2(150,300,25,125,"purple", "pink");
    dibujarFlorV2(450,300,25,125,"purple", "pink");

    dibujarFlor(300,200,25);

</script>

2 respuestas

¡Hola buenas!

Me parece súper interesante tu código. No sabía que se podía variar la forma de los pétalos de tantas maneras. Sobre tu pregunta, no sé si lo optimiza, pero en lugar de tener muchos bloques if, podrías colocar todo en un solo bloque usando switch. Esto es lo que intenté con tu código y al parecer funciona. ¡Me dices si te ayuda!

<canvas width="600" height="400"></canvas>

<script>

  var pantalla = document.querySelector("canvas");
  var pincel = pantalla.getContext("2d");
  pincel.fillStyle = "lightgray";
  pincel.fillRect(0, 0, 600, 400);

  function dibujarCirculo(x, y, radio, color) {

    pincel.fillStyle = color;
    pincel.beginPath();
    pincel.arc(x, y, radio, 0, 2*3.14);
    pincel.fill();
  }

  function dibujarFlor(x,y,radio)
  {
    dibujarCirculo(x, y, radio, "red");
    dibujarCirculo(x, y+(radio*2), radio, "blue");
    dibujarCirculo(x, y-(radio*2), radio, "yellow");
    dibujarCirculo(x-(radio*2), y, radio, "orange");
    dibujarCirculo(x+(radio*2), y, radio, "black");
  }


  function dibujarFlorV2(posX, posY, radio, aperturaPetalo, color, colorCentro)
  {
    pincel.fillStyle = color;
    for (var petalos = 1; petalos <= 4; petalos++)
    {
      switch (petalos){
        case 1:
          pincel.beginPath();
          pincel.moveTo(posX - radio, posY);
          pincel.quadraticCurveTo(posX, posY-aperturaPetalo, posX + radio, posY);
          pincel.fill();
          break
        case 2:
          pincel.beginPath();
          pincel.moveTo(posX, posY - radio);
          pincel.quadraticCurveTo(posX + aperturaPetalo, posY, posX, posY+radio);
          pincel.fill();
          break
        case 3:
          pincel.beginPath();
          pincel.moveTo(posX - radio, posY);
          pincel.quadraticCurveTo(posX, posY+aperturaPetalo, posX + radio, posY);
          pincel.fill();
          break
        case 4:
          pincel.beginPath();
          pincel.moveTo(posX, posY - radio);
          pincel.quadraticCurveTo(posX - aperturaPetalo, posY, posX, posY+radio);
          pincel.fill();
          break
      }

    }
    dibujarCirculo(posX,posY,radio,colorCentro)
  }

  dibujarFlorV2(150,100,25,125,"green", "cyan");
  dibujarFlorV2(450,100,25,125,"green", "cyan");
  dibujarFlorV2(150,300,25,125,"purple", "pink");
  dibujarFlorV2(450,300,25,125,"purple", "pink");

Hola, gracias por la aportación, si originalmente lo había hecho con un switch pero lo pase a if para que sea mas entendible para cualquiera. Pero lo que quería lograr era que se hagan las iteraciones sin necesidad de usar condicionales/verificaciones, después de pensarlo por un tiempo se me ocurrió una manera y a mi parecer queda mejor que usando switch o if

function dibujarFlorV2(posX, posY, radio, aperturaPetalo, color, colorCentro)
    {
        pincel.fillStyle = color;
        for (var petalosX = -1; petalosX < 2; petalosX = petalosX + 2) 
        {
            pincel.beginPath();
            pincel.moveTo(posX - radio, posY);
            pincel.quadraticCurveTo(posX, posY + (aperturaPetalo*petalosX), posX + radio, posY);
            pincel.fill();
        }
        for (var petalosY = -1; petalosY < 2; petalosY = petalosY + 2) 
        {
            pincel.beginPath();
            pincel.moveTo(posX, posY - radio);
            pincel.quadraticCurveTo(posX + (aperturaPetalo*petalosY), posY, posX, posY+radio);
            pincel.fill();
        }

        dibujarCirculo(posX,posY,radio,colorCentro)
    }

me había acostumbrado a usar el parámetro del for con valor inicial 0, pero nada me impide que sea negativo inicialmente