Отрезки, точки, измерение углов
Выложу несколько классов для работы с геометрией, которые я часто использую.
Прежде чем проверять примеры, создайте фолдер со всеми классами из этой статьи (APoint, Angle и Edge).Для начала маленький класс для угла.
Всё что он делает - скрывает реализацию конвертации углов в радианы и наоборот и перенаправляет методы класса Math - sin(), cos(), tan(). Мне кажется более логичным обращаться к синусу угла так
чем
Вот класс, ничего сложного, в описании не нуждается. Один момент - класс автоматически округляет значения углов в радианах до пятого знака (можно поменять точность) при сравнении.
Используется тривиально. Лишнего описания не требуется
Класс точки:
distance(p:APoint):Number
Методы distance и to - дублируют метод Point.distance(p1, p2). Мне кажется более логичным делегировать статический метод класса объекту, хотя это ваше дело.
angle(p1:APoint, p2:APoint, [p3:APoint]):Object
Метод angle - возвращает угол образованный тремя точками. Вершиной угла в функции выступает инстанция точки, в которой вызвали метод.
опционально можно указать третий агрумент - точку, которая лежит внутри угла. Дело в том, что функция angle() - возвращает НЕ развернутый угол. Т.е. меньший , если конечно же три точки не лежат на одной прямой.
Иногда бывает нужно узнать развернутый угол. Например в невыпуклом многоугольнике. Для этого нужно указать третьим параметром точку лежащую внутри угла.
А вот класс отрезка или, как это называют в зарубежной литературе, - edge. Включает в себя 4 элемента - точку начала, конечную точку (если потребуется работать с отрезком как с вектором) и коэффициенты k, b. k- угловой коэффициент, b - смещение по оси Oy.
Edge(p1:APoint, p2APoint)
В конструкторе указываем две точки, которые будут служить началом и концом отрезка.
Методы
cross(e:Edge):Object
Методом cross можно определить пересекаются ли отрезки или нет, если пересекаются , то как. Этот метод принимает один аргумент - отрезок (инстанцию класса Edge). И рассматривает все возможные случаи пересечения.
Метод возвращает объект содержащий два поля:
cross(edge).type:String - тип пересечения. Все типы пересечений перечислены в классе энумерации EdgeCross.
cross(edge).p:APoint - точка пересечения. Если отрезки не параллельны, в не зависимости от того пересекаются ли отрезки или нет, возвращается точка содержащяя координаты пересечения прямых, содержащих эти отрезки. Что очень удобно, т.к мы можем использовать класс Edge для нахождения координат пересечения двух прямых заданных двумя точками.
Свойства
b:Number [read-only]
Коэффициент смещения прямой по оси oY содержащей отрезок.
k:Number [read-only]
Угловой коэффициент прямой содержащей отрезок.
p1:APoint
p2:APoint
Начальная и конечная точки отрезка - вектора.
Во время изменения точек отрезка , происходит перерасчёт коэффициентов k и b. Эти коэффициенты часто используются при математических расчётах.
length:Number [read-only]
возвращает длину отрезка.
Правда в этом классе есть один недостаток. Если пересечением двух отрезков являться другой отрезок , то функция возвращает null вместо точки p, однако однако следовало бы возвращать отрезок.
Leave a Reply
You must be logged in to post a comment.
