Arhn - архитектура программирования

Учитывая 2 точки, как мне нарисовать линию под прямым углом к ​​линии, образованной двумя точками?

В идеале я хочу предоставить последовательность точек и нарисовать линию под прямым углом в каждой точке (начиная со второй точки).

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

(Я понимаю, что линии будут не совсем под прямым углом к ​​кривой, а скорее под прямым углом к ​​линии, образованной любыми двумя точками на кривой).

19.09.2011

  • с какой библиотекой вы будете рисовать? 19.09.2011
  • Я работаю в Silverlight и использую InkPresenter, так что я думаю, это всего лишь случай функции точек. 19.09.2011
  • stackoverflow.com/q/1243614/183120 имеет решение, аналогичное решению Андреаса (stackoverflow.com/a/7470098/183120) 25.01.2013

Ответы:


1

Это вопрос векторной математики. Вы можете вычислить направляющий вектор между двумя точками A и B, вычтя A из B. В 2D и только в 2D вектор, расположенный под прямым углом к ​​этому вектору, можно получить, изменив компоненты x и y на противоположные и взяв одну из составляющих отрицательной. Если вы отмените новый компонент x, вы сделаете поворот налево, отрицая y, вы сделаете поворот направо. Затем вы можете уменьшить направляющий вектор до единичного размера (= длины 1), разделив каждый компонент на длину вектора (sqrt (x x + y y)). Наконец, вы можете снова растянуть единичный вектор на желаемую длину и получить один из желаемых размеров. Если вы добавите этот вектор к A или B, вы получите точку, до которой хотите провести линию.

Вот небольшая помощь по математике:

Это точки A и B, выраженные в виде вектора.

Направляющий вектор вычисляется простым вычитанием.

Вектор нормали задается путем переворота направляющего вектора, то есть перевернуть компоненты и сделать одну из них отрицательной. nl = нормальный, перевернут влево, nr = нормальный, перевернут вправо

Единичный вектор нормального вектора задается делением каждого компонента на длину вектора.

Вычисляет длину вектора

Если вы хотите провести линию от B влево (при выходе из A), вы вычисляете точку P, чтобы провести линию как

Итак, вы хотите чередовать то, что один раз вы рисуете влево и один раз вправо при итерации по точкам.

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

19.09.2011
  • Я не могу закончить первое предложение. Если я вычту B из A, я, скорее всего, получу точку, которая находится за пределами холста. 20.09.2011
  • Отредактировал свой ответ, надеюсь понятнее. В любом случае расчет не прекращается после первого предложения, вы должны прочитать ответ полностью. Как я уже сказал, вы уменьшаете размер вектора до единицы расстояния и снова масштабируете его на желаемую длину. Если это выходит за пределы холста, ваша длина слишком велика или холст слишком мал. 20.09.2011
  • Я очень впечатлен тем, что могу следить за математикой, за исключением строки, начинающейся rno = 20.09.2011
  • Длина вектора, ищите единичный вектор. Извините за обозначения, когда я учился в школе, единичный вектор обозначался индексом 0. 20.09.2011
  • Приходится переходить в светлый режим. Очевидно, изображения, содержащие формулу, имеют прозрачный фон. Если найду время, посмотрю, смогу ли добавить белый фон. 07.05.2020
  • Я думаю, что вы перепутали A и B в этом предложении: вы можете вычислить направляющий вектор между двумя точками A и B, вычтя B из A - вы получите вектор директивы, вычтя A из B (это также то, что вы делаете в формула). Привет от товарища Андреаса. 30.11.2020
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..