Как найти расстояние пройденное по дуге

Как ранее уже говорилось тут Путевой угол и расстояние между двумя точками по локсодроме (линии румба)., если двигаться по поверхности Земли из точки А в точку Б, выдерживая один и тот же путевой угол, пройденный вами путь не будет кратчайшим расстоянием между этими точками.
Чтобы достичь цели кратчайшим путем, необходимо постоянно корректировать путевой угол, чтобы траектория движения была приближена к дуге большого круга (ортодромии), которая и будет кратчайшим расстоянием между двумя точками. Калькулятор представленный далее вычисляет расстояние между двумя координатами, начальный путевой угол, конечный путевой угол, а также путевые углы в промежуточных точках. Отличие этого калькулятора от разработанного ранее Расстояние между двумя координатами, заключается в том, что в данном калькуляторе используется предельно точный алгоритм, разработанный польским ученым Тадеушем Винсенти (Thaddeus Vincenty). Погрешность вычисления не превышает 0.5 мм.

PLANETCALC, Расстояние между двумя точками и путевые углы по дуге большого круга

Расстояние между двумя точками и путевые углы по дуге большого круга

Точность вычисления

Знаков после запятой: 2

Расстояние в морских милях

Расстояние между путевыми точками (км)

Расстояние между путевыми точками (м.м.)

Файл очень большой, при загрузке и создании может наблюдаться торможение браузера.

Сначала была решена обратная геодезическая задача — вычислено расстояние между двумя точками и найдены начальные и конечные дирекционные углы. Затем полученное расстояние было разбито на равное число отрезков, в соответствии с заданным количеством путевых точек, и для каждого отрезка решалась прямая геодезическая задача — находились координаты следующей точки по заданному дирекционному углу и координатам предыдущей точки. Для решения применялся алгоритм Vincenty, который в деталях описан тут Direct and Inverse Solutions of Geodesics on the Ellipsoid with application of nested equations, Survey Review, April 1975.

§ 72. Угловое перемещение и путь

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

Возникает вопрос: а есть ли количественные соотношения между ними? Существуют ли формулы, связывающие линейные и угловые характеристики движения?

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

Итак, представим тело, прикрепленное к перекладине или турнику при помощи нити. Пусть это будет небольшой резиновый мяч.

Это уже вид сбоку. Предположим, что длина нити равна двум метрам. Теперь представим, как кто-то бьет по мячу и заставляет его на некоторое время подняться выше.

Давайте попробуем найти его угловое перемещение. Это нетрудно сделать:

varDelta{vec{varphi}}=varphi_2-varphi_1=2pi-dfrac{3pi}{2}=dfrac{pi}{2}thickspaceрад

А как найти длину пройденной дуги? Это тоже нетрудно сделать. Мяч прошел расстояние равное 1/4 длины всей окружности. Вспомним, чему равна вся ее длина:

C=2{pi}r

Найдем путь:

d=dfrac{1}{4}×2{pi}r=dfrac{pi}{2}thickspaceрад×2thickspaceм=pithickspaceмapprox3.14thickspaceм

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

Теперь он двигался по часовой стрелке:

varDelta{vec{varphi}}=varphi_2-varphi_1=-,dfrac{pi}{2}-dfrac{3pi}{2}=-,2pithickspaceрад

Угловое перемещение отрицательно, но нас интересует только его модуль:

varDelta{varphi}=lvertvarDelta{vec{varphi}}rvert=2pithickspaceрад

Найдем расстояние, которое прошел мяч (оно будет равняться длине всей окружности):

d=2{pi}r=2pithickspaceрад×2thickspaceм=4pithickspaceмapprox12.56thickspaceм

Связь между угловым перемещением и пройденным путем сохраняется и здесь. И в этом есть смысл. Можно посмотреть на это с точки зрения пропорций. Чтобы найти длину дуги, нужно понять, какую часть от окружности она составляет, а затем эту часть умножить на длину всей окружности:

d=dfrac{varDelta{varphi}}{cancel{2pi}}×cancel{2pi}r

boxed{d=varDelta{varphi}r}

Эту формулу вам стоит запомнить.

Движение по окружности с постоянной по модулю скоростью

теория по физике 🧲 кинематика

Криволинейное движение — движение, траекторией которого является кривая линия. Вектор скорости тела, движущегося по кривой линии, направлен по касательной к траектории. Любой участок криволинейного движения можно представить в виде движения по дуге окружности или по участку ломаной.

Движение по окружности с постоянной по модулю скоростью — частный и самый простой случай криволинейного движения. Это движение с переменным ускорением, которое называется центростремительным.

Особенности движения по окружности с постоянной по модулю скоростью:

  1. Траектория движения тела есть окружность.
  2. Вектор скорости всегда направлен по касательной к окружности.
  3. Направление скорости постоянно меняется под действием центростремительного ускорения.
  4. Центростремительное ускорение направлено к центру окружности и не вызывает изменения модуля скорости.

Период, частота и количество оборотов

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

Период — время одного полного оборота. Обозначается буквой T. Единица измерения — секунды (с).

t — время, в течение которого тело совершило N оборотов

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

Частота — количество оборотов, совершенных в единицу времени. Обозначается буквой ν («ню»). Единица измерения — Гц.

N — количество оборотов, совершенных телом за время t.

Период и частота — это обратные величины, определяемые формулами:

Количество оборотов выражается следующей формулой:

Пример №1. Шарик на нити вращается по окружности. За 10 секунд он совершил 20 оборотов. Найти период и частоту вращения шарика.

Линейная и угловая скорости

Линейная скорость

Линейная скорость — это отношение пройденного пути ко времени, в течение которого этот путь был пройден. Обозначается буквой v. Единица измерения — м/с.

l — длина траектории, вдоль которой двигалось тело за время t

Линейную скорость можно выразить через период. За один период тело делает один оборот, то есть проходить путь, равный длине окружности. Поэтому его скорость равна:

R — радиус окружности, по которой движется тело

Если линейную скорость можно выразить через период, то ее можно выразить и через частоту — величину, обратную периоду. Тогда формула примет

Вид — группа особей, сходных по морфолого-анатомическим, физиолого-экологическим, биохимическим и генетическим признакам, занимающих естественный ареал, способных свободно скрещиваться между собой и давать плодовитое потомство.

Выразив частоту через количество оборотов и время, в течение которого тело совершало эти обороты, получим:

Угловая скорость

Угловая скорость — это отношение угла поворота тела ко времени, в течение которого тело совершало этот поворот. Обозначается буквой ω. Единица измерения — радиан в секунду (рад./с).

ϕ — угол поворота тела. t — время, в течение которого тело повернулось на угол ϕ

Радиан — угол, соответствующий дуге, длина которой равна ее радиусу. Полный угол равен 2π радиан.

За один полный оборот тело поворачивается на 2π радиан. Поэтому угловую скорость можно выразить через период:

Выражая угловую скорость через частоту, получим:

Выразив частоту через количество оборотов, формула угловой скорости примет вид:

Сравним две формулы:

Преобразуем формулу линейной скорости и получим:

Отсюда получаем взаимосвязь между линейной и угловой скоростями:

Полезные факты

  • У вращающихся прижатых друг к другу цилиндров линейные скорости точек их поверхности равны: v1 = v2.
  • У вращающихся шестерен линейные скорости точек их поверхности также равны: v1 = v2.
  • Все точки вращающегося твердого тела имеют одинаковые периоды, частоты и угловые скорости, но разные линейные скорости. T1 = T2, ν1 = ν2, ω1 = ω2. Но v1 ≠ v2.

Пример №2. Период обращения Земли вокруг Солнца равен одному году. Радиус орбиты Земли равен 150 млн. км. Чему примерно равна скорость движения Земли по орбите? Ответ округлить до целых.

В году 365 суток, в одних сутках 24 часа, в 1 часе 60 минут, в одной минуте 60 секунд. Перемножив все эти числа между собой, получим период в секундах.

За каждую секунду Земля проходит расстояние, равное примерно 30 км.

Центростремительное ускорение

Центростремительное ускорение — ускорение с постоянным модулем, но меняющимся направлением. Поэтому оно вызывает изменение направления вектора скорости, но не изменяет его модуль. Центростремительное ускорение обозначается как aц.с.. Единица измерения — метры на секунду в квадрате (м/с 2 ). Центростремительное ускорение можно выразить через линейную и угловую скорости, период, частоту и количество оборотов/время:

Пример №3. Рассчитать центростремительное ускорение льва, спящего на экваторе, в системе отсчета, две оси которой лежат в плоскости экватора и направлены на неподвижные звезды, а начало координат совпадает с центром Земли.

Спящий лев сделает один полный оборот тогда, когда Земля сделает один оборот вокруг своей оси. Земля делает это за время, равное 1 сутки. Поэтому период обращения равен 1 суткам. Количество секунд в сутках: 1 сутки = 24•60•60 секунд = 86400 секунд = 86,4∙10 3 секунд.

Радиус Земли равен 6400 км. В метрах это будет 6,4∙10 6 . Теперь у нас есть все, что нужно для вычисления центростремительного ускорения. Подставляем данные в формулу:

Алгоритм решения

  1. Записать исходные данные.
  2. Записать формулу для определения искомой величины.
  3. Подставить известные данные в формулу и произвести вычисления.

Решение

Записываем исходные данные:

  • Радиус окружности, по которой движется автомобиль: R = 100 м.
  • Скорость автомобиля во время движения по окружности: v = 20 м/с.

Формула, определяющая зависимость центростремительного ускорения от скорости движения тела:

Подставляем известные данные в формулу и вычисляем:

pазбирался: Алиса Никитина | обсудить разбор | оценить

Точка движется по окружности радиусом R с частотой обращения ν. Как нужно изменить частоту обращения, чтобы при увеличении радиуса окружности в 4 раза центростремительное ускорение точки осталось прежним?

а) увеличить в 2 раза б) уменьшить в 2 раза в) увеличить в 4 раза г) уменьшить в 4 раза

Алгоритм решения

  1. Записать исходные данные.
  2. Определить, что нужно найти.
  3. Записать формулу зависимости центростремительного ускорения от частоты.
  4. Преобразовать формулу зависимости центростремительного ускорения от частоты для каждого из случаев.
  5. Приравнять правые части формул и найти искомую величину.

Решение

Запишем исходные данные:

Центростремительное ускорение определяется формулой:

Запишем формулы центростремительного ускорения для 1 и 2 случаев соответственно:

Так как центростремительное ускорение в 1 и 2 случае одинаково, приравняем правые части уравнений:

Произведем сокращения и получим:

Это значит, чтобы центростремительное ускорение осталось неизменным после увеличения радиуса окружности в 4 раза, частота должна уменьшиться вдвое. Верный ответ: «б».

pазбирался: Алиса Никитина | обсудить разбор | оценить

Движение по окружности

Движение по окружности – простейший случай криволинейного движения тела. Когда тело движется вокруг некоторой точки, наряду с вектором перемещения удобно ввести угловое перемещение ∆ φ (угол поворота относительно центра окружности), измеряемое в радианах.

Зная угловое перемещение, можно вычислить длину дуги окружности (путь), которую прошло тело.

Если угол поворота мал, то ∆ l ≈ ∆ s .

Угловая скорость

При криволинейном движении вводится понятие угловой скорости ω , то есть скорости изменения угла поворота.

Определение. Угловая скорость

Угловая скорость в данной точке траектории – предел отношения углового перемещения ∆ φ к промежутку времени ∆ t , за которое оно произошло. ∆ t → 0 .

ω = ∆ φ ∆ t , ∆ t → 0 .

Единица измерения угловой скорости – радиан в секунду ( р а д с ).

Существует связь между угловой и линейной скоростями тела при движении по окружности. Формула для нахождения угловой скорости:

Нормальное ускорение

При равномерном движении по окружности, скорости v и ω остаются неизменными. Меняется только направление вектора линейной скорости.

При этом равномерное движение по окружности на тело действует центростремительное, или нормальное ускорение, направленное по радиусу окружности к ее центру.

a n = ∆ v → ∆ t , ∆ t → 0

Модуль центростремительного ускорения можно вычислить по формуле:

a n = v 2 R = ω 2 R

Докажем эти соотношения.

Рассмотрим, как изменяется вектор v → за малый промежуток времени ∆ t . ∆ v → = v B → – v A → .

В точках А и В вектор скорости направлен по касательной к окружности, при этом модули скоростей в обеих точках одинаковы.

По определению ускорения:

a → = ∆ v → ∆ t , ∆ t → 0

Взглянем на рисунок:

Треугольники OAB и BCD подобны. Из этого следует, что O A A B = B C C D .

Если значение угла ∆ φ мало, расстояние A B = ∆ s ≈ v · ∆ t . Принимая во внимание, что O A = R и C D = ∆ v для рассмотренных выше подобных треугольников получим:

R v ∆ t = v ∆ v или ∆ v ∆ t = v 2 R

При ∆ φ → 0 , направление вектора ∆ v → = v B → – v A → приближается к направлению на центр окружности. Принимая, что ∆ t → 0 , получаем:

a → = a n → = ∆ v → ∆ t ; ∆ t → 0 ; a n → = v 2 R .

При равномерном движении по окружности модуль ускорения остается постоянным, а направление вектора изменяется со временем, сохраняя ориентацию на центр окружности. Именно поэтому это ускорение называется центростремительным: вектор в любой момент времени направлен к центру окружности.

Запись центростремительного ускорения в векторной форме выглядит следующим образом:

Здесь R → – радиус вектор точки на окружности с началом в ее центре.

Тангенциальное ускорение

В общем случае ускорение при движении по окружности состоит из двух компонентов – нормальное, и тангенциальное.

Рассмотрим случай, когда тело движется по окружности неравномерно. Введем понятие тангенциального (касательного) ускорения. Его направление совпадает с направлением линейной скорости тела и в каждой точке окружности направлено по касательной к ней.

a τ = ∆ v τ ∆ t ; ∆ t → 0

Здесь ∆ v τ = v 2 – v 1 – изменение модуля скорости за промежуток ∆ t

Направление полного ускорения определяется векторной суммой нормального и тангенциального ускорений.

Движение по окружности в плоскости можно описывать при помощи двух координат: x и y. В каждый момент времени скорость тела можно разложить на составляющие v x и v y .

Если движение равномерное, величины v x и v y а также соответствующие координаты будут изменяться во времени по гармоническому закону с периодом T = 2 π R v = 2 π ω

Физика. 10 класс

Конспект урока

Физика, 10 класс

Урок 04.Равномерное движение точки по окружности

Перечень вопросов, рассматриваемых на уроке:

  1. Равномерное движение точки по окружности и его характеристики.
  2. Центростремительное ускорение.

Глоссарий по теме

Криволинейное движение – это движение по дугам окружностей разных радиусов.

Ускорение – это векторная величина, равная отношению изменения скорости к промежутку времени, в течение которого это изменение произошло, при ∆t → 0

Равномерное движение точки по окружности – движение точки с постоянной по модулю скоростью (ν = const) по траектории, представляющей собой окружность.

Криволинейное движение; движение по окружности; скорость; радиус кривизны; изменение скорости; центростремительное ускорение.

Основная и дополнительная литература по теме урока:

Мякишев Г.Я., Буховцев Б.Б., Сотский Н.Н. Физика.10 класс. Учебник для общеобразовательных организаций М.: Просвещение, 2016. С.55-56

Марон Е.А., Марон А.Е. Сборник качественных задач по физике. М., Просвещение, 2006

Рымкевич А.П. Сборник задач по физике. 10-11 класс.-М.:Дрофа,2009.-С.20-22

Открытые электронные ресурсы:

Теоретический материал для самостоятельного изучения

1. Мы уже знакомы с равноускоренным движением. Как же меняются скорость и ускорение при криволинейном движении? Сегодня рассмотрим равномерное движение по окружности, узнаем, что такое центростремительное ускорение.

Если траектория движения тела прямая линия, то движение прямолинейное; если траектория кривая линия – криволинейное движение. Напомним, что траектория – это линия, вдоль которой двигалось тело.

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

Рассмотрим движение тела, брошенного под углом к горизонту. Траекторией является парабола.

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

Векторы и не лежат на одной прямой, угол между ними не равен нулю.

Это естественно, так как, если ускорение образует угол со скоростью, то изменение скорости направлено не так, как скорость. Это приводит к изменению направления скорости. Изменение скорости направлено как ускорение. Скорость через некоторый промежуток времени образует некоторый угол с Итак, сформулируем первый вывод: если угол между векторами скорости и ускорения не равен нулю, то движение будет криволинейным.

2.Может ли быть движение одновременно равномерным и криволинейным? Да, например, движение по окружности.

Равномерное движение точки по окружности – это движение точки с постоянной по модулю скоростью (v = const) по траектории, представляющей собой окружность. Но, скорость – это векторная величина, а для векторной величины одинаково важны и модуль, и направление. Т.к. при движении по окружности скорость всегда направлена по касательной к траектории движения, то по направлению она изменяется. Если есть изменение скорости (точнее её направления), значит, есть ускорение

Сформулируем второй важный вывод: любое криволинейное движение является движением с ускорением, потому что меняется направление вектора скорости.

Решим задачу: найдем ускорение тела, равномерно движущегося по окружности.

Рассмотрим равномерное движение тела по окружности с центром в точке О. В какой-то момент времени, скорость тела в точке А была.

Модули скоростей равны:

но вектора скоростей не равны.

Поэтому построим вектор для тела, движущегося по окружности. Перенесем вектор в начало вектораи найдем разность векторов.

направлен в сторону.

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

Что можно сказать об угле между векторами ? Он равен малому углу, как углы с взаимно перпендикулярными сторонами.

Рассмотрим равнобедренный треугольник со сторонами , . Углы у основания равны.

Если угол φ стремится к нулю, то углы у основания совпадут и станут равными 90 0

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

Теперь следующая задача: как найти модуль вектора ускорения. Давайте рассмотрим два треугольника: треугольник, образованный векторами и треугольник, образованный радиусами и хордой. У этих треугольников углы при вершинах равны, они равнобедренные. Треугольники подобны и, следовательно, выполняются соотношения подобия.

Промежуток времени мал, поэтому очень мал и угол при вершине, в пределе он стремится к нулю. Тогда можно сказать, что длина хорды s равна длине дуги АВ при

Длина дуги АВ это путь, пройденный точкой от А до В,

Умножим наи получим:

В левой части мы получили отношение изменения скорости за некоторый промежуток времени к этому промежутку времени т.е. ускорение:

Равномерное движение точки по окружности является движением с переменным ускорением и переменной скоростью. Модули скорости и ускорения остаются постоянными

  1. Криволинейное движение – это движение по дугам окружностей разных радиусов.

А если меняется радиус, то меняется и центростремительное ускорение. Чем меньше радиус, тем больше ускорение при одинаковой скорости.

Всегда при равномерном криволинейном движении вектор ускорения перпендикулярен вектору скорости, поэтому центростремительное ускорение иногда называют нормальным ускорением, от слова нормаль, т.е. перпендикуляр.

– движение криволинейное, так как траекторией является окружность;

– движение равномерное, так как модуль скорости не меняется;

– вектор скорости направлен по касательной к окружности;

-вектор ускорения направлен к центру окружности;

– модуль центростремительного ускорения равен:

Примеры и разбор решения заданий

1. Велосипедист движется по закруглению дороги радиусом 50 м со скоростью 36 км/ч. С каким ускорением он проходит закругление?

При движении по окружности линейная скорость и центростремительное ускорение связаны соотношением

где R = 50 м; υ= км/ч = 10 м/с.

Тогда ac = (10 м/с) 2 / 50 м = 2 м/с 2 .

2. Две материальные точки движутся по окружностям радиусами R1 = 10 см и R2 = 30 см с одинаковыми скоростями 0,20 м/с. Во сколько раз отличаются их центростремительные ускорения?

Найти –

Задано два объекта:

1) материальная точка, которая движется по окружности R1;

2) материальная точка, которая движется по окружности R2.

При движении по окружности центростремительное ускорение и линейная скорость связаны соотношением

Для тела 1 уравнение (1) примет вид:

Центростремительное ускорение тела (2) меньше ускорения тела (1) в 3 раза.

[spoiler title=”источники:”]

http://zaochnik.com/spravochnik/fizika/kinematika/dvizhenie-po-okruzhnosti/

http://resh.edu.ru/subject/lesson/3711/conspect/47121/

[/spoiler]

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



Знаток

(298),
закрыт



15 лет назад

Prowling Tiger

Мастер

(1897)


15 лет назад

Перемещение будет равно нулю,если тело закончило движение в начальной точке,если нет,то перемещение будет равно длине хорды,соединяющий начальную и конечную точки.путь рассчитывается как длина окружности тело совершило полный оборот (длина рассчитывается по формуле 2*пи*радиус,а радиус – это расстояние между начальной точкой и центром окружности,рассчитывается по формуле d=кв.корень из ((x2-x1)^2+(y2-y1)^2) )если не полный оборот,то как длина дуги=радиус*угол (в радианах) или (радиус*пи*угол (в градусах))/180 град

In another comment, OP described their original problem to actually be finding the sum of monotonic spans in $x(t)$ (and separately for $y(t)$), where $left( x(t) ,, y(t) right)$ describes a circular arc.

I don’t see any simple algebraic formula for this, but there is a simple way to define it piecewise.

Let us assume we know the starting point of the circular arc, $A = ( x_A , y_A )$, the ending point of the circular arc, $B = ( x_B , y_B )$, and the center of the circular arc, $C = ( x_C , y_C )$. The radius $r$ is then $$r = leftlVert overline{AC} rightrVert = leftlVert overline{BC} rightrVert$$
ie. $$r = sqrt{ ( x_C – x_A )^2 + ( y_C – y_A )^2 } = sqrt{ ( x_C – x_B )^2 + ( y_C – y_B )^2 }$$


Before we delve further, it is important to note that there are multiple ways the circular arc could be defined. Consider the following image:

Circular arcs

All black lines are the same length, $r$, matching the radius of both circles.

There are four possibilities as to how the two points $A$ and $B$ can be connected via a circular arc of radius $r$.

First, the center $C$ can be either to the right of line $A B$ (at $C_R$), or to the left (at $C_L$ in the image).

Second, the arc could refer to the shorter or the longer segment of the circular arc.

For simplicity, I shall assume the arc is drawn counterclockwise from $A$ to $B$, with the center at $C_L$. In the image, it is the orangey curve passing near $C_R$.

Although the following scheme assumes this, you can still re-derive the logic for any other circular arc definition.


If we only know $A = ( x_A ,, y_A )$, $B = ( x_B ,, y_B )$, and the arc radius $r$, we can calculate the coordinates to the center of the arc, $C = C_L = ( x_C ,, y_C )$, in the following way:

First, we calculate $lVertoverline{AB}rVert = d$:
$$d = sqrt{ ( x_B – x_A )^2 + ( y_B – y_A )^2 }$$
Next, we form the unit vector from $A$ to $B$, $hat{u} = ( x_u ,, y_u )$:
$$begin{cases} x_u = frac{x_B – x_A}{d} \
y_u = frac{y_B – y_A}{d} end{cases}$$
The other unit vector, $hat{v} = ( x_v ,, y_v )$, is the first one rotated 90° counterclockwise:
$$begin{cases} x_v = -y_u \ y_v = x_u end{cases}$$

In the new $u, v$ coordinate system, $A = (0,0)$, $B = (d,0)$, and we are looking for the point $C = (u,v)$ where $u = d/2$ (due to symmetries), and $u^2 + v^2 = r^2$. Indeed,
$$begin{cases} u = frac{d}{2} \
v = sqrt{r^2 – frac{d^2}{4}} end{cases}$$
Since $C = C_L = A + u hat{e}_u + v hat{e}_v$, we find that
$$begin{cases}
x_C = x_A + u x_u + v x_v \
y_C = y_A + u y_u + v y_v end{cases}$$
which simplify to
$$begin{cases}
x_C = frac{x_A + x_B}{2} + ( y_A – y_B ) sqrt{frac{r^2}{d^2} – frac{1}{4}} \
y_C = frac{y_A + y_B}{2} + ( x_B – x_A ) sqrt{frac{r^2}{d^2} – frac{1}{4}} end{cases}$$

If you want the $C = C_R$ center instead, use $-v$ instead; i.e.
$$begin{cases}
x_C = frac{x_A + x_B}{2} + ( y_B – y_A ) sqrt{frac{r^2}{d^2} – frac{1}{4}} \
y_C = frac{y_A + y_B}{2} + ( x_A – x_B ) sqrt{frac{r^2}{d^2} – frac{1}{4}} end{cases}$$


The crux of the piecewise definition is determining the quadrant in which $A-C$ and $B-C$ are (i.e. starting and ending points with respect to center of the arc):
Quadrants and rules for x and y

If the arc is drawn counterclockwise, we can now look up the quadrants the curve passes in. Note that this works for both “short” (up to 180°) arcs and “long” (over 180°) arcs.

In the following array, each column specifies the quadrant $overline{CA} = ( x_A – x_C ,, y_A – y_C )$ is in, and each row specifies the quadrant $overline{CB} = ( x_B – x_C ,, y_B – y_C )$ is in. The numbers in each cell specify the quadrants, in counterclockwise order, the arc passes through:
$$begin{array}{l|c|c|c|c}
; & Q(overline{CA})=1 & Q(overline{CA})=2 & Q(overline{CA})=3 & Q(overline{CA})=4 \
hline
Q(overline{CB})=1 & 1 & 2341 & 341 & 41 \
hline
Q(overline{CB})=2 & 12 & 2 & 3412 & 412 \
hline
Q(overline{CB})=3 & 123 & 23 & 3 & 4123 \
hline
Q(overline{CB})=4 & 1234 & 234 & 34 & 4
end{array}$$

If the arc passes through $12$, it passes the maximum $y$, $y_+ = y_C + r$.

If the arc passes through $23$, it passes the minimum $x$, $x_- = x_C – r$.

If the arc passes through $34$, it passes the minimum $y$, $y_- = y_C – r$.

If the arc passes through $41$, it passes the maximum $x$, $x_+ = x_C + r$.

Therefore, we can define a similar 4×4 table as above for the sum length of monotonic spans in $x$; picking the column based on the quadrant of $overline{CA}$, and the row based on the quadrant of $overline{CB}$:
$$begin{array}{l|c|c|c|c}
; & 1 & 2 & 3 & 4 \
hline
1 & f( x_A – x_B ) & 4 r + x_A – x_B & 2 x_+ – x_A – x_B & 2 x_+ – x_A – x_B \
hline
2 & x_A – x_B & f( x_A – x_B ) & 2 x_+ – x_A – x_B & 2 x_+ – x_A – x_B \
hline
3 & x_A + x_B – 2 x_- & x_A + x_B – 2 x_- & f( x_B – x_A ) & 4 r – x_A + x_B \
hline
4 & x_A + x_B – 2 x_- & x_A + x_B – 2 x_- & x_B – x_A & f( x_B – x_A )
end{array}$$
where $$f(x) = begin{cases}
x, & text{ if } x ge 0 \
4 r + x, & text{ if } x lt 0 end{cases}$$is needed to consider those arcs that are almost full circles (but start and end in the same quadrant).

The sum lengths of monotonic spans in $y$ along the arc are similarly
$$begin{array}{l|c|c|c|c}
; & 1 & 2 & 3 & 4 \
hline
1 & f( y_B – y_A ) & y_A + y_B – 2 y_- & y_A + y_B – 2 y_- & y_B – y_A \
hline
2 & 2 y_+ – y_A – y_B & f( y_A – y_B ) & 4 r + y_A – y_B & 2 y_+ – y_A – y_B \
hline
3 & 2 y_+ – y_A – y_B & y_A – y_B & f( y_A – y_B ) & 2 y_+ – y_A – y_B \
hline
4 & 4 r + y_B – y_A & y_A + y_B – 2 y_- & y_A + y_B – 2 y_- & f( y_B – y_A )
end{array}$$

The lengths with $4 r$ are those that are almost a full circle. (For a full circle, the length in both axes is obviously $4 r$.)

I believe the above lengths are correct, but I have not tested/verified them (should be fairly easy to verify using randomly-generated values); so, there is a possibility of typos or thinkos. If you find any errors, please let me know in a comment, so I can verify and fix.


Here is an example C implementation, sum_mono.c. It is public domain, or equivalently, licensed under the CC0 license in jurisdictions that do not recognize “public domain”. In other words, use as you wish on your own; but if it breaks something, you get to keep the pieces and not blame me.

#include <stdlib.h>
#include <inttypes.h>
#include <stdio.h>

/*
 * Coordinate type.
 *
*/

typedef  double  coord;
#define COORDFMT "%.3f"

/*
 * 2D vector type.
*/
typedef struct {
    coord   x;
    coord   y;
} vec2d;

/* Return the quadrant:
 *      1 0     ^ y
 *      2 3     |-> x
 * Origin belongs to quadrant 0,
 * positive x axis to 0,
 * positive y axis to 1,
 * negative x axis to 2,
 * negative y axis to 3.
*/
static inline int quadrant(const vec2d p)
{
    if (p.y < 0 && p.x >= 0)
        return 3;
    else
    if (p.y <= 0 && p.x < 0)
        return 2;
    else
    if (p.y > 0 && p.x <= 0)
        return 1;
    else
        return 0;
}

/* Calculate the sum of monotonic spans in x and in y,
   with a circular arc from p0 to p1,
   counterclockwise in a right-handed coordinate system,
   with the center at origin (0,0) and radius r,
   p0.x*p0.x + p0.y*p0.y = r*r = p1.x*p1.x + p1.y*p1.y.

   If you have center at c, starting point at a, and
   ending point at b, with |ca| = |cb| = r, then use
       monosum(a - c, b - c, r)
   but remember, this picks the counterclockwise arc
   (which can be the shorter or the longer part of the
    full circle).
*/
static vec2d sum_mono(const vec2d p0, const vec2d p1, const double r)
{
    vec2d  result;

    switch (quadrant(p1) + 4*quadrant(p0)) {

    case 0:  /* 0    */
        if (p1.x <= p0.x && p1.y >= p0.y) {
            result.x = p0.x - p1.x;
            result.y = p1.y - p0.y;
        } else {
            result.x = r + r + r + r + p0.x - p1.x;
            result.y = r + r + r + r + p1.y - p0.y;
        }
        return result;

    case 1:  /* 01   */
        result.x = p0.x - p1.x;
        result.y = r + r - p0.y - p1.y;
        return result;

    case 2:  /* 012  */
        result.x = r + r + p0.x + p1.x;
        result.y = r + r - p0.y - p1.y; 
        return result;

    case 3:  /* 0123 */
        result.x = r + r + p0.x + p1.x;
        result.y = r + r + r + r + p1.y - p0.y;
        return result;

    case 4:  /* 1230 */
        result.x = r + r + r + r + p0.x - p1.x;
        result.y = r + r + p0.y + p1.y;
        return result;

    case 5:  /* 1    */
        if (p1.x <= p0.x && p1.y <= p0.y) {
            result.x = p0.x - p1.x;
            result.y = p0.y - p1.y;
        } else {
            result.x = r + r + r + r + p0.x - p1.x;
            result.y = r + r + r + r + p0.y - p1.y;
        }
        return result;

    case 6:  /* 12   */
        result.x = r + r + p0.x + p1.x;
        result.y = p0.y - p1.y;
        return result;

    case 7:  /* 123  */
        result.x = r + r + p0.x + p1.x;
        result.y = r + r + p0.y + p1.y;
        return result;

    case 8:  /* 230  */
        result.x = r + r - p0.x - p1.x;
        result.y = r + r + p0.y + p1.y;
        return result;

    case 9:  /* 2301 */
        result.x = r + r - p0.x - p1.x;
        result.y = r + r + r + r + p0.y - p1.y;
        return result;

    case 10: /* 2    */
        if (p0.x <= p1.x && p0.y >= p1.y) {
            result.x = p1.x - p0.x;
            result.y = p0.y - p1.y;
        } else {
            result.x = r + r + r + r + p1.x - p0.x;
            result.y = r + r + r + r + p0.y - p1.y;
        }
        return result;

    case 11: /* 23   */
        result.x = p1.x - p0.x;
        result.y = r + r + p0.y + p1.y;
        return result;

    case 12: /* 30   */
        result.x = r + r - p0.x - p1.x;
        result.y = p1.y - p0.y;
        return result;

    case 13: /* 301  */
        result.x = r + r - p0.x - p1.x;
        result.y = r + r - p0.y - p1.y;
        return result;

    case 14: /* 3012 */
        result.x = r + r + r + r + p1.x - p0.x;
        result.y = r + r - p0.y - p1.y;
        return result;

    default: /* 3    */
        if (p0.x <= p1.x && p0.y <= p1.y) {
            result.x = p1.x - p0.x;
            result.y = p1.y - p0.y;
        } else {
            result.x = r + r + r + r + p1.x - p0.x;
            result.y = r + r + r + r + p1.y - p0.y;
        }
        return result;
    }
}

/* Helper function: Returns a point with radius 5:
 *         3
 *     4       2
 *    5         1
 *   6           0
 *    7        11
 *     8      10
 *         9
 * This is useful as a test set, because the points
 * have integer coordinates.
*/
static vec2d radius5(const int a)
{
    vec2d result;

    switch (a) {
    case  0: result.x = +5; result.y =  0; return result;
    case  1: result.x = +4; result.y = +3; return result;
    case  2: result.x = +3; result.y = +4; return result;
    case  3: result.x =  0; result.y = +5; return result;
    case  4: result.x = -3; result.y = +4; return result;
    case  5: result.x = -4; result.y = +3; return result;
    case  6: result.x = -5; result.y =  0; return result;
    case  7: result.x = -4; result.y = -3; return result;
    case  8: result.x = -3; result.y = -4; return result;
    case  9: result.x =  0; result.y = -5; return result;
    case 10: result.x = +3; result.y = -4; return result;
    case 11: result.x = +4; result.y = -3; return result;
    default: result.x =  0; result.y =  0; return result;
    }
}

/*
 * Given two indexes referring to radius5 vectors,
 * calculates the sum of monotonic parts along the x and
 * y axes, by summing the differences between consecutive
 * vectors in the radius5 set.
*/
static vec2d radius5_sum_mono(const int a0, const int a1)
{
    vec2d result = { 0, 0 };
    vec2d curr, prev;
    int  a = a0;

    if (a0 == a1)
        return result;

    curr = radius5(a);

    do {
        prev = curr;
        a = (a + 1) % 12;
        curr = radius5(a);

        if (curr.x >= prev.x)
            result.x += curr.x - prev.x;
        else
            result.x += prev.x - curr.x;

        if (curr.y >= prev.y)
            result.y += curr.y - prev.y;
        else
            result.y += prev.y - curr.y;

    } while (a != a1);

    return result;
}

int main(void)
{
    int a0, a1;
    int failures = 0;

    for (a0 = 0; a0 < 12; a0++) {
        const vec2d  v0 = radius5(a0);
        for (a1 = 0; a1 < 12; a1++) {
            const vec2d  correct = radius5_sum_mono(a0, a1);
            const vec2d  v1 = radius5(a1);
            const vec2d  calculated = sum_mono(v0, v1, 5);

            if (calculated.x != correct.x) {
                failures++;
                printf("Radius5(%d,%d) (Q%d%d): Lx = " COORDFMT ", not " COORDFMT "!n",
                       a0, a1, quadrant(v0), quadrant(v1), correct.x, calculated.x);
            }

            if (calculated.y != correct.y) {
                failures++;
                printf("Radius5(%d,%d) (Q%d%d): Ly = " COORDFMT ", not " COORDFMT "!n",
                       a0, a1, quadrant(v0), quadrant(v1), correct.y, calculated.y);
            }
        }
    }

    if (!failures)
        printf("Radius5 checks all passed.n");
    else
        printf("Radius5 checks: %d out of 288 failed.n", failures);

    return EXIT_SUCCESS;
}

The function sum_mono(ca, cb, r) computes the sum of monotonic spans in both x and y, given a counterclockwise circular arc of radius r, with starting point relative to center of arc at ca, and ending point relative to center of arc at cb. (Essentially, ca·ca = r*r = cb·cb.)

The main program tests 12×12 arcs of radius 5, the ones that have integer coordinates, so that you can change coord to float or int, but still have the verification work correctly. It verifies sum_mono() by comparing to a function that sums the deltas of successive integer-coordinated vectors within the arc; I consider it a good initial check.

Добавить комментарий