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

Показаны сообщения с ярлыком Алгоритмы. Показать все сообщения
Показаны сообщения с ярлыком Алгоритмы. Показать все сообщения

понедельник, 15 марта 2010 г.

Проекция точек на карту мира по географическим координатам

В данной статье мы рассмотрим проекцию точек на карту мира по географическим координатам: широте и долготе. А если сказать точнее, то "Мы рассмотрим проекцию городов". Для примера возьмем посетителей этого блога, и покажем на карте их географию.

Выбор карты

Первым делом необходимо выбрать карту, а точнее картографическую проекцию.

Картографические проекции - это математические способы изображения на плоскости поверхности земного эллипсоида или шара.

Проекции различают по характеру изображения:
  • равноугольные, 
  • равновеликие,
  • произвольные; 
и по виду изображений параллелей и меридианов:

Цилиндрические
Конические
Азимутальные
Поликонические
Псевдоконические
Псевдоцилиндрические:
Наиболее популярными являются цилиндрические карты. Мы же выберем превдоцилиндрическую проекцию "Произвольная псевдоцилиндрическая проекция Робинсона (Robinson Cylindrical)".



Преобразование координат

Если посмотреть на вышеприведенную схему, то видно, что величина долготы обратно-пропорциональна модулю значения широты. Т.е. при увеличении модуля широты уменьшается   долгота. А величина широты, прямо-пропорциональна модулю её значению. Т.е. чем больше модуль значения, тем больше величина.

Из этого следует что у нас есть две пропорции, зависящие от значения широты.
  • PLEN - Пропорция изменения величины долготы
  • PDFE - Пропорция изменения величины широты


---------|--------|-------
Latitude | PLEN   | PDFE
---------|--------|-------
00       | 1.0000 | 0.0000
05       | 0.9986 | 0.0620
10       | 0.9954 | 0.1240
15       | 0.9900 | 0.1860
20       | 0.9822 | 0.2480
25       | 0.9730 | 0.3100
30       | 0.9600 | 0.3720
35       | 0.9427 | 0.4340
40       | 0.9216 | 0.4958
45       | 0.8962 | 0.5571
50       | 0.8679 | 0.6176
55       | 0.8350 | 0.6769
60       | 0.7986 | 0.7346
65       | 0.7597 | 0.7903
70       | 0.7186 | 0.8435
75       | 0.6732 | 0.8936
80       | 0.6213 | 0.9394
85       | 0.5722 | 0.9761
90       | 0.5322 | 1.000
Естественно градация в 5 градусов для широты огромна, и для отображения городов на карте не приемлема. Поэтому необходимо заполнить эту табличку для каждого целого числа от 0 до 90 градусов. А уже имея заполненную табличку с пропорциями, несложно сделать преобразование координат. Для всего этого я написал класс, который сделает всё за нас.

ru.as3coder.map.projection.Robinson.as

В конструктор экземпляра нужно передать ссылку на экземпляр карты Робинсона класса flash.display.DisplayObject. При инициализации автоматически заполнятся массивы с пропорциями, после чего будет доступен метод преобразования координат export c параметрами latitude и longitude, который вернет экземпляр класса flash.geom.Point с координатами для указанного в конструкторе экземпляра карты.

var robinson:Robinson = new Robinson(map_sprite);
var point:Point = robinson.convert(55.7558, 37.6176);

География посетителей

В качестве примера я обещал привести географию посещения моего блога на карте мира.


Использованы данные на 11 марта 2010 года.

четверг, 15 октября 2009 г.

Алгоритм Дейкстры на ActionScript 3.0

Столкнулся на работе с графами. Необходимо было найти кратчайший путь в заданном графе между двумя вершинами. Для решения задачи решил использовать алгоритм Дейкстры.

Алгоритм Дейкстры - алгоритм находит кратчайшее расстояние от одной из вершин графа до всех остальных. Алгоритм работает только для графов без рёбер отрицательного веса. Назван в честь изобретателя Эдсгера Дейкстры.

Поискал в гугле. Нашел вот этот вариант реализации алгоритма на Action Script. Казалось бы задача решена, но, при попытке скомпилировать пример, посыпались ошибки. Разбираться было некогда, пришлось писать самому :)

На сайте http://www.allbest.ru/ нашел курсовую работу "Программная реализация алгоритма Дейкстры (построение цепей минимальной длины)". Прочитав работу, немного поразмыслив, получилось следующее:



В итоге 4 класса:
  1. Vertex.as - класс для описания вершин.
  2. Edge.as - класс для описания связей.
  3. Graph.as - класс для описания графа.
  4. GraphMethods.as - статический класс с методами работы с графами. Пока только один метод getDijkstraPath(). Позже буду добавлять новые методы :)

graph.zip (3 Кб)

Как этим пользоваться?

Создаем вершины.

var vertex1:Vertex = new Vertex("v1");
var vertex2:Vertex = new Vertex("v2");
var vertex3:Vertex = new Vertex("v3");
var vertex4:Vertex = new Vertex("v4");
var vertex5:Vertex = new Vertex("v5");
...
Свяжем некоторые вершины, с указанием расстояния между ними.

var edge1:Edge = new Edge(vertex1, vertex3, 50);
var edge2:Edge = new Edge(vertex3, vertex4, 75);
var edge3:Edge = new Edge(vertex3, vertex5, 25)
...
Создаем граф.

var graph:Graph = new Graph();
Вершины и связи добавим на граф.
graph.addVertex(vertex1);
graph.addVertex(vertex2);
graph.addVertex(vertex3);
graph.addVertex(vertex4);
graph.addVertex(vertex5);
...
//
graph.addEdge(edge1);
graph.addEdge(edge2);
graph.addEdge(edge3);
Вычислим кратчайший путь от первой вершины до четвертой, используя алгоритм Дейкстры.

var path:/*Vertex*/Array = GraphMethods.getDijkstraPath(graph, vertex1, vertex4);
Вот и всё :)

Ссылки по теме:

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

Обо мне



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

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

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

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