<!DOCTYPE html>
<html>

  <head>
    <script data-require="pixi.js@*" data-semver="3.0.7" src="https://cdnjs.cloudflare.com/ajax/libs/pixi.js/3.0.7/pixi.js"></script>
    <script data-require="jquery@*" data-semver="2.1.4" src="http://code.jquery.com/jquery-2.1.4.min.js"></script>
    <script data-require="jquery-mousewheel@*" data-semver="3.1.13" src="//cdnjs.cloudflare.com/ajax/libs/jquery-mousewheel/3.1.13/jquery.mousewheel.min.js"></script>
    <link rel="stylesheet" href="style.css" />
  </head>

  <body>
  Old Scale:<span id='oldScale'></span><br />
  New Scale:<span id='scale'></span><br />
  <br>
  Correction:<span id='c'></span><br />
  <br>
  Old XY:<span id='oldXY'></span><br />
  New XY:<span id='xy'></span><br />
  <canvas id='canvas'></canvas>
    <script src="script.js"></script>
  </body>

</html>
// Code goes here
var stage = new PIXI.Stage();
stage.scale.x = 10;
stage.scale.y = 10;
var canvas = document.getElementById('canvas');
var renderer = PIXI.autoDetectRenderer(610, 610, {view:canvas});
var g = new PIXI.Graphics();

g.lineStyle(0.2, 0xFFFF00);
g.beginFill(0xFF0000);
g.drawCircle(5, 5, 1);
g.drawCircle(25, 15, 0.3);
g.drawCircle(20, 20, 5);
g.endFill();
g.drawPolygon([0,0,60,0,60,60,0,60]);
g.drawPolygon([15,15,0.75*60,15,0.75*60,0.75*60,15,0.75*60]);

g.drawCircle(60/2, 60/2, 1);
g.endFill();
stage.addChild(g);
requestAnimationFrame(animate);


function animate() {
  requestAnimationFrame(
    animate);
  renderer.render(stage);
}

function zoom(s,x,y){
 
  s = s > 0 ? 2 : 0.5;
  document.getElementById("oldScale").innerHTML = stage.scale.x.toFixed(4);
  document.getElementById("oldXY").innerHTML = '('+stage.x.toFixed(4)+','+stage.y.toFixed(4)+')';
  var worldPos = {x: (x - stage.x) / stage.scale.x, y: (y - stage.y)/stage.scale.y};
  var newScale = {x: stage.scale.x * s, y: stage.scale.y * s};
  
  var newScreenPos = {x: (worldPos.x ) * newScale.x + stage.x, y: (worldPos.y) * newScale.y + stage.y};

  stage.x -= (newScreenPos.x-x) ;
  stage.y -= (newScreenPos.y-y) ;
  stage.scale.x = newScale.x;
  stage.scale.y = newScale.y;
  document.getElementById("scale").innerHTML = newScale.x.toFixed(4);
  document.getElementById("xy").innerHTML = '('+stage.x.toFixed(4)+','+stage.y.toFixed(4)+')';
  
  document.getElementById("c").innerHTML=c;
};

var lastPos = null
$(canvas)
  .mousewheel(function(e){
  zoom(e.deltaY, e.offsetX, e.offsetY)
}).mousedown(function(e) {
  lastPos = {x:e.offsetX,y:e.offsetY};
}).mouseup(function(event) {
  lastPos = null;
}).mousemove(function(e){
  if(lastPos) {
    
    stage.x += (e.offsetX-lastPos.x);
    stage.y += (e.offsetY-lastPos.y);  
    lastPos = {x:e.offsetX,y:e.offsetY};
  }
  
});
/* Styles go here */