Статья Автор: Лебедев Дмитрий Алексеевич

КЕГЭ-6 Четырех угольники (обычные, выпуклые)

Предположим, что есть задание типа 42612:

Черепахе был дан для исполнения следующий алгоритм:
Направо 135
Повтори 25 [Вперёд 250 Направо 90]
(В начальный момент Черепаха находится в начале координат, её голова направлена вдоль положительного направления оси ординат, хвост опущен.)

Определите, сколько точек с целочисленными координатами будут находиться внутри области, ограниченной линией, заданной данным алгоритмом. Точки на линии не следует учитывать.
Из условия следует, что
  • фигура есть квадрат со стороной 250, повернутый на 45 градусов
  • решать методом "подсчета точек" явно не стоит
  • рисовать сетку тоже смысла не имеет, но нарисуем оси
  • нарисуем чертеж и подумаем

Нарисуем задание на бумаге в клеточку и получим примерно следующее
Затем напишем программу от лица Черепашки и выведем координаты вершин A, B, C, D
 

 

 

Скопируем значения A,B,C. Нужны вещественные значения (точности должно хватить) 

A = (0.00, 0.00)
B = (176.78, -176.78)
C = (0.00, -353.55)
D = (-176.78, -176.78)

Запишем их в комплексном представлении. Создадим пару подпрограмм

  1. ksp(a, b, r=0) - возвращает скалярное произведение a на b при r=0 и векторое/косое произведение a на b в противном случае
  2. angle(A, B, C, P) - возвращает 1 если точка P лежит строго внутри угла ABC (угол в геометрическом смысле, то есть меньше развернутого) 
    0 в противном случае (в том числе если угол нулевой или развернутый - эти углы нас пока не интересуют)

Решать будем исходя из того, что выпуклый четырехугольник есть "пересечение двух противоположных углов, которые меньше развернутого"
Надо понять, как определить, что точка P лежит внутри угла ABC (который меньше развернутого, то есть "геометрический угол")
Будем рассматривать прямые как ориентированные объекты (то есть направление прямой AB задается направлением от точки A к точке B)
Тогда \(P\in\angle ABС \) тогда и только тогда, когда
  • A, P лежат по одну сторону от BC 
  • и C,P лежат по одну сторону от BA
Это нетрудно проверить с помощью векторного/косого произведений
 

 

Итак способ работает на четырех угольниках с поиском внутренних точек.
Попробуем адаптировать на случай с включение точек на границе
Рассмотрим задание типа 42569 
Черепахе был дан для исполнения следующий алгоритм:
Повтори 16 [Налево 36 Вперёд 4 Налево 36]
Определите, сколько точек с целочисленными координатами будут находиться внутри области,
ограниченной линией, заданной данным алгоритмом. Точки на линии следует учитывать.

 
Размер фигуры небольшой, поэтому можно нарисовать рисунок с сеткой и "подсчитать руками".
Забудем  про это и модифицируем решение по данную задачу
Вначале, как и ранее, нарисуем макет на бумаге  и напишем программу от лица Черепашки
Координаты удобнее сразу выводить в комплексном предствалении (можно в строку через запятую)
 

 

 

  1. Вершин уже 5, поэтому заведем для них список.
  2. Углы можно брать через один, но будем считать, что многоугольник есть пересечение всех углов
  3. Надо проверять принадлежность стороне и совпадение с вершиной.
    Напишем программу, проверки принадлежности точки интервалу (AB)
    Совпадение будем проверять только с начальной точкой стороны (то есть для AB с вершиной A)
  4. Координаты точек на сторонах будем выводить
Точка принадлежит интервалу (AB) если она принадлежит лучам AB и BA
\(P \in \overrightarrow{AB}<=>\ когда\ векторное\ \overrightarrow{AP}\cdot\overrightarrow{AB} = 0,\\ а\ скалярное\ \overrightarrow{AP}\cdot\overrightarrow{AB} > 0 \)


Скопируем значения A,B,C,D,E в список в комплексном представлении
Для проверки принадлежности точки интервалу напишем подпрограмму interval(A,B,P)

 

 

Подведем небольшой итог.
Для решения задач вычислительной геометрии с исполнителями типа Черепашка, Чертежник полезно 
  1. Хранить точки плоскости в "комплексном" представлении. Это "облегчает" действия с векторами
  2. Для решения задач нужно уметь составлять подпрограммы
    1. скалярного и векторного/косого произведения
    2. проверки принадлежности точки прямой, лучу, отрезку/интервалу
    3. проверки положения точки относительно ориентированной прямой
    4. проверки принадлежности точки "геометрическому" углу
    5. проверки вида "ориентированного" угла (меньше развернутого, больше развернутого, развернутый, нулевой)
    6. получать уравнение прямой по точкам
    7. находить точку пересечения прямых
  3. Знать некоторые методы библиотеки cmath (polar, phase)
  4. Полезно знать операции с комплексными числами и их геометрические свойства
Печать