Nano Hash - криптовалюты, майнинг, программирование

прямое обнаружение столкновений d3js

Я пытаюсь создать обнаружение столкновений в моем принудительном макете svg (d3js). Я следовал этому руководству, которое создает столкновение в форме круга.

По какой-то причине это не работает для прямой формы. Я пробовал играть с параметрами в завесе.

Вот мой код:

var node = svg.selectAll(".node")
    .data(json.nodes)
      .enter().append("g")
        .attr("class", "node")
        .call(force.drag);

    node
        .append("rect")
            .attr("class", "tagHolder")
            .attr("width", 60)
            .attr("height", 60)
            .attr("rx", 5)
            .attr("ry", 5)
            .attr("x", -10)
            .attr("y", -10);  

и это:

 svg.selectAll(".node")
      .attr("x", function(d) { return d.x; })
      .attr("y", function(d) { return d.y; });

    link.attr("x1", function(d) 
        { 
            return d.source.x; 
        })
          .attr("y1", function(d) { return d.source.y; })
          .attr("x2", function(d) { return d.target.x; })
          .attr("y2", function(d) { return d.target.y; });

    node.attr("transform", function(d) 
    { 
        return "translate(" + d.x + "," + d.y + ")"; 
    });
});

и функция столкновения:

function collide(node) {
    var r = 30,
        nx1 = node.x - r,
        nx2 = node.x + r,
        ny1 = node.y - r,
        ny2 = node.y + r;

    return function(quad, x1, y1, x2, y2) 
    {
        if (quad.point && (quad.point !== node)) 
        {
            var x = node.x - quad.point.x,
                y = node.y - quad.point.y,
                l = Math.sqrt(x * x + y * y),
                r = 30 + quad.point.radius;
            if (l < r) 
            {
                l = (l - r) / l * .5;
                node.x -= x *= l;
                node.y -= y *= l;
                quad.point.x += x;
                quad.point.y += y;
            }
        }

        return x1 > nx2 || x2 < nx1 || y1 > ny2 || y2 < ny1;
     };
}

Как я могу обнаружить столкновение для прямоугольника?

Спасибо!!!

05.10.2013

  • У меня тот же вопрос, хотя, может быть, немного дальше, чем ваш пример. Что-то не так с изменениями, которые я внес в функцию столкновения, потому что у меня слишком сильное отталкивание между прямоугольниками: bl.ocks.org/dobbs/1d353282475013f5c156 17.08.2014

Ответы:


1

Функция столкновения в примере d3 вычисляет перекрытие кругов, сравнивая расстояние между их центрами l = Math.sqrt(x * x + y * y) с суммой их радиусов r = node.radius + quad.point.radius. Когда l < r круги перекрываются, и два круга удаляются друг от друга, чтобы исправить перекрытие.

Аналогичная функция столкновения для прямоугольников работает таким же образом, вычисляя перекрытие прямоугольников и удаляя их друг от друга:

function collide(node) {
  var nx1, nx2, ny1, ny2, padding;
  padding = 32;
  nx1 = node.x - padding;
  nx2 = node.x2 + padding;
  ny1 = node.y - padding;
  ny2 = node.y2 + padding;
  return function(quad, x1, y1, x2, y2) {
    var dx, dy;
    if (quad.point && (quad.point !== node)) {
      if (overlap(node, quad.point)) {
        dx = Math.min(node.x2 - quad.point.x, quad.point.x2 - node.x) / 2;
        node.x -= dx;
        quad.point.x += dx;
        dy = Math.min(node.y2 - quad.point.y, quad.point.y2 - node.y) / 2;
        node.y -= dy;
        quad.point.y += dy;
      }
    }
    return x1 > nx2 || x2 < nx1 || y1 > ny2 || y2 < ny1;
  };
};

Перекрытие по ширине равно dx = Math.min(node.x2 - quad.point.x, quad.point.x2 - node.x) / 2;, где перекрытие по высоте равно dy = Math.min(node.y2 - quad.point.y, quad.point.y2 - node.y) / 2;, что показывает, что ваши узлы должны знать два угла прямоугольника: верхний левый (x, y) и нижний правый (x2, y2).

См. полный пример здесь: http://bl.ocks.org/dobbs/1d353282475013f5c156. В примере используется coffeescript, и только прямоугольники перемещаются друг от друга по оси Y, потому что это лучше соответствует тому, что мне нужно для моего собственного случая.

17.08.2014
  • Выдающийся, большое спасибо. Я искал что-то вроде этого. 28.05.2016
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..