E078. Нахождение уравнения прямой для отрезка

e-maxx algorithm original: C/C++ #algorithm #emaxx #geometry #math
선택한 UI 언어에 맞게 문제 텍스트를 러시아어에서 번역합니다. 코드는 변경하지 않습니다.

Источник: e-maxx.ru/algo, страница PDF 230.

문제 — по заданным координатам конца отрезка построить прямую, проходящую через него. Мы считаем, что отрезок невырожден, т.е. имеет длину больше нуля (иначе, понятно, через него проходит бесконечно много различных прямых).

Двумерный случай

Пусть дан отрезок

, т.е. известны координаты его концов

,

,

,

. it is required построить уравнение прямой на плоскости, проходящей через этот отрезок, т.е.

find коэффициенты

,

,

в уравнении прямой:

Заметим, что искомых троек

, проходящих через заданный отрезок, бесконечно много: можно умножить все три коэффициента на произвольное ненулевое number и получить ту же самую прямую. Следовательно, наша 문제 — find одну из таких троек. Нетрудно убедиться (подстановкой этих выражений и координат точек

и

в уравнение прямой), что

подходит следующий набор коэффициентов:

정수 случай

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

,

,

, поделим на

него все три коэффициента, а затем произведём нормировку знака: если

или

, то умножим

все три коэффициента на

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

Вещественнозначный случай

При работе с вещественными числами следует всегда помнить о погрешностях.

Коэффициенты

и

получаются у нас порядка исходных координат, коэффициент

— уже порядка квадрата от

них. Это уже может быть достаточно большими числами, а, на예제, при пересечении прямых они станут ещё больше, что может привести к большим ошибкам округления уже при исходных координатах порядка . Поэтому при работе с вещественными числами желательно производить так называемую нормировку прямой:

а именно, делать коэффициенты такими, чтобы

. Для этого надо вычислить number

:

и разделить все три коэффициента

,

,

на него.

Тем самым, порядок коэффициентов

и

уже не будет зависеть от порядка 입력ных координат, а коэффициент будет того же порядка, что и 입력ные координаты. На практике это приводит к значительному улучшению точности вычислений. Наконец, упомянем о сравнении прямых — ведь после такой нормировки для одной и той же прямой могут получаться только две тройки коэффициентов: с точностью до умножения на

. Соответственно, если

мы произведём дополнительную нормировку с учётом знака (если

или

, то умножать

на

), то получающиеся коэффициенты будут уникальными.

Трёхмерный и многомерный случай

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

способом задания прямой, т.е. в виде точки

и вектора

:

Т.е. прямая — это все точки, которые можно получить из точки

прибавлением вектора

с

произвольным коэффициентом. Построение прямой в параметрическом виде по координатам концов отрезка — тривиально, мы просто берём

один конец отрезка за точку

, а вектор из первого до второго конца — за вектор

.

C# 해법

자동 초안, 제출 전 검토
// C# draft for: Нахождение уравнения прямой для отрезка
// Original e-maxx article has no compact code listing in the extracted PDF text.

C++ 해법

매칭됨/원본
// C++ source for: Нахождение уравнения прямой для отрезка
// Compact code block was not extracted from this article.

Java 해법

자동 초안, 제출 전 검토
// Java draft for: Нахождение уравнения прямой для отрезка
// Original e-maxx article has no compact code listing in the extracted PDF text.

Материал разбит как 알고리즘ическая 문제: изучить постановку, понять асимптотику и реализовать 알고리즘 на выбранном языке.

Vacancies for this task

활성 채용 with overlapping task tags are 표시됨.

전체 채용
아직 활성 채용이 없습니다.