## 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><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 - построение графа и нахождение маршрутов
____
## <b> class Node </b>



### 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 <Node>

##### Наследник Img с параметрм Node(чтобы была возможность обратится к каждому узлу через индексы)
### 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;
	}
### Результат для кривой дракона:
### Лабиринт:
![test29] (http://git.fl8.ru/Babycar/RoadSearcher/src/master/test29.bmp)
### Выход (зеленая линия):
![output29] (http://git.fl8.ru/Babycar/RoadSearcher/src/master/output29.bmp)
