Исходная информация: N – количество деревьев в саду, (xi, yi) – координаты деревьев, i = 1, 2, …, N. Так как были высажены молодые саженцы, то их толщиной можно пренебречь.
Требуется определить, к каким из посаженных деревьев надо при- вязать веревку так, чтобы все деревья оказались внутри обнесенной зоны, а длина веревки была минимальная.
Эта и подобные ей задачи сводятся к определению для заданного множества точек на плоскости выпуклой оболочки, то есть выпуклого многоугольника с вершинами в некоторых точках из заданного множества, охватывающего все его точки. В [2] приведено несколько вариантов решения такой задачи с учетом временных затрат на выполнение алгоритмов. Здесь мы рассмотрим способ, использующий свойства скалярного произведения векторов.
Будем строить выпуклую оболочку в порядке обхода участка по ча- совой стрелке. Найдем самую левую точку М0 = (x0, y0), x0 = min{xi}. Если таких точек несколько, то возьмем самую нижнюю из них. Эта точка наверняка принадлежит искомой выпуклой оболочке. Зададим первоначальный вектор a0 с началом в точке (x0, y0), параллельный оси Oy.
Следующей точкой оболочки будет такая точка М1, чтобы вектор a1 с началом в точке М0 и концом в точке М1 образовывал с первоначальным вектором a0 минимальный угол. Если таких точек несколько, то выбирается точка, расстояние до которой максимально.
Далее процесс продолжаем, то есть ищем точку М2 с минимальным углом между вектором a1 и вектором a2 с началом в точке М1 и концом в точке М2, затем точку М3 и т. д. Процесс прекращаем, когда дойдем до первой выбранной точки или количество точек в оболочке станет равно N. Для определения угла между векторами используется скалярное произведение. Причем сам угол можно не вычислять, так как минимальному углу соответствует максимальный косинус угла.
Выполнить работу в программе SharpDeveloper (C#)
Гарантия на работу | 1 год |
Средний балл | 4.96 |
Стоимость | Назначаете сами |
Эксперт | Выбираете сами |
Уникальность работы | от 70% |