Ну, это немного старый, но ему нужен ответ. Но, во-первых, структура дуги не имеет достаточной информации для работы с вопросом так, как она была заявлена. Нет ничего, что говорит о том, что дуга проходит больше, чем 2pi радианов и сколько раз вокруг. Если бы это было так, идея дуги более 2pi геометрически абсурдна в любом случае, и этой возможности следует избегать. Если вы хотите написать много кода для обработки негеометрических понятий здесь, это выходит за рамки того, что я адресую, и вам решать включить больше данных в структуру и проверить ее правильно. Также нет ничего, что говорит нам, если дуга определена как всегда по часовой стрелке, против часовой стрелки. Но проблему легко решить, если направление четко определено. Пока давайте сделаем предположение, что дуги нулевой длины никогда не используются и что дуги никогда не обходят больше, чем 2pi радианов. Предположим также, что дуги всегда задаются по часовой стрелке.
Теперь это легко. Возьмите до двух точек, которые являются пересечениями двух окружностей, в которых находятся две дуги. Повторите анализ для обеих точек ...
Получить угол точки пересечения. Если угол начала дуги меньше, чем конечный угол, то просто проверьте, не находится ли угол пересечения с этими двумя углами или между ними. Но если начальный угол больше, чем конечный угол дуги, то выполните два теста: один, чтобы увидеть, находится ли угол пересечения на уровне или выше угла начала, а также на уровне или ниже 2pi радианов, а также, если необходимо, проверить, если угол пересечения находится на уровне нуля или выше нуля и ниже или ниже угла конца дуги.
Я думаю, что псевдо-код будет выглядеть примерно так:
on_arc = false;
if(start > end)
{
if(intersect >= start && intersect <= 2pi)
on_arc = true;
else if(intersect >= 0 && intersect <= end)
on_arc = true;
}
else if(start == end)
on_arc = true; // arc is the entire circle since we are not handling zero length arcs.
else
{
if(intersect >= start && intersect <= end)
on_arc = true;
}
Если есть флаг в структуре дуги, чтобы сказать, если дуга по часовой стрелке или против часовой стрелки, то код может просто поменять места начала и конца перед испытаниями.
Просто избегайте идеи дуги> 2pi, потому что это не полезно. Независимо от того, что вычисляет дуга, это либо своего рода геометрическая 2D-концепция, либо это то, что может иметь ограничение в 2pi.
Возможно, вы можете использовать% 2pi (оператор модуля), чтобы всегда получать углы между 0 и 2pi – jeremija
Я не уверен, что это работает напрямую. Например, дуга между (2π-0,1) и (2π + 0,1) покрывает угол 0, но если я получу модуль этого значения на 2π, тогда я получаю дугу между 0,1 и (2π-0,1), которая не имеет значения, t_ cover 0. – Matthew
Будет ли всегда всегда быть верным для вашей дуги: 'Math.abs (arc.start - arc.end) <= Math.PI'? – jeremija