[Из песочницы] Приложение Московское метро для Windows Store

puzlshenzir1aualmlmu0gf3l7u.png

Сделать приложение Московского метро мне захотелось сразу же, как только Артемий Лебедев и его студия нарисовали схему метро в нынешнем виде.

1. Исходные данные


Сейчас официальную схему метро можно загрузить в PDF с официального сайта Московского метрополитена. На момент создания приложения (середина 2013 года) схема была доступна в виде .ai файла (Adobe Illustrator) на сайте студии Лебедева. В любом случае, следующий этап — это подготовка данных в Illustrator’e.

2. Подготовка данных


Открываем PDF в Illustrator, включаем режим preview и падаем в обморок.

ужас-ужас
ehcrq3diqk18etnwi5jqhwybqhc.png
(кликабельно)


После долгой и кропотливой работы (тут мне пригодился многолетний опыт работы в московской рекламной газете, сначала в отделе дизайна и вёрстки, затем в IT-отделе)

получилось следующее
acxd-mmhmw9kzgdt-benemt11cs.png
(кликабельно)


Что было сделано:

  • удален многочисленный мусор, надписи и пр.
  • каждая линия метро была разбита на участки между станциями. Линии разбивались под рисунками станций, чтобы при отрисовке построенных маршрутов не было видно стыков и разрывов.


вот так:
165jeugquvuqe70rasrmh6zbnfm.png


— все «кусочки» линий и все станции, относящиеся к каждой линии, сгруппированы по слоям, в порядке их следования.

вот так:
e7armrtpinixbwsfvrvcts75zjw.png


3. Преобразуем графику в XAML


Для перевода графики в XAML используется Microsoft Expression Design. Тут всё просто — открываем ai-файл, экспортируем в XAML.

Microsoft Expression Design:
es3o6mgupfhq9co8c_gltatyabk.png
(кликабельно)


4. Начинаем программирование (наконец-то)


В настоящий момент времени для разработки используется Visual Studio 2015 и MVVM-фреймворк MVVM-light. К сожалению, XAML-файл, полученный на предыдущем этапе, напрямую в приложении использовать не получится, кроме статичного слоя с реками и маршрутами «аэроэкспрессов».

Поэтому еще немного работы вручную — и в ресурсах приложения формируем окончательный XML-файл, используемый для рендеринга схемы метро. При его загрузке формируются объекты линий метро, станций метро, формируются связи между станциями в пределах одной линии, переходы между линиями, «замыкаются» кольцевые линии. К слову, переходы между линиями формируются программно. Между двумя станциями — проводятся линии с градиентом заливки, между тремя станциями — строятся дуги окружности, построенной по трём точкам — центрам станций, из которых состоит переход.

Пример View-слоя, отвечающего за отрисовку дуг переходов между тремя станциями (для краткости удалены ресурсы, отвечающие за анимацию и пр.):


                    
                        
                            
                                
                                    
                                        
                                            
                                                
                                                    
                                                        
                                                            
                                                                
                                                            
                                                        
                                                    
                                                
                                            
                                        
                                    
                                
                                
                                    
                                        
                                            
                                                
                                                    
                                                        
                                                            
                                                                
                                                            
                                                        
                                                    
                                                
                                            
                                        
                                    
                                
                            
                        
                    
                    
                        
                            
                        
                    
                


Для поиска маршрутов используется волновой алгоритм с небольшими вариациями. Например, в случае, если находится оптимальный маршрут, содержащий два и более переходов, строятся дополнительные маршруты, в которых запрещено использовать «промежуточные» линии метро. В результате иногда получаются крайне парадоксальные и неожиданные варианты проезда (смотрите скриншоты ниже).

Для поиска необходимого вагона для удобного перехода на другую линию метро использовался следующий подход: у каждой линии установлено направление «вперед» и «назад». Соответственно, нам важно, с какой стороны мы подъехали к станции перехода, и иногда нам еще важно, в каком направлении мы поедем по той линии, на которую переходим.

Фрагмент XML-файла, описывающий станцию «Китай-город» Таганско-Краснопресненской линии и ее характерный переход на Калужско-Рижскую линию:


          
            
              
                
                
              
            
            
              
                
                
              
            
          


5. Несколько скриншотов построенных маршрутов (кликабельно)


Неожиданный маршрут от Киевской-кольцевой до Курской-Кольцевой:
xof0litpgw8coavgd0gf3q9net4.png


Ещё более неожиданный маршрут от Александровского сада до Боровицкой:
gpb_vqh5v9xfu9axmmrigskcpdw.png


От Охотного ряда до Площади Революции:
atn5p4ioc9pq0doyamzm42miixg.png


Вполне заурядно от Шаболовской до Тульской
4ddoeqjhad3ylascwxv92wbvlco.png


6. Планы


На момент начала разработки приложения (напомню — это начало-середина 2013 года) речь шла об Windows 8 — 8.1. Собственно, приложение до сих пор «не-UWP». Соответственно, у приложения до сих пор есть «родимые пятна» Windows 8.1, в частности, неоднозначное расположение настроек приложения. Чего уж говорить, в Windows 10 «шарм» настроек «а-ля Windows 8.1» смотрится слегка чужеродно. Со временем, вероятно, это будет изменено.

как это сейчас:
plrzh_5j6tdghp8pc5-vvxjs3vw.png


В последнее обновление пришлось «выпилить» информацию о выходах в город (т.е., сейчас нет подсказки, в какой вагон садиться, чтобы было удобно выйти в город). Это в ближайших планах.

© Habrahabr.ru