Canvas rotate from bottom center image angle?

后端 未结 4 1562
小蘑菇
小蘑菇 2020-12-08 03:23

How do you rotate an image with the canvas html5 element from the bottom center angle?


    
        test
         


        
相关标签:
4条回答
  • 2020-12-08 03:50
    <html>
      <head>
        <title>Canvas Pinball flippers by stirfry</title>
        <script type="application/x-javascript">
         /*THIS SCRIPT ADAPTED BY STIRFRY. SOURCE TEETHGRINDER no warranty or liability implied or otherwise. use at your own risk. No credit required. Enjoy.stirfry.thank(you)*/
        var img = new Image();
                                //img.src = "flipper.gif";//right
        img.src="http://i39.tinypic.com/k1vq0x.gif"
        var img2 = new Image();
                                 //img2.src = "flipper2.gif";//left
        img2.src ="http://i42.tinypic.com/14c8wht.gif"
        var gAngle = 0;
        gAngle = 60;
        stop = false;
        inertia = .8;
        vel = 10;
        k = 0.1;
    
        function drawagain(){
          gAngle = 60;
          stop = false;
          inertia = .8;
          vel = 10;
          k = 0.1;
         draw()
       }
    
       function draw(){
         var ctx = document.getElementById('canvas').getContext('2d');
         ctx.save();
    
            vel = ( vel * inertia ) + ( -gAngle * k );
    
            gAngle += vel;
    
            ctx.fillStyle = 'rgb(255,255,255)';
            ctx.fillRect (0, 0, 600, 600);
    
            ctx.translate(380, 480);              //location of the system
            ctx.rotate( gAngle * Math.PI / 180 );//rotate first then draw the flipper
            ctx.drawImage(img, -105, -16); 
    ctx.restore();
    ctx.save();
            ctx.translate(120, 480);              //location of the system
            ctx.rotate( -1*gAngle * Math.PI / 180 );//rotate first then draw the flipper
            ctx.drawImage(img2, -18, -16); 
    
    ctx.restore();
    
            if( !stop )
              setTimeout(draw, 30);
          }
    
        </script>
        <style type="text/css">
          body { margin: 20px; font-family: arial,verdana,helvetica; background: #fff;}
          h1 { font-size: 140%; font-weight:normal; color: #036; border-bottom: 1px solid #ccc; }
          canvas { border: 2px solid #000; float: left; margin-right: 20px; margin-bottom: 20px; }
          pre { float:left; display:block; background: rgb(238,238,238); border: 1px dashed #666; padding: 15px 20px; margin: 0 0 10px 0; }
          .gameLayer {position: absolute; top: 0px; left: 0px;}
          #scoreLayer {font-family: arial; color: #FF0000; left: 10px; font-size: 70%; }
          #windowcontainer {position:relative; height:300px;}
        </style>
      </head>
    
      <body onload="draw()">
        <div id="windowcontainer">
          <canvas id="canvas" width="500" height="500"></canvas>
          <INPUT VALUE="flip" TYPE=BUTTON onClick="drawagain();"><br/>
        </div>
    
      </body>
    </html>
    
    0 讨论(0)
  • 2020-12-08 03:51

    I have used this, when I needed to rotate texts started from their specified point (center)?

    ctx.save(); 
    ctx.translate(x,y);
    ctx.rotate(degree*Math.PI/180);
    ctx.translate(-x,-y);   
    ctx.fillText(text,x,y); 
    ctx.stroke();   
    ctx.restore();
    
    0 讨论(0)
  • 2020-12-08 03:58

    First you have to translate to the point around which you would like to rotate. In this case the image dimensions are 64 x 120. To rotate around the bottom center you want to translate to 32, 120.

    ctx.translate(32, 120);
    

    That brings you to the bottom center of the image. Then rotate the canvas:

    ctx.rotate(90 * Math.PI/180);
    

    Which rotate by 90 degrees.

    Then when you draw the image try this:

    ctx.drawImage(img, -32, -120, 64, 120);
    

    ? Does that work?

    0 讨论(0)
  • 2020-12-08 04:03

    The correct answer is, of course, Vincent's one.
    I fumbled a bit with this rotation/translation thing, and I think my little experiments could be interesting to show:

    <html>
      <head>
        <title>test</title>
        <script type="text/javascript">
        canvasW = canvasH = 800;
        imgW = imgH = 128;
        function startup() {
          var canvas = document.getElementById('canvas');
          var ctx = canvas.getContext('2d');
          // Just to see what I do...
          ctx.strokeRect(0, 0, canvasW, canvasH);
          var img = new Image();
          img.src = 'player.png';
          img.onload = function() {
            // Just for reference
            ctx.drawImage(img, 0, 0, 128, 128);
            ctx.drawImage(img, canvasW/2 - imgW/2, canvasH/2 - imgH/2, 128, 128);
            mark(ctx, "red");
            // Keep current context (transformations)
            ctx.save();
            // Put bottom center at origin
            ctx.translate(imgW/2, imgH);
            // Rotate
            // Beware the next translations/positions are done along the rotated axis
            ctx.rotate(45 * Math.PI / 180);
            // Mark new origin
            mark(ctx, "red");
            // Restore position
            ctx.translate(-imgW/2, -imgH);
            ctx.drawImage(img, 0, 0, imgW, imgH);
            mark(ctx, "green");
            // Draw it an wanted position
            ctx.drawImage(img, canvasW/2, canvasH/3, imgW, imgH);
            // Move elsewhere:
            ctx.translate(canvasW/2, canvasH/2);
            ctx.drawImage(img, 0, 0, imgW, imgH);
            mark(ctx, "blue");
            ctx.restore();
          }
        }
        function mark(ctx, color) {
         ctx.save();
    //~      ctx.fillStyle = color;
    //~      ctx.fillRect(-2, -2, 4, 4);
         ctx.strokeStyle = color;
         ctx.strokeRect(0, 0, imgW, imgH);
         ctx.restore();
        }
        </script>
      </head>
      <body onload='startup();'>
        <canvas id="canvas" style="position: absolute; left: 300px; top: 300px;" width="800" height="800"></canvas>
      </body>
    </html>
    

    My stumbling issue was that positioning the rotated figure is hard, because it is along the rotated axis: either we have to do some trigo math to paint at the primitive origin, or we have to draw on a secondary hidden canvas and then paint it on the target one.
    Unless somebody else has a better idea?

    0 讨论(0)
提交回复
热议问题