## Road Searcher
#### Структура программы:
+ img.h  - модуль для работы с картинками, пока поддержка только BMP формата.
+ graphmap.h - модуль построения графа по картике и нахождение в нем маршрутов.
+ roadSearcher.cpp - главный код
____
### Модуль img.h - работа с картинками


######  template <class T\> class Img
<br>
Абстрактный класс картинки. Представляет собой структуру вроде двумерного массива, в каждой ячейке которого может хранится любая информация, которую можно задавать и менять.


### Cвойства: <br><br>
> <b> int width, height; </b> - широта и высота <br>
> 
> <b> Row <T\>  *data; </b> - массив строк данных, которые хранятся в ячейке <br>
> 
<b> Settings settings; </b> - настройки для разных типов данных (если это будет работа с картинкой) <br>

### Методы: <br><br>
> <b> Img(int width, int height) </b>- конструктор с укозанием широты и высоты <br>
><b> Img() </b>- конструктор по умолчанию  <br>
> <b> init() </b> - инициализация картинки(данных) по широте и высоте <br>
> <b>Row <T\> operator[](int n)</b> - перегрузка оператора [] для возможности обращения к каждой строке данных<br>
_____
######  template <class T\> class Row 
Вспомогательный класс, для реализации структуры 2х мерного массива с данными

### Cвойства: <br><br>
> <b>int width;</b> - ширина строки<br>
 <b> T** pixel; </b> - ячейка с хранимыми данными<br><br>
### Методы: <br><br>
> <b>Row()</b> - конструктор по умолчанию<br>
> <b> Row(int width)</b> - конструктор с шириной, инициализация по ширине<br>
> <b> T* operator[](int n)</b> - перегрузка оператора [] для возможности обращения к каждой ячейке данных<br> 

_____
#####  Работа с BMP
_____
######  class Pixel  
Хранит информацию о пикселе картинки( параметр для класса Img) <br> 
### Cвойства:<br><br>
int r; - красный цвет<br>
int g; - зелены цвет<br> 
int b; - синий цвет<br>
int a; - канал<br>

### Методы:
> конструктор (r, g, b),<br> конструктор (), <br>конструктор (r, g, b, a)<br>
> 
_____
##### Структура settings - для прописания настроек картинки

	struct Settings
	{
		//настройки для bmp файла
		unsigned int imgWidth = 500, imgHeight = 500;
		unsigned char signature[2] = { 'B', 'M' };
		unsigned int fileSize = 14 + 40 + imgWidth * imgHeight * 3;
		unsigned int reserved = 0;
		unsigned int offset = 14 + 40;
		
		unsigned int headerSize = 40;
		unsigned int dimensions[2] = { imgWidth, imgHeight };
		unsigned short colorPlanes = 1;
		unsigned short bpp = 32;
		unsigned int compression = 0;
		unsigned int imgSize = imgWidth * imgHeight * 3;
		unsigned int resolution[2] = { 2795, 2795 };
		unsigned int pltColors = 0;
		unsigned int impColors = 0;
		int lineImgSize
	};
##### Класс BMP, наследник Img c параметром Pixel

### Cвойства: что и у IMG
### Методы:
> <b>void read()</b> - считывание bmp картинки<br>
> <b>void write()</b> - запись bmp картинки <br>
> BMP() {} - конструктор по умолчанию;
_____
### Приминение:

	BMP img;
	cout << "Start read...";
	img.read("test30.bmp");//считываем
	img[4][5]->r = 180; //задаем пикселю с индексом 4-5 значение красного 180
	img.write("output.bmp");//записываем
	cout << "End." << endl;
___

### Модуль graphmap.h - построение графа и нахождение маршрутов

##### class Node


### Cвойства: <br><br>
 <b>bool vizited;</b> - посещен ли узел
 <b>int w; </b>- вес узла (или его возвышенность)<br>
 <b>int distation;</b> - расстояние до нужной точки (или выхода)<br>
 <b>int dirCount;</b> - количество возможных направлений<br>
 <b>Pixel data;</b> - данные внутри узла<br>
 <b>Position pos; </b>- позиция узла<br>
 <b>Node *branches[8];</b> - соседние узлы<br>

### Методы: <br><br>
>  <b> void calcWeight</b> - подсчет веса узла <br>
>  <b>calcDistation(Node previos)</b> - рассчет расстояния относительно переданного предыдущего узла<br>
>  <b>operator < (const Node &v2) const</b> - перегрузка операторов больше меньше, для очереди с приорететом <br>
____
###### struct fo_sort - структура для сортировки указателей на узлы дерева

____
##### class Graph наследник Img (чтобы была возможность обратится к каждому узлу через индексы)


### Cвойства: <br><br>
 <b>BMP map;</b> - картина на основе которой строится граф<br>
 <b>Position start;</b> - позиция откуда начнется поиск<br>
### Методы: <br><br>
> <b> Graph(BMP map)</b> - конструктор дерева по картинке (собирает из картинки граф)<br>
> <b> calcdijkstra(Position start)</b> - рассчет расстояний до каждого узла дерева от точки start<br>
> <b> drowRoad(Position end)</b> - рисует дорогу от начальной точки до точки end;<br>

### Приминение:

	BMP img;
	cout << "Start read...";
	img.read("test29.bmp");//загружаем картинку
	//img.write("output.bmp");
	cout << "End." << endl;

	cout << "Building tree...";
	Graph map(img); //строим древо по этой картинке
	cout << "End." << endl;

	try 
	{ 
	 cout << "Drowing roud...";
	 map.calcdijkstra(Position(220, 220)); //считаем все маршруты от точки 220 220
	 BMP out = map.drowRoad(Position(860, 860)); //прокладываем маршрут к точке 860 860

	 out.write("output30.bmp"); //записываем получившийся результат
	 cout << "End." << endl;
	}
	catch (char* error) // если маршрут не найдет выводим ошибку
	{
		cout << error <<endl;
	}
### Результат для кривой дракона:
### Лабиринт:
<img src = "http://git.fl8.ru/Babycar/RoadSearcher/test29.bmp" width = '400px'>
### Выход (зеленая линия):
<img src = "http://git.fl8.ru/Babycar/RoadSearcher/output29.bmp" width = '400px'>
