Блог от AS3Coder'a о JavaScript, HTML, CSS... и немного о Flash.

пятница, 15 января 2010 г.

Простейшая геометрия ActionScript 3.0

Работая над казалось бы простыми проектами, иногда нам приходится прибегнуть к знаниям геометрии. У многих здесь и начинаются мучения... Поэтому я решил рассмотреть наиболее популярные примеры.

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

Продолжение следует...
Пишите в комментариях, какие еще примеры геометрии вы хотите увидеть, и я постараюсь их рассмотреть в следующих постах.
  

12 комментариев:

  1. все немного проще:
    расстояние между точками -
    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;

    ОтветитьУдалить
  2. Классно! За всем не уследишь, как говорится... Побежал в Help смотреть, что там еще новенького есть :) Спасибо

    ОтветитьУдалить
  3. А может есть уже библиотека определения трехмерной координаты точки на сфере по входным параметрам широты и долготы?
    Собственно это несложно, но может уже есть готовое? Неохота велосипед изобретать.
    Что-бы понятнее, есть 3D модель глобуса, на ней должны размещаться маркеры (с координатами xyz с началом отсчета в центре "глобуса") соответствующие реальным координатам. Точность с учетом реальной геометрии земли не нужна, достаточно просто сферу.
    Буду благодарен за любую подсказку.

    ОтветитьУдалить
  4. Приходилось только работать с проекциями карт мира на плоскость. Как считаются координаты по широте и долготе в 3D не знаю. Нужно искать. Наверняка, что-то удастся найти.

    ОтветитьУдалить
  5. В общем пришлось писать самому... пока еще сыровата функция (хочется просто писать типа "40'13'' в.д","55'05'' с.ш.") и получать маркер на глобусе... но доработать уже несложно...
    а математика взята отсюда http://ru.wikipedia.org/wiki/Географические координаты
    проверенно, работает очень хорошо.

    ОтветитьУдалить
  6. ОК!
    Спасибо. это в основном уже готово. но в дополнение пригодится.
    tnx

    ОтветитьУдалить
  7. Развитие процесса можно будет наблюдать по временному адресу
    http://i-love-u.su/globus.html

    ОтветитьУдалить
  8. В таких вещах нежелательно округлять так грубо. На выходе получается, что расстояние в 190 получается при сторонах треугольника: 190 и 0, 190 и 13. Первый верный, второй - нет.

    ОтветитьУдалить
  9. Простите, поскольку речь пошла об округлении, не подскажете как округлять числа в actionscript 3.0?

    ОтветитьУдалить
  10. Добрый день!

    Не могу разобраться с методом удаление точки от заданной точки. Можно ли определять в данном случае угол методом Math.atan2?

    Заранее спасибо.

    ОтветитьУдалить

Можно использовать некоторые HTML-теги, например <b>, <i>, <a>

Поиск по блогу

Обо мне



Farid Shamsutdinov (AS3Coder)
Russia, Tatarstan, Kazan
as3coder@gmail.com

Подробнее...

Постоянные читатели

© 2014 Farid Shamsutdinov. При копировании материалов, ссылка на источник обязательна. Технологии Blogger.