How to create a paper.js Path.Circle that can be scaled/translated with affine matrix, but keep circle radius...












0















I have a paper.js layer where users can draw different paths (circles, line, etc). This layer can be panned or zoomed using mouse scrolling or dragging. I use affine matrix transformation to zoom/pan paths in this layer. This works rather well.



What i'm looking for is to create a circle (Path.Circle object) that can be panned and zoomed using matrix, just its radius has to be always fixed (5px for example). So basically matrix transformation needs to be applied only to position of circle, but not to outline of it.



Below is sample of a circle with radius 20px transformedPath, that is zoomed to 2x. Questions is how to keep radius of circle transformedPath fixed (radius = 20px), while applying the matrix transformation.



var transformedPath = new paper.Path.Circle(100,100,20);

transformedPath.strokeColor = 'black';

paper.project.activeLayer.matrix = new paper.Matrix(
2, 0,
0, 2,
0, 0
);




UPDATE. Here's a more general sketch (code below) that is based on solution suggested by sasensi. In this sample blue circle radius stays fixed (this is correct), but problem is that blue circle also stays on the same place instead.
enter image description here



The desired outcome is that both circles move to new position, but blue circle radius stays fixed.



// draw a normal circle
var normalCircle = new Path.Circle({
center: new Point(100,100),
radius: 50,
fillColor: 'orange',
});

// draw another circle that will have scale transformation reversed
var notScalingCircle = new Path.Circle({
center: new Point(100,100),
radius: 30,
fillColor: 'blue',
});

// draw instructions
new PointText({
content: 'press mouse button down to zoom in and see that blue circle size does not change',
point: view.center + [0, -80],
justification: 'center'
});

function transformLayer(matrix) {
// scale layer
// project.activeLayer.applyMatrix = false;
project.activeLayer.matrix = matrix;

// scale item with inverted amount to make it display like if it was not scaled with the layer
notScalingCircle.matrix = matrix.clone().invert();
}

var matrix = new paper.Matrix(
2,0,
0,1.5,
50,30
);

// on mouse down...
function onMouseDown() {
// ...scale up
transformLayer(matrix);
}

// on mouse up...
function onMouseUp() {
// ...scale down
transformLayer(matrix.clone().invert());
}









share|improve this question





























    0















    I have a paper.js layer where users can draw different paths (circles, line, etc). This layer can be panned or zoomed using mouse scrolling or dragging. I use affine matrix transformation to zoom/pan paths in this layer. This works rather well.



    What i'm looking for is to create a circle (Path.Circle object) that can be panned and zoomed using matrix, just its radius has to be always fixed (5px for example). So basically matrix transformation needs to be applied only to position of circle, but not to outline of it.



    Below is sample of a circle with radius 20px transformedPath, that is zoomed to 2x. Questions is how to keep radius of circle transformedPath fixed (radius = 20px), while applying the matrix transformation.



    var transformedPath = new paper.Path.Circle(100,100,20);

    transformedPath.strokeColor = 'black';

    paper.project.activeLayer.matrix = new paper.Matrix(
    2, 0,
    0, 2,
    0, 0
    );




    UPDATE. Here's a more general sketch (code below) that is based on solution suggested by sasensi. In this sample blue circle radius stays fixed (this is correct), but problem is that blue circle also stays on the same place instead.
    enter image description here



    The desired outcome is that both circles move to new position, but blue circle radius stays fixed.



    // draw a normal circle
    var normalCircle = new Path.Circle({
    center: new Point(100,100),
    radius: 50,
    fillColor: 'orange',
    });

    // draw another circle that will have scale transformation reversed
    var notScalingCircle = new Path.Circle({
    center: new Point(100,100),
    radius: 30,
    fillColor: 'blue',
    });

    // draw instructions
    new PointText({
    content: 'press mouse button down to zoom in and see that blue circle size does not change',
    point: view.center + [0, -80],
    justification: 'center'
    });

    function transformLayer(matrix) {
    // scale layer
    // project.activeLayer.applyMatrix = false;
    project.activeLayer.matrix = matrix;

    // scale item with inverted amount to make it display like if it was not scaled with the layer
    notScalingCircle.matrix = matrix.clone().invert();
    }

    var matrix = new paper.Matrix(
    2,0,
    0,1.5,
    50,30
    );

    // on mouse down...
    function onMouseDown() {
    // ...scale up
    transformLayer(matrix);
    }

    // on mouse up...
    function onMouseUp() {
    // ...scale down
    transformLayer(matrix.clone().invert());
    }









    share|improve this question



























      0












      0








      0








      I have a paper.js layer where users can draw different paths (circles, line, etc). This layer can be panned or zoomed using mouse scrolling or dragging. I use affine matrix transformation to zoom/pan paths in this layer. This works rather well.



      What i'm looking for is to create a circle (Path.Circle object) that can be panned and zoomed using matrix, just its radius has to be always fixed (5px for example). So basically matrix transformation needs to be applied only to position of circle, but not to outline of it.



      Below is sample of a circle with radius 20px transformedPath, that is zoomed to 2x. Questions is how to keep radius of circle transformedPath fixed (radius = 20px), while applying the matrix transformation.



      var transformedPath = new paper.Path.Circle(100,100,20);

      transformedPath.strokeColor = 'black';

      paper.project.activeLayer.matrix = new paper.Matrix(
      2, 0,
      0, 2,
      0, 0
      );




      UPDATE. Here's a more general sketch (code below) that is based on solution suggested by sasensi. In this sample blue circle radius stays fixed (this is correct), but problem is that blue circle also stays on the same place instead.
      enter image description here



      The desired outcome is that both circles move to new position, but blue circle radius stays fixed.



      // draw a normal circle
      var normalCircle = new Path.Circle({
      center: new Point(100,100),
      radius: 50,
      fillColor: 'orange',
      });

      // draw another circle that will have scale transformation reversed
      var notScalingCircle = new Path.Circle({
      center: new Point(100,100),
      radius: 30,
      fillColor: 'blue',
      });

      // draw instructions
      new PointText({
      content: 'press mouse button down to zoom in and see that blue circle size does not change',
      point: view.center + [0, -80],
      justification: 'center'
      });

      function transformLayer(matrix) {
      // scale layer
      // project.activeLayer.applyMatrix = false;
      project.activeLayer.matrix = matrix;

      // scale item with inverted amount to make it display like if it was not scaled with the layer
      notScalingCircle.matrix = matrix.clone().invert();
      }

      var matrix = new paper.Matrix(
      2,0,
      0,1.5,
      50,30
      );

      // on mouse down...
      function onMouseDown() {
      // ...scale up
      transformLayer(matrix);
      }

      // on mouse up...
      function onMouseUp() {
      // ...scale down
      transformLayer(matrix.clone().invert());
      }









      share|improve this question
















      I have a paper.js layer where users can draw different paths (circles, line, etc). This layer can be panned or zoomed using mouse scrolling or dragging. I use affine matrix transformation to zoom/pan paths in this layer. This works rather well.



      What i'm looking for is to create a circle (Path.Circle object) that can be panned and zoomed using matrix, just its radius has to be always fixed (5px for example). So basically matrix transformation needs to be applied only to position of circle, but not to outline of it.



      Below is sample of a circle with radius 20px transformedPath, that is zoomed to 2x. Questions is how to keep radius of circle transformedPath fixed (radius = 20px), while applying the matrix transformation.



      var transformedPath = new paper.Path.Circle(100,100,20);

      transformedPath.strokeColor = 'black';

      paper.project.activeLayer.matrix = new paper.Matrix(
      2, 0,
      0, 2,
      0, 0
      );




      UPDATE. Here's a more general sketch (code below) that is based on solution suggested by sasensi. In this sample blue circle radius stays fixed (this is correct), but problem is that blue circle also stays on the same place instead.
      enter image description here



      The desired outcome is that both circles move to new position, but blue circle radius stays fixed.



      // draw a normal circle
      var normalCircle = new Path.Circle({
      center: new Point(100,100),
      radius: 50,
      fillColor: 'orange',
      });

      // draw another circle that will have scale transformation reversed
      var notScalingCircle = new Path.Circle({
      center: new Point(100,100),
      radius: 30,
      fillColor: 'blue',
      });

      // draw instructions
      new PointText({
      content: 'press mouse button down to zoom in and see that blue circle size does not change',
      point: view.center + [0, -80],
      justification: 'center'
      });

      function transformLayer(matrix) {
      // scale layer
      // project.activeLayer.applyMatrix = false;
      project.activeLayer.matrix = matrix;

      // scale item with inverted amount to make it display like if it was not scaled with the layer
      notScalingCircle.matrix = matrix.clone().invert();
      }

      var matrix = new paper.Matrix(
      2,0,
      0,1.5,
      50,30
      );

      // on mouse down...
      function onMouseDown() {
      // ...scale up
      transformLayer(matrix);
      }

      // on mouse up...
      function onMouseUp() {
      // ...scale down
      transformLayer(matrix.clone().invert());
      }






      javascript paperjs






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Nov 22 '18 at 8:37







      Andriy B

















      asked Nov 21 '18 at 13:08









      Andriy BAndriy B

      654418




      654418
























          1 Answer
          1






          active

          oldest

          votes


















          2














          I think that the best way do that is, when you scale your layer with a given amount, to scale your circle with the inverted amount.

          That will make your circle look like if it was not scaled.

          Here is a sketch demonstrating the solution:



          // draw a normal circle
          var normalCircle = new Path.Circle({
          center: view.center,
          radius: 50,
          fillColor: 'orange'
          });

          // draw another circle that will have scale transformation reversed
          var notScalingCircle = new Path.Circle({
          center: view.center,
          radius: 30,
          fillColor: 'blue'
          });

          // draw instructions
          new PointText({
          content: 'press mouse button down to zoom in and see that blue circle size does not change',
          point: view.center + [0, -80],
          justification: 'center'
          });

          function scaleLayer(amount) {
          // scale layer
          project.activeLayer.scale(amount, view.center);
          // scale item with inverted amount to make it display like if it was not scaled with the layer
          notScalingCircle.scale(1 / amount);
          }

          // on mouse down...
          function onMouseDown() {
          // ...scale up
          scaleLayer(3);
          }

          // on mouse up...
          function onMouseUp() {
          // ...scale down
          scaleLayer(1 / 3);
          }


          Edit



          In response to the new example, you just have to invert the scaling transformation on the item and not all the matrix (which also include translation and rotation).

          Here is the corrected sketch:



          // draw a normal circle
          var normalCircle = new Path.Circle({
          center: new Point(100, 100),
          radius: 50,
          fillColor: 'orange'
          });

          // draw another circle that will have scale transformation reversed
          var notScalingCircle = new Path.Circle({
          center: new Point(100, 100),
          radius: 30,
          fillColor: 'blue'
          });

          // draw instructions
          new PointText({
          content: 'press mouse button down to zoom in and see that blue circle size does not change',
          point: view.center + [0, -80],
          justification: 'center'
          });

          function transformLayer(matrix) {
          // scale layer
          // project.activeLayer.applyMatrix = false;
          project.activeLayer.matrix = matrix;

          // just invert the scale and not all matrix
          notScalingCircle.scale(1 / matrix.scaling.x, 1 / matrix.scaling.y);
          }

          var matrix = new paper.Matrix(
          2, 0,
          0, 1.5,
          50, 30
          );

          // on mouse down...
          function onMouseDown() {
          // ...scale up
          transformLayer(matrix);
          }

          // on mouse up...
          function onMouseUp() {
          // ...scale down
          transformLayer(matrix.clone().invert());
          }





          share|improve this answer


























          • Thanks! This looks like a good solution, but it works properly only when circles are placed at [0,0]. To illustrate what i mean, i edited your sketch (see link on the next my comment) with a more general case. Problem is that on mouse down, the blue circle stays on the same place.

            – Andriy B
            Nov 22 '18 at 8:10











          • I don't seem to be able to share the link with you in comment due the limit on characters, so i'll update my original post with it.

            – Andriy B
            Nov 22 '18 at 8:12











          • Ok, I'll have a look at it, my example was just about general principle but it have to be adapted to your real use case.

            – sasensi
            Nov 22 '18 at 8:13











          • Try to produce an example as close as your real use case as possible and I'll help you resolve it.

            – sasensi
            Nov 22 '18 at 8:14











          • I've updated my original post with UPD, but i think we're closer now to final solution. Thanks!

            – Andriy B
            Nov 22 '18 at 8:16











          Your Answer






          StackExchange.ifUsing("editor", function () {
          StackExchange.using("externalEditor", function () {
          StackExchange.using("snippets", function () {
          StackExchange.snippets.init();
          });
          });
          }, "code-snippets");

          StackExchange.ready(function() {
          var channelOptions = {
          tags: "".split(" "),
          id: "1"
          };
          initTagRenderer("".split(" "), "".split(" "), channelOptions);

          StackExchange.using("externalEditor", function() {
          // Have to fire editor after snippets, if snippets enabled
          if (StackExchange.settings.snippets.snippetsEnabled) {
          StackExchange.using("snippets", function() {
          createEditor();
          });
          }
          else {
          createEditor();
          }
          });

          function createEditor() {
          StackExchange.prepareEditor({
          heartbeatType: 'answer',
          autoActivateHeartbeat: false,
          convertImagesToLinks: true,
          noModals: true,
          showLowRepImageUploadWarning: true,
          reputationToPostImages: 10,
          bindNavPrevention: true,
          postfix: "",
          imageUploader: {
          brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
          contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
          allowUrls: true
          },
          onDemand: true,
          discardSelector: ".discard-answer"
          ,immediatelyShowMarkdownHelp:true
          });


          }
          });














          draft saved

          draft discarded


















          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53412765%2fhow-to-create-a-paper-js-path-circle-that-can-be-scaled-translated-with-affine-m%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown

























          1 Answer
          1






          active

          oldest

          votes








          1 Answer
          1






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes









          2














          I think that the best way do that is, when you scale your layer with a given amount, to scale your circle with the inverted amount.

          That will make your circle look like if it was not scaled.

          Here is a sketch demonstrating the solution:



          // draw a normal circle
          var normalCircle = new Path.Circle({
          center: view.center,
          radius: 50,
          fillColor: 'orange'
          });

          // draw another circle that will have scale transformation reversed
          var notScalingCircle = new Path.Circle({
          center: view.center,
          radius: 30,
          fillColor: 'blue'
          });

          // draw instructions
          new PointText({
          content: 'press mouse button down to zoom in and see that blue circle size does not change',
          point: view.center + [0, -80],
          justification: 'center'
          });

          function scaleLayer(amount) {
          // scale layer
          project.activeLayer.scale(amount, view.center);
          // scale item with inverted amount to make it display like if it was not scaled with the layer
          notScalingCircle.scale(1 / amount);
          }

          // on mouse down...
          function onMouseDown() {
          // ...scale up
          scaleLayer(3);
          }

          // on mouse up...
          function onMouseUp() {
          // ...scale down
          scaleLayer(1 / 3);
          }


          Edit



          In response to the new example, you just have to invert the scaling transformation on the item and not all the matrix (which also include translation and rotation).

          Here is the corrected sketch:



          // draw a normal circle
          var normalCircle = new Path.Circle({
          center: new Point(100, 100),
          radius: 50,
          fillColor: 'orange'
          });

          // draw another circle that will have scale transformation reversed
          var notScalingCircle = new Path.Circle({
          center: new Point(100, 100),
          radius: 30,
          fillColor: 'blue'
          });

          // draw instructions
          new PointText({
          content: 'press mouse button down to zoom in and see that blue circle size does not change',
          point: view.center + [0, -80],
          justification: 'center'
          });

          function transformLayer(matrix) {
          // scale layer
          // project.activeLayer.applyMatrix = false;
          project.activeLayer.matrix = matrix;

          // just invert the scale and not all matrix
          notScalingCircle.scale(1 / matrix.scaling.x, 1 / matrix.scaling.y);
          }

          var matrix = new paper.Matrix(
          2, 0,
          0, 1.5,
          50, 30
          );

          // on mouse down...
          function onMouseDown() {
          // ...scale up
          transformLayer(matrix);
          }

          // on mouse up...
          function onMouseUp() {
          // ...scale down
          transformLayer(matrix.clone().invert());
          }





          share|improve this answer


























          • Thanks! This looks like a good solution, but it works properly only when circles are placed at [0,0]. To illustrate what i mean, i edited your sketch (see link on the next my comment) with a more general case. Problem is that on mouse down, the blue circle stays on the same place.

            – Andriy B
            Nov 22 '18 at 8:10











          • I don't seem to be able to share the link with you in comment due the limit on characters, so i'll update my original post with it.

            – Andriy B
            Nov 22 '18 at 8:12











          • Ok, I'll have a look at it, my example was just about general principle but it have to be adapted to your real use case.

            – sasensi
            Nov 22 '18 at 8:13











          • Try to produce an example as close as your real use case as possible and I'll help you resolve it.

            – sasensi
            Nov 22 '18 at 8:14











          • I've updated my original post with UPD, but i think we're closer now to final solution. Thanks!

            – Andriy B
            Nov 22 '18 at 8:16
















          2














          I think that the best way do that is, when you scale your layer with a given amount, to scale your circle with the inverted amount.

          That will make your circle look like if it was not scaled.

          Here is a sketch demonstrating the solution:



          // draw a normal circle
          var normalCircle = new Path.Circle({
          center: view.center,
          radius: 50,
          fillColor: 'orange'
          });

          // draw another circle that will have scale transformation reversed
          var notScalingCircle = new Path.Circle({
          center: view.center,
          radius: 30,
          fillColor: 'blue'
          });

          // draw instructions
          new PointText({
          content: 'press mouse button down to zoom in and see that blue circle size does not change',
          point: view.center + [0, -80],
          justification: 'center'
          });

          function scaleLayer(amount) {
          // scale layer
          project.activeLayer.scale(amount, view.center);
          // scale item with inverted amount to make it display like if it was not scaled with the layer
          notScalingCircle.scale(1 / amount);
          }

          // on mouse down...
          function onMouseDown() {
          // ...scale up
          scaleLayer(3);
          }

          // on mouse up...
          function onMouseUp() {
          // ...scale down
          scaleLayer(1 / 3);
          }


          Edit



          In response to the new example, you just have to invert the scaling transformation on the item and not all the matrix (which also include translation and rotation).

          Here is the corrected sketch:



          // draw a normal circle
          var normalCircle = new Path.Circle({
          center: new Point(100, 100),
          radius: 50,
          fillColor: 'orange'
          });

          // draw another circle that will have scale transformation reversed
          var notScalingCircle = new Path.Circle({
          center: new Point(100, 100),
          radius: 30,
          fillColor: 'blue'
          });

          // draw instructions
          new PointText({
          content: 'press mouse button down to zoom in and see that blue circle size does not change',
          point: view.center + [0, -80],
          justification: 'center'
          });

          function transformLayer(matrix) {
          // scale layer
          // project.activeLayer.applyMatrix = false;
          project.activeLayer.matrix = matrix;

          // just invert the scale and not all matrix
          notScalingCircle.scale(1 / matrix.scaling.x, 1 / matrix.scaling.y);
          }

          var matrix = new paper.Matrix(
          2, 0,
          0, 1.5,
          50, 30
          );

          // on mouse down...
          function onMouseDown() {
          // ...scale up
          transformLayer(matrix);
          }

          // on mouse up...
          function onMouseUp() {
          // ...scale down
          transformLayer(matrix.clone().invert());
          }





          share|improve this answer


























          • Thanks! This looks like a good solution, but it works properly only when circles are placed at [0,0]. To illustrate what i mean, i edited your sketch (see link on the next my comment) with a more general case. Problem is that on mouse down, the blue circle stays on the same place.

            – Andriy B
            Nov 22 '18 at 8:10











          • I don't seem to be able to share the link with you in comment due the limit on characters, so i'll update my original post with it.

            – Andriy B
            Nov 22 '18 at 8:12











          • Ok, I'll have a look at it, my example was just about general principle but it have to be adapted to your real use case.

            – sasensi
            Nov 22 '18 at 8:13











          • Try to produce an example as close as your real use case as possible and I'll help you resolve it.

            – sasensi
            Nov 22 '18 at 8:14











          • I've updated my original post with UPD, but i think we're closer now to final solution. Thanks!

            – Andriy B
            Nov 22 '18 at 8:16














          2












          2








          2







          I think that the best way do that is, when you scale your layer with a given amount, to scale your circle with the inverted amount.

          That will make your circle look like if it was not scaled.

          Here is a sketch demonstrating the solution:



          // draw a normal circle
          var normalCircle = new Path.Circle({
          center: view.center,
          radius: 50,
          fillColor: 'orange'
          });

          // draw another circle that will have scale transformation reversed
          var notScalingCircle = new Path.Circle({
          center: view.center,
          radius: 30,
          fillColor: 'blue'
          });

          // draw instructions
          new PointText({
          content: 'press mouse button down to zoom in and see that blue circle size does not change',
          point: view.center + [0, -80],
          justification: 'center'
          });

          function scaleLayer(amount) {
          // scale layer
          project.activeLayer.scale(amount, view.center);
          // scale item with inverted amount to make it display like if it was not scaled with the layer
          notScalingCircle.scale(1 / amount);
          }

          // on mouse down...
          function onMouseDown() {
          // ...scale up
          scaleLayer(3);
          }

          // on mouse up...
          function onMouseUp() {
          // ...scale down
          scaleLayer(1 / 3);
          }


          Edit



          In response to the new example, you just have to invert the scaling transformation on the item and not all the matrix (which also include translation and rotation).

          Here is the corrected sketch:



          // draw a normal circle
          var normalCircle = new Path.Circle({
          center: new Point(100, 100),
          radius: 50,
          fillColor: 'orange'
          });

          // draw another circle that will have scale transformation reversed
          var notScalingCircle = new Path.Circle({
          center: new Point(100, 100),
          radius: 30,
          fillColor: 'blue'
          });

          // draw instructions
          new PointText({
          content: 'press mouse button down to zoom in and see that blue circle size does not change',
          point: view.center + [0, -80],
          justification: 'center'
          });

          function transformLayer(matrix) {
          // scale layer
          // project.activeLayer.applyMatrix = false;
          project.activeLayer.matrix = matrix;

          // just invert the scale and not all matrix
          notScalingCircle.scale(1 / matrix.scaling.x, 1 / matrix.scaling.y);
          }

          var matrix = new paper.Matrix(
          2, 0,
          0, 1.5,
          50, 30
          );

          // on mouse down...
          function onMouseDown() {
          // ...scale up
          transformLayer(matrix);
          }

          // on mouse up...
          function onMouseUp() {
          // ...scale down
          transformLayer(matrix.clone().invert());
          }





          share|improve this answer















          I think that the best way do that is, when you scale your layer with a given amount, to scale your circle with the inverted amount.

          That will make your circle look like if it was not scaled.

          Here is a sketch demonstrating the solution:



          // draw a normal circle
          var normalCircle = new Path.Circle({
          center: view.center,
          radius: 50,
          fillColor: 'orange'
          });

          // draw another circle that will have scale transformation reversed
          var notScalingCircle = new Path.Circle({
          center: view.center,
          radius: 30,
          fillColor: 'blue'
          });

          // draw instructions
          new PointText({
          content: 'press mouse button down to zoom in and see that blue circle size does not change',
          point: view.center + [0, -80],
          justification: 'center'
          });

          function scaleLayer(amount) {
          // scale layer
          project.activeLayer.scale(amount, view.center);
          // scale item with inverted amount to make it display like if it was not scaled with the layer
          notScalingCircle.scale(1 / amount);
          }

          // on mouse down...
          function onMouseDown() {
          // ...scale up
          scaleLayer(3);
          }

          // on mouse up...
          function onMouseUp() {
          // ...scale down
          scaleLayer(1 / 3);
          }


          Edit



          In response to the new example, you just have to invert the scaling transformation on the item and not all the matrix (which also include translation and rotation).

          Here is the corrected sketch:



          // draw a normal circle
          var normalCircle = new Path.Circle({
          center: new Point(100, 100),
          radius: 50,
          fillColor: 'orange'
          });

          // draw another circle that will have scale transformation reversed
          var notScalingCircle = new Path.Circle({
          center: new Point(100, 100),
          radius: 30,
          fillColor: 'blue'
          });

          // draw instructions
          new PointText({
          content: 'press mouse button down to zoom in and see that blue circle size does not change',
          point: view.center + [0, -80],
          justification: 'center'
          });

          function transformLayer(matrix) {
          // scale layer
          // project.activeLayer.applyMatrix = false;
          project.activeLayer.matrix = matrix;

          // just invert the scale and not all matrix
          notScalingCircle.scale(1 / matrix.scaling.x, 1 / matrix.scaling.y);
          }

          var matrix = new paper.Matrix(
          2, 0,
          0, 1.5,
          50, 30
          );

          // on mouse down...
          function onMouseDown() {
          // ...scale up
          transformLayer(matrix);
          }

          // on mouse up...
          function onMouseUp() {
          // ...scale down
          transformLayer(matrix.clone().invert());
          }






          share|improve this answer














          share|improve this answer



          share|improve this answer








          edited Nov 22 '18 at 8:30

























          answered Nov 21 '18 at 18:42









          sasensisasensi

          1,233114




          1,233114













          • Thanks! This looks like a good solution, but it works properly only when circles are placed at [0,0]. To illustrate what i mean, i edited your sketch (see link on the next my comment) with a more general case. Problem is that on mouse down, the blue circle stays on the same place.

            – Andriy B
            Nov 22 '18 at 8:10











          • I don't seem to be able to share the link with you in comment due the limit on characters, so i'll update my original post with it.

            – Andriy B
            Nov 22 '18 at 8:12











          • Ok, I'll have a look at it, my example was just about general principle but it have to be adapted to your real use case.

            – sasensi
            Nov 22 '18 at 8:13











          • Try to produce an example as close as your real use case as possible and I'll help you resolve it.

            – sasensi
            Nov 22 '18 at 8:14











          • I've updated my original post with UPD, but i think we're closer now to final solution. Thanks!

            – Andriy B
            Nov 22 '18 at 8:16



















          • Thanks! This looks like a good solution, but it works properly only when circles are placed at [0,0]. To illustrate what i mean, i edited your sketch (see link on the next my comment) with a more general case. Problem is that on mouse down, the blue circle stays on the same place.

            – Andriy B
            Nov 22 '18 at 8:10











          • I don't seem to be able to share the link with you in comment due the limit on characters, so i'll update my original post with it.

            – Andriy B
            Nov 22 '18 at 8:12











          • Ok, I'll have a look at it, my example was just about general principle but it have to be adapted to your real use case.

            – sasensi
            Nov 22 '18 at 8:13











          • Try to produce an example as close as your real use case as possible and I'll help you resolve it.

            – sasensi
            Nov 22 '18 at 8:14











          • I've updated my original post with UPD, but i think we're closer now to final solution. Thanks!

            – Andriy B
            Nov 22 '18 at 8:16

















          Thanks! This looks like a good solution, but it works properly only when circles are placed at [0,0]. To illustrate what i mean, i edited your sketch (see link on the next my comment) with a more general case. Problem is that on mouse down, the blue circle stays on the same place.

          – Andriy B
          Nov 22 '18 at 8:10





          Thanks! This looks like a good solution, but it works properly only when circles are placed at [0,0]. To illustrate what i mean, i edited your sketch (see link on the next my comment) with a more general case. Problem is that on mouse down, the blue circle stays on the same place.

          – Andriy B
          Nov 22 '18 at 8:10













          I don't seem to be able to share the link with you in comment due the limit on characters, so i'll update my original post with it.

          – Andriy B
          Nov 22 '18 at 8:12





          I don't seem to be able to share the link with you in comment due the limit on characters, so i'll update my original post with it.

          – Andriy B
          Nov 22 '18 at 8:12













          Ok, I'll have a look at it, my example was just about general principle but it have to be adapted to your real use case.

          – sasensi
          Nov 22 '18 at 8:13





          Ok, I'll have a look at it, my example was just about general principle but it have to be adapted to your real use case.

          – sasensi
          Nov 22 '18 at 8:13













          Try to produce an example as close as your real use case as possible and I'll help you resolve it.

          – sasensi
          Nov 22 '18 at 8:14





          Try to produce an example as close as your real use case as possible and I'll help you resolve it.

          – sasensi
          Nov 22 '18 at 8:14













          I've updated my original post with UPD, but i think we're closer now to final solution. Thanks!

          – Andriy B
          Nov 22 '18 at 8:16





          I've updated my original post with UPD, but i think we're closer now to final solution. Thanks!

          – Andriy B
          Nov 22 '18 at 8:16




















          draft saved

          draft discarded




















































          Thanks for contributing an answer to Stack Overflow!


          • Please be sure to answer the question. Provide details and share your research!

          But avoid



          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.


          To learn more, see our tips on writing great answers.




          draft saved


          draft discarded














          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53412765%2fhow-to-create-a-paper-js-path-circle-that-can-be-scaled-translated-with-affine-m%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown





















































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown

































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown







          Popular posts from this blog

          android studio warns about leanback feature tag usage required on manifest while using Unity exported app?

          SQL update select statement

          WPF add header to Image with URL pettitions [duplicate]