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

Нарисуйте изогнутый путь до границы круга в D3.js

Я хочу нарисовать изогнутый путь (дугу или кубическую кривую Безье) от точки к окружности. Известны следующие параметры: pX (x-позиция точки), pY (y-позиция точки), cX (x -позиция центра круга), cY (y-позиция центра круга) и cR (радиус круга).

Этот рисунок иллюстрирует проблему.

введите здесь описание изображения

Круг не непрозрачен, и когда путь рисуется от точки к центру круга, он виден через круг (см. № 1 на связанном рисунке). Этого не должно происходить, поскольку существует некоторый фоновый контент, который должен быть виден через круг. Итак, решение, которое я представляю, состоит в том, чтобы нарисовать путь до границы круга.

Нарисуйте прямую линию, пока граница круга не станет легкой (см. № 2 на связанном рисунке):

var theta = Math.atan2(cY - pY, cX - pX);
var startX = pX;
var startY = pY;
var endX = cX - cR * Math.cos(theta);
var endY = cY - cR * Math.sin(theta);
line.attr('x1', startX).attr('y1', startY).attr('x2', endX).attr('y2', endY);

Если я применю тот же принцип к изогнутому пути, он будет нарисован неправильно (см. № 3 на связанном рисунке). Он должен сохранять форму, как если бы он указывал на центр круга, но заканчиваться, не перекрывая круг (см. № 4 на связанном рисунке).

Дополнительные наблюдения:

  • кривая может быть такой же толстой, как круг
  • одновременно в визуализации может существовать несколько сотен пар окружность-дуга, поэтому производительность также принимается во внимание

Любые предложения о том, как решить эту проблему? Заранее спасибо!


  • использовать маску или обрезать область на пути 22.02.2019
  • @ rioV8 В моем случае может быть несколько сотен пар пузырь-дуга (большие данные). Не повлияют ли дополнительные несколько сотен объектов контура отсечения на производительность визуализации? 25.02.2019
  • затем убедитесь, что вы рисуете круги в группе, которая находится после группы с путями или для каждой комбинации кругов пути, нарисуйте круг после пути, тогда круг будет маскировать путь, ой забыл непрозрачный круг 25.02.2019
  • обратите внимание, что если ваша линия имеет какую-либо толщину, не имеет значения, что вы делаете: она всегда будет выглядеть плохо, потому что соприкасающийся край вашей линии не будет иметь того же радиуса кривизны, что и ваш круг, поэтому он либо перекрываются или, что более вероятно, будут иметь зазоры по бокам. Итак, что вам на самом деле нужно, так это посмотреть, как обрезать фигуру на основе другой фигуры: провести линию к центру круга, а затем заменить линию чем-то, что эквивалентно exclusion(line, circle) в d3. 26.02.2019
  • @urss: обычный ответ на вопрос, не повлияет ли это на производительность? для простого решения попробуйте и узнайте. Возможно, но пока вы визуализируете только то, что находится в поле зрения, маловероятно, что это повлияет на него каким-либо заметным образом. 26.02.2019
  • @Mike'Pomax'Kamermans, вы правы насчет кривизны. Я попробую предложение маскировки или обрезки пути. 27.02.2019

Ответы:


1

Посмотри на эту картинку:

Результирующая кривая вместе с ее контрольными точками.

Красная точка — ваша точка (pX,pY), черная точка — центр круга. Вы выбираете зеленую точку где-то на плоскости (вы можете поэкспериментировать с ее расположением, чтобы найти кривую, которая вам нравится) и строите синюю точку как пересечение вашего круга с прямой линией, соединяющей черную и зеленую точки.

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

Если ваша кривая будет очень толстой, этого простого решения может быть недостаточно. В этом случае я рекомендую делать так, как рекомендует @rioV8.

22.02.2019
  • Благодарим за ваше предложение! На самом деле это элегантное решение, но, к сожалению, в моем случае оно не сработает, потому что кривая может достигать ширины, равной диаметру круга. 25.02.2019
  • Тогда я рекомендую упомянуть этот факт (то, что кривая может быть толщиной с круг) в вопросе. 25.02.2019
  • Новые материалы

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

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

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

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

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

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

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