Несколько сообщений о МАТЛАБ и о том, как им пользоваться.
Комментарии, критика и восторженное рукоплескание приветствуются в самой категоричной форме.
Комментарии, критика и восторженное рукоплескание приветствуются в самой категоричной форме.
Пересечение окружностей
Запись от letete размещена 29.01.2018 в 19:00
Показов 2600
Комментарии 0
|
Понадобилось тут намедни пересечь окружности (на плоскости, понятное дело) и потратив изрядное количество времени на поиски готового решения в интернетах, я оказался несколько обескуражен. В большинстве случаев предлагается решение школьных задачек с конкретными данными, либо разбор полета начинается со слов "Для простоты предположим, что центр первой окружности совпадает с началом координат...". Такое предположение конечно можно сделать, и даже сместить систему координат не так уж и сложно, но это до тех пор пока окружности две и пока мы на плоскости. С усложнением задачи становится сложнее двигать и поворачивать систему координат, что меня лично не очень-то радует. По сему я решил, что было бы весьма недурственно посчитать задачу в общем виде. Может, кому и пригодится. Итак, две окружности: После раскрытия скобок, получим: Вычитаем второе из первого и причесываем (вводим сразу для упрощения По сути Возможно, стоит оговорить отдельно случай, когда Теперь можно подставить соотношение в любое из исходных уравнений: Раскрываем скобки, группируем и введем привычные Дальше все слишком просто - четверть дискриминанта и получение корней: Ну и напоследок запишем это все на C++ (Qt) с учетом погрешностей:
- предварительная проверка нужна для того, чтобы не производить лишние вычисления, а также чтобы учитывать погрешность измерений; по идее достаточно проверки на неотрицательность дискриминанта при точном расчете, но поскольку предварительную проверку я все же сделал - дискриминант не должен получаться отрицательным (при условии, конечно, что значение погрешности tolerance адекватное), либо может быть отрицательным, но не очень большим по модулю - это будет соответствовать случаю касания. - строку 24 заблокировал по следующей причине: получается, что когда окружности рядом, почти касаются, алгоритм дает отрицательный дискриминант, но в силу погрешности мне все же надо считать что точка пересечения есть (с уверенностью утверждать, что дискриминант "не сильно" отрицательный меня заставляет предварительная проверка) - в случае с касанием (строка 27) мне так было сделать удобнее, хотя это несколько не правильно (еще более не правильно сравнивать без извлечения корня - размерности разные, d_4 < tolerance*tolerance то же самое, что qSqrt(d_4) < tolerance, но без извлечения корня из возможно отрицательного числа); в этом месте лучше сделать так, как того требует конкретная задача | |||||
Размещено в Qt
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 0
Комментарии


