Исправить положение курсора мыши

Когда я перетаскиваю svg (красный) в другое место на экране, курсор мыши теряет исходное угловое положение (отставание) и указывает на пустую область... Я использовал var dx и dy в «var point e.clientx», чтобы исправить, безуспешно... есть предложения?

код: http://jsfiddle.net/rebecavascon/evgLhdz3/2/

показать: http://jsfiddle.net/rebecavascon/evgLhdz3/2/show/

function updateSVG(e) {
    if (follow) {
      var centerPoint = new Point(center[0].getAttribute("cx"), center[0].getAttribute("cy"));
      var point = new Point(e.clientX, e.clientY);
      var angle = Math.round(100 * getAngleFromPoint(point, centerPoint)) / 100;
      var distance = Math.round(getDistance(point, centerPoint));
      var d = "M " + centerPoint.X + " " + centerPoint.Y + " L " + point.X + " " + point.Y;
      path.attr("d", d);
      txt.attr("x", point.X);
      txt.attr("y", point.Y);
      txt.html(distance + arrows + " (" + angle + degree + ")");
      txt.attr("transform", "rotate(" + angle + " " + point.X + " " + point.Y + ")");
      dynamic.attr("r", distance);
    }
    fitSVG();
  }

person Rebeca P    schedule 14.06.2017    source источник
comment
Можно видеть, что он, кажется, не следует за мышью после перетаскивания. Интересно, сообщает ли centerPoint нечетное значение. Добавлю немного отчетов и тестов.   -  person Twisty    schedule 14.06.2017
comment
centerPoint никогда не меняется даже после перетаскивания SVG. См.: jsfiddle.net/Twisty/8zx8p2wf/3.   -  person Twisty    schedule 14.06.2017
comment
Это устраняет проблему centerPoint и создает новую огромную проблему: jsfiddle.net/Twisty/8zx8p2wf/5   -  person Twisty    schedule 14.06.2017
comment
Таким образом, угол относительно центра рассчитывается правильно. Что-то еще меняется, то есть перемещает этот путь в другое место.   -  person Twisty    schedule 14.06.2017
comment
Хорошо, я думаю, что центральная точка не может быть изменена, потому что она используется для вычисления угла, может быть, другая переменная считывает новое положение мыши и помещает это новое значение в новую переменную centerpoint2... хорошо, я новичок в js... вы можете знать больше. .. идея?   -  person Rebeca P    schedule 14.06.2017
comment
Не уверен, что понимаю. Пожалуйста, просмотрите ответ, который я разместил.   -  person Twisty    schedule 14.06.2017


Ответы (1)


Создание смещения работало для моего тестирования.

Код: http://jsfiddle.net/Twisty/8zx8p2wf/19/

Работает: http://jsfiddle.net/Twisty/8zx8p2wf/19/show/

Добавлена ​​функция getCenter()

  function getCenter(target) {
    var b, x, y, w, h, cx, cy;
    b = target[0].getBoundingClientRect();
    console.log(target, b);
    x = b.x;
    y = b.y;
    w = b.width;
    h = b.height;
    cx = x + (w / 2);
    cy = y + (h / 2);
    console.log(x, y, w, h, cx, cy);
    return {
      X: cx,
      Y: cy
    };
  }

Это дает истинный центр объекта SVG. Похоже, атрибуты cx и cy не обновляются.

Обновлена ​​функция updateSVG()

  function updateSVG(e) {
    if (follow) {
      var centerPoint = getCenter(center);
      var point = new Point(e.clientX, e.clientY);
      var angle = Math.round(100 * getAngleFromPoint(point, centerPoint)) / 100;
      var distance = Math.round(getDistance(point, centerPoint));
      var od = {
        p: {
          X: point.X - offset.X,
          Y: point.Y - offset.Y
        },
        cp: {
          X: centerPoint.X - offset.X,
          Y: centerPoint.Y - offset.Y
        }
      };
      var d = "M" + od.p.X + "," + od.p.Y + " L" + od.cp.X + "," + od.cp.Y;
      path.attr("d", d);
      txt.attr("x", point.X);
      txt.attr("y", point.Y);
      txt.html(distance + arrows + " (" + angle + degree + ")");
      txt.attr("transform", "rotate(" + angle + " " + point.X + " " + point.Y + ")");
      dynamic.attr("r", distance);
    }
    fitSVG();
  }

При этом используется новая постоянная переменная offset и правильные центральные точки.

JavaScript

$(function() {
  var center = $("#center"),
    dynamic = $("#dynamic"),
    path = $("#deg"),
    svg = $("svg"),
    txt = $("#txt"),
    svgNS = svg[0].namespaceURI,
    degree = String.fromCharCode(176),
    arrows = String.fromCharCode(845),
    follow = true,
    startPos,
    endPos,
    offset = {
      X: 0,
      Y: 0
    };

  function Point(x, y) {
    return {
      "X": x,
      "Y": y
    };
  }

  function getCenter(target) {
    var b, x, y, w, h, cx, cy;
    b = target[0].getBoundingClientRect();
    console.log(target, b);
    x = b.x;
    y = b.y;
    w = b.width;
    h = b.height;
    cx = x + (w / 2);
    cy = y + (h / 2);
    console.log(x, y, w, h, cx, cy);
    return {
      X: cx,
      Y: cy
    };
  }

  // Credits goes to Stackoverflow: http://stackoverflow.com/a/14413632
  function getAngleFromPoint(point, centerPoint) {
    var dy = (point.Y - centerPoint.Y),
      dx = (point.X - centerPoint.X);
    var theta = Math.atan2(dy, dx);
    var angle = (((theta * 180) / Math.PI)) % 360;
    angle = (angle < 0) ? 360 + angle : angle;
    return angle;
  }
  // Credits goes to http://snipplr.com/view/47207/
  function getDistance(point1, point2) {
    var xs = 0;
    var ys = 0;

    xs = point2.X - point1.X;
    xs = xs * xs;

    ys = point2.Y - point1.Y;
    ys = ys * ys;

    return Math.sqrt(xs + ys);
  }

  function fitSVG() {
    var width = window.innerWidth,
      height = window.innerHeight;
    svg.width(width);
    svg.height(height);
  }

  function updateSVG(e) {
    if (follow) {
      //var centerPoint = new Point(center[0].getAttribute("cx"), center[0].getAttribute("cy"));
      var centerPoint = getCenter(center);
      var point = new Point(e.clientX, e.clientY);
      var angle = Math.round(100 * getAngleFromPoint(point, centerPoint)) / 100;
      var distance = Math.round(getDistance(point, centerPoint));
      var od = {
        p: {
          X: point.X - offset.X,
          Y: point.Y - offset.Y
        },
        cp: {
          X: centerPoint.X - offset.X,
          Y: centerPoint.Y - offset.Y
        }
      };
      var d = "M" + od.p.X + "," + od.p.Y + " L" + od.cp.X + "," + od.cp.Y;
      $("#mouse").html(e.clientX + "," + e.clientY);
      $("#svgPos").html(svg.position().left + "," + svg.position().top);
      $("#offset").html(offset.X + "," + offset.Y);
      $("#centerPoint").html(centerPoint.X + "," + centerPoint.Y);
      $("#point").html(point.X + "," + point.Y);
      $("#path").html(d);
      $("#angle").html(angle);
      $("#distance").html(distance);
      path.attr("d", d);
      txt.attr("x", point.X);
      txt.attr("y", point.Y);
      txt.html(distance + arrows + " (" + angle + degree + ")");
      txt.attr("transform", "rotate(" + angle + " " + point.X + " " + point.Y + ")");
      dynamic.attr("r", distance);
    }
    fitSVG();
  }

  grid_size = 10;

  svg
    .mousemove(updateSVG)
    .click(function() {
      follow = !follow;
      return true;
    });
  $(".img").draggable({
    handle: "svg",
    classes: {
      "ui-draggable-dragging": "opac"
    },
    cursor: "grab",
    grid: [grid_size, grid_size],
    start: function(e, ui) {
      $(this).find(".text").hide();
      follow = false;
      startPos = ui.position;
    },
    stop: function() {
      follow = true;
      endPos = svg.position();
      offset.X = endPos.left;
      offset.Y = endPos.top;
    }
  });
});

Во время тестирования я немного скорректировал перетаскиваемый объект, так что div.img оболочка является перетаскиваемым, а svg внутри - дескриптором. Я не уверен, что здесь есть польза, но я не хотел, чтобы это осталось незамеченным.

person Twisty    schedule 14.06.2017
comment
Опять же, большое спасибо, он хорошо работает в firefox, но хром не работает ... спасибо - person Rebeca P; 16.06.2017
comment
@RebecaP .getBoundingClientRect() должен работать для FF и Chrome; но я тестировал только с FF. - person Twisty; 16.06.2017
comment
Изменение .x налево и .y наверх, предложенное @Michael Geary, сделало его полностью функциональным. См. stackoverflow.com/questions/ 27169534/ . Хороший день :D - person Rebeca P; 16.06.2017
comment
Ах, хорошо, думаю, top и left доступны для Chrome, где x и y только FF. - person Twisty; 16.06.2017