1. Расстояние между двумя точками.
Через две точки A и B строим прямоугольный треугольник c прямым углом в точке С. Отрезок AB, в данном треугольнике будет являться гипотенузой. Гипотенузу можно найти применив теорему Пифагора.
Алгебраическая формулировка теоремы Пифагора:
В прямоугольном треугольнике квадрат длины гипотенузы равен сумме квадратов длин катетов.
Отсюда можно вынести:
Осталось узнать длину катетов AC и BC. Их мы можем найти зная координаты точек A и B.
Пример:
Метод:
public function getDistance (a:Point, b:Point):Number { return Math.sqrt((b.x - a.x)*(b.x - a.x) + (b.y - a.y)*(b.y - a.y)); }
2. Удаление одной точки от другой на заданное расстояние в заданном направлении (на заданный угол).
Для этого нужно просто спроецировать вектор заданной длины и заданного угла на координатные оси X и Y. Для этого нам понадобятся прямоугольный треугольник и немного тригонометрии. Рассмотрим проекцию на горизонтальную ось. Допустим точка А - это начало вектора и нам необходимо из неё провести вектор заданной длиной с заданным углом. Для этого построим прямоугольный треугольник с острым углом в точке A. Теперь зная длину отрезка AB и значение угла BAC мы можем найти AC по следующей формуле.
Тоже самое проделаем и для вертикальной оси и получим координаты точки B.
Пример:
Метод:
public function getVector (length:Number, angle:Number):Point { var a:Number = Math.abs(length) * Math.cos(angle); var b:Number = Math.abs(length) * Math.sin(angle); return new Point(a, b); }
А вообще лучше такие методы собирать в классе. Для этого я создал новый статический класс ru.as3coder.geom.Geom, который буду постепенно пополнять.
Geom.as |
Продолжение следует...
Пишите в комментариях, какие еще примеры геометрии вы хотите увидеть, и я постараюсь их рассмотреть в следующих постах.
все немного проще:
ОтветитьУдалитьрасстояние между точками -
import flash.geom.*;
var pt1:Point = new Point(circle1.x, circle1.y)
var pt2:Point = new Point(circle2.x, circle2.y)
var distance:Number = Point.distance(pt1, pt2);
-перемещение экранного объекта на заданный угол и расстояние:
import flash.geom.*;
var distance:Number = 100;
var angle:Number = 2 * Math.PI * (90 /
var translatePoint:Point = Point.polar(
myDisplayObject.x += translatePoint.x;
myDisplayObject.y += translatePoint.y;
Классно! За всем не уследишь, как говорится... Побежал в Help смотреть, что там еще новенького есть :) Спасибо
ОтветитьУдалитьА может есть уже библиотека определения трехмерной координаты точки на сфере по входным параметрам широты и долготы?
ОтветитьУдалитьСобственно это несложно, но может уже есть готовое? Неохота велосипед изобретать.
Что-бы понятнее, есть 3D модель глобуса, на ней должны размещаться маркеры (с координатами xyz с началом отсчета в центре "глобуса") соответствующие реальным координатам. Точность с учетом реальной геометрии земли не нужна, достаточно просто сферу.
Буду благодарен за любую подсказку.
Приходилось только работать с проекциями карт мира на плоскость. Как считаются координаты по широте и долготе в 3D не знаю. Нужно искать. Наверняка, что-то удастся найти.
ОтветитьУдалитьВ общем пришлось писать самому... пока еще сыровата функция (хочется просто писать типа "40'13'' в.д","55'05'' с.ш.") и получать маркер на глобусе... но доработать уже несложно...
ОтветитьУдалитьа математика взята отсюда http://ru.wikipedia.org/wiki/Географические координаты
проверенно, работает очень хорошо.
Вот здесь еще посмотрите.
ОтветитьУдалитьОК!
ОтветитьУдалитьСпасибо. это в основном уже готово. но в дополнение пригодится.
tnx
Развитие процесса можно будет наблюдать по временному адресу
ОтветитьУдалитьhttp://i-love-u.su/globus.html
В таких вещах нежелательно округлять так грубо. На выходе получается, что расстояние в 190 получается при сторонах треугольника: 190 и 0, 190 и 13. Первый верный, второй - нет.
ОтветитьУдалитьПростите, поскольку речь пошла об округлении, не подскажете как округлять числа в actionscript 3.0?
ОтветитьУдалитьСмотрите Math.floor(), Math.ceil(), Math.round()
ОтветитьУдалитьДобрый день!
ОтветитьУдалитьНе могу разобраться с методом удаление точки от заданной точки. Можно ли определять в данном случае угол методом Math.atan2?
Заранее спасибо.