Для тех, кто допускает, что его жизнь будет так или иначе связана с программированием, рекомендуется
создавать классы для базовых примитивов (точка, вектор, прямая, луч, окружность и т.п.) и определять соответствующие операции с ними.
Например, разность двух точек может давать вектор, вектора можно скалярно и векторно перемножать.
Сами вектора можно умножать на числа, складывать и вычитать.
Прямую можно собрать по двум точкам, по точке и вектору, которому прямая должна быть параллельна или перпендикулярна.
Функция "Пересечение" может выдавать список точек (возможно, пустой)
И т.п. Здесь хороший простор для продумывания удобной архитектуры решения.
# Могущество скалярного и косого (векторного) произведения
Рассмотрим какой-нибудь ненулевой вектор v на плоскости.
Для каждого вектора w посчитаем скалярное и векторные произведения.
И в зависимости от знаков и равенства нулю покрасим области разным цветом.
В результате плоскость будет разбита на 4 четвертушки, 4 луча и точку.
Это позволяет очень быстро и эффективно определять взаимное расположение точек и векторов.
# Упражнения на векторные и скалярные произведения
Даны четыре числа: координаты двух ненулевых векторов.
Если эти вектора коллинеарны, выведите 1. Если эти вектора
перпендикулярны, выведите 2. Иначе выведите 0.
В решении разрешается использовать только скалярное и косое произведения.
Никаких корней и тригонометрии.
Программа получает на вход шесть чисел: координаты точки
и координаты начала и конца вектора. Проверьте, принадлежит ли данная точка
лучу, задаваемому данным вектором.
Программа должна вывести YES, если точка принадлежит лучу, или
NO в противном случае.
В решении разрешается использовать только скалярное и косое произведения.
Никаких корней и тригонометрии.
Даны два отрезка AB и CD.
Проверьте, пересекаются ли они.
Программа получает на вход координаты точек A, B, C, D.
Все координаты — целые, не превосходят 100 по модулю.
Программа должна вывести слово YES или NO.
Для решения пригодится bounding box — параллельный осям ограничивающий прямоугольник.
В решении разрешается использовать только скалярное и косое произведения.
Никаких корней и тригонометрии.
Дано шесть чисел: коэффициенты нормальных уравнений двух непараллельных прямых.
Программа должна вывести два числа: координаты точки пересечения данных прямых.
Если уравнения прямых — это a1x+b1y+c1=0 и a2x+b2y+c2=0,
то оказывается, что для нахождения ответа очень помогают числа
Δ=[(a1;b1),(a2;b2)],Δx=[(c1;b1),(c2;b2)],Δy=[(a1;c1),(a2;c2)].
Соответствующие формулы называются формулами Крамера.
Обычно эти формулы записывают при помощи определителей:
Δ=∣∣∣∣a1a2b1b2∣∣∣∣,Δx=∣∣∣∣c1c2b1b2∣∣∣∣,Δy=∣∣∣∣a1a2c1c2∣∣∣∣.
На плоскости даны две прямые. Каждая прямая задается парой точек, через которые она проходит. Требуется установить, пересекаются ли эти прямые, и найти координаты точки пересечения.
Вводятся сначала координаты двух различных точек, через которые проходит первая прямая, а затем — координаты еще двух различных (но, быть может, совпадающих с первыми двумя) точек, через которые проходит вторая прямая. Координаты каждой точки — целые числа, по модулю не превышающие 1000.
Если прямые не пересекаются, выведите одно число 0. Если прямые совпадают, выведите 2. Если прямые пересекаются ровно в одной точке, то выведите сначала число 1, а затем два вещественных числа — координаты точки пересечения.