<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>Нереальное реально</title>
		<link>http://vsreality.com/</link>
		<description>Блог</description>
		<lastBuildDate>Thu, 20 Aug 2009 16:56:03 GMT</lastBuildDate>
		<generator>uCoz Web-Service</generator>
		<atom:link href="https://vsreality.3dn.ru/blog/rss" rel="self" type="application/rss+xml" />
		
		<item>
			<title>Алгоритм построения карты роботом</title>
			<description>&lt;h2&gt;&lt;p&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-weight: normal;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;Не знаю можно или нет отнести этот алгоритм построения карты роботом
к векторному. Суть его заключается в том, что робот двигается по
полигону прямыми отрезками встречая препятствие от останавливается тем
самым завершая отрезок, разворачивается на какой либо угол и начинает
вновь свое движение до следующего препятствия. Таким способом он
покрывает отрезками всю территорию полигона.&lt;br startcont=&quot;this&quot;&gt;
Это видно на рисунки(голубые отрезки и красные точки 1-14)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;alignnone size-full wp-image-21&quot; title=&quot;map&quot; src=&quot;http://24.47.118.104:7777/blog/wp-content/uploads/2009/07/map3.jpg&quot; mce_src=&quot;http://24.47.118.104:7777/blog/wp-content/uploads/2009/07/map3.jpg&quot; alt=&quot;map&quot; width=&quot;600&quot; height=&quot;410&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-weight: normal;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;После этапа разведки, начинается анализ данных. На этом этапе
находятся точки пересечения отрезков(на рисунке зеленые точки 1&apos; и 2&apos;)
Когда все пересечения найдены можно приступать к использованию карты
например для того, что бы перейти из точки 4 в току 9 после применения
алгоритма нахождения кротчайшего пути, робот выберет путь 4-5-2&apos;-9. Не
очень понятно объяснил но думаю вы поймете. Почему точка 2&apos; может быть
использована? Потому что движение робота на отрезках 5-6 и 8-9 свободно
и проверенно. Этот пример похож чем то на железные дороги. Самое
сложное в реализации этого алгоритма это то, что робот всегда должен
точно знать где он находится, хотя это важно и для всех подобных
алгоритмов.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/h2&gt;</description>
			<content:encoded>&lt;h2&gt;&lt;p&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-weight: normal;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;Не знаю можно или нет отнести этот алгоритм построения карты роботом
к векторному. Суть его заключается в том, что робот двигается по
полигону прямыми отрезками встречая препятствие от останавливается тем
самым завершая отрезок, разворачивается на какой либо угол и начинает
вновь свое движение до следующего препятствия. Таким способом он
покрывает отрезками всю территорию полигона.&lt;br startcont=&quot;this&quot;&gt;
Это видно на рисунки(голубые отрезки и красные точки 1-14)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;alignnone size-full wp-image-21&quot; title=&quot;map&quot; src=&quot;http://24.47.118.104:7777/blog/wp-content/uploads/2009/07/map3.jpg&quot; mce_src=&quot;http://24.47.118.104:7777/blog/wp-content/uploads/2009/07/map3.jpg&quot; alt=&quot;map&quot; width=&quot;600&quot; height=&quot;410&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-weight: normal;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;После этапа разведки, начинается анализ данных. На этом этапе
находятся точки пересечения отрезков(на рисунке зеленые точки 1&apos; и 2&apos;)
Когда все пересечения найдены можно приступать к использованию карты
например для того, что бы перейти из точки 4 в току 9 после применения
алгоритма нахождения кротчайшего пути, робот выберет путь 4-5-2&apos;-9. Не
очень понятно объяснил но думаю вы поймете. Почему точка 2&apos; может быть
использована? Потому что движение робота на отрезках 5-6 и 8-9 свободно
и проверенно. Этот пример похож чем то на железные дороги. Самое
сложное в реализации этого алгоритма это то, что робот всегда должен
точно знать где он находится, хотя это важно и для всех подобных
алгоритмов.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/h2&gt;</content:encoded>
			<link>https://vsreality.3dn.ru/blog/2009-08-20-18</link>
			<dc:creator>Milk3D</dc:creator>
			<guid>https://vsreality.3dn.ru/blog/2009-08-20-18</guid>
			<pubDate>Thu, 20 Aug 2009 16:56:03 GMT</pubDate>
		</item>
		<item>
			<title>Подключение библиотек в Microsoft Visual C++ Express edition</title>
			<description>&lt;p&gt;Для подключения сторонних библиотек в Microsoft Visual C++ необходимо:&lt;br&gt;
1. Указать папку, где находятся библиотеки&lt;br&gt;
 Сервис-&amp;gt;Пораметры-&amp;gt;Проекты и решения-&amp;gt;Каталоги VC++&lt;br&gt;
В появившейся вкладке в выпадающем списке &quot;Показать каталоги для&quot;
выберите &quot;Файлы библиотек&quot;. На экране появится список директорий, где
VC будет искать библиотеки. Добавьте в него вашу директорию или
директории.&lt;/p&gt;
&lt;p&gt;2. Указать какие именно библиотеки надо включить в проект.&lt;br&gt;
 Проект-&amp;gt;Свойства-&amp;gt;Свойства конфигурации-&amp;gt;Компоновщик-&amp;gt;Ввод&lt;br&gt;
Добавьте в &quot;Дополнительные зависимости&quot; только имена библиотек которые следует включить в проект.&lt;/p&gt;
&lt;p&gt;3. Указать где находятся заголовочные файлы библиотек, т.е. указать
дополнительную директорию в которой VC будет искать файлы подключенные
директивой #include.&lt;br&gt;
 Сервис-&amp;gt;Пораметры-&amp;gt;Проекты и решения-&amp;gt;Каталоги VC++&lt;br&gt;
В появившейся вкладке в выпадающем списке &quot;Показать каталоги для&quot;
выберите &quot;Включаемые файлы&quot;. На экране появится список директорий, где
VC будет искать файлы. Добавьте в него вашу директорию или директории.&lt;/p&gt;</description>
			<content:encoded>&lt;p&gt;Для подключения сторонних библиотек в Microsoft Visual C++ необходимо:&lt;br&gt;
1. Указать папку, где находятся библиотеки&lt;br&gt;
 Сервис-&amp;gt;Пораметры-&amp;gt;Проекты и решения-&amp;gt;Каталоги VC++&lt;br&gt;
В появившейся вкладке в выпадающем списке &quot;Показать каталоги для&quot;
выберите &quot;Файлы библиотек&quot;. На экране появится список директорий, где
VC будет искать библиотеки. Добавьте в него вашу директорию или
директории.&lt;/p&gt;
&lt;p&gt;2. Указать какие именно библиотеки надо включить в проект.&lt;br&gt;
 Проект-&amp;gt;Свойства-&amp;gt;Свойства конфигурации-&amp;gt;Компоновщик-&amp;gt;Ввод&lt;br&gt;
Добавьте в &quot;Дополнительные зависимости&quot; только имена библиотек которые следует включить в проект.&lt;/p&gt;
&lt;p&gt;3. Указать где находятся заголовочные файлы библиотек, т.е. указать
дополнительную директорию в которой VC будет искать файлы подключенные
директивой #include.&lt;br&gt;
 Сервис-&amp;gt;Пораметры-&amp;gt;Проекты и решения-&amp;gt;Каталоги VC++&lt;br&gt;
В появившейся вкладке в выпадающем списке &quot;Показать каталоги для&quot;
выберите &quot;Включаемые файлы&quot;. На экране появится список директорий, где
VC будет искать файлы. Добавьте в него вашу директорию или директории.&lt;/p&gt;</content:encoded>
			<link>https://vsreality.3dn.ru/blog/2009-08-20-17</link>
			<dc:creator>Milk3D</dc:creator>
			<guid>https://vsreality.3dn.ru/blog/2009-08-20-17</guid>
			<pubDate>Wed, 19 Aug 2009 23:27:00 GMT</pubDate>
		</item>
		<item>
			<title>OpenCV</title>
			<description>Компьютерное зрение - это на сегодняшний день целая наука, занимающаяся
обработкой изображений, нахождением на них объектов, распознаванием
образов и многим другим. Она включает в себя элементы других наук таких
как математика, искусственный интеллект и д.р. Она сильно взаимосвязана
с ними, так как зрение и понимание увиденного - это сложный процесс.&lt;br&gt;
На сегодняшний день существует много средств облегчающих разработку
программного обеспечения по этой теме. Одним из таких средств является
OpenCV. В этой библиотеке собрано большое количество методов для работы
с изображениями, и с видео. Скорость выполнения программ написаны с
помощью данной библиотеки очень велика, а так же скорость их
разработки. Не буду описывать все её особенности, о них можно узнать на
многочисленных ресурсах в интернете, просто скажу что я недавно начал с
ней работать и пока она мне очень нравится.</description>
			<content:encoded>Компьютерное зрение - это на сегодняшний день целая наука, занимающаяся
обработкой изображений, нахождением на них объектов, распознаванием
образов и многим другим. Она включает в себя элементы других наук таких
как математика, искусственный интеллект и д.р. Она сильно взаимосвязана
с ними, так как зрение и понимание увиденного - это сложный процесс.&lt;br&gt;
На сегодняшний день существует много средств облегчающих разработку
программного обеспечения по этой теме. Одним из таких средств является
OpenCV. В этой библиотеке собрано большое количество методов для работы
с изображениями, и с видео. Скорость выполнения программ написаны с
помощью данной библиотеки очень велика, а так же скорость их
разработки. Не буду описывать все её особенности, о них можно узнать на
многочисленных ресурсах в интернете, просто скажу что я недавно начал с
ней работать и пока она мне очень нравится.</content:encoded>
			<link>https://vsreality.3dn.ru/blog/2009-08-20-16</link>
			<dc:creator>Milk3D</dc:creator>
			<guid>https://vsreality.3dn.ru/blog/2009-08-20-16</guid>
			<pubDate>Wed, 19 Aug 2009 23:23:43 GMT</pubDate>
		</item>
		<item>
			<title>OpenCV - Загрузка картинки</title>
			<description>#include &quot;highgui.h&quot;&lt;br&gt;
int main(int argc, char* argv[])&lt;br&gt;
{&lt;br&gt;&lt;blockquote class=&quot;webkit-indent-blockquote&quot; style=&quot;margin: 0 0 0 40px; border: none; padding: 0px;&quot;&gt;IplImage* img = cvLoadImage(&quot;Image.bmp&quot;);&lt;br&gt;cvNamedWindow( &quot;sims.bmp&quot;, CV_WINDOW_AUTOSIZE );&lt;br&gt;cvShowImage( &quot;sims.bmp&quot;, img );&lt;br&gt;cvWaitKey(0);&lt;br&gt;cvReleaseImage( &amp;amp;img );&lt;br&gt;cvDestroyWindow(&quot;Example1&quot;);&lt;/blockquote&gt;
}</description>
			<content:encoded>#include &quot;highgui.h&quot;&lt;br&gt;
int main(int argc, char* argv[])&lt;br&gt;
{&lt;br&gt;&lt;blockquote class=&quot;webkit-indent-blockquote&quot; style=&quot;margin: 0 0 0 40px; border: none; padding: 0px;&quot;&gt;IplImage* img = cvLoadImage(&quot;Image.bmp&quot;);&lt;br&gt;cvNamedWindow( &quot;sims.bmp&quot;, CV_WINDOW_AUTOSIZE );&lt;br&gt;cvShowImage( &quot;sims.bmp&quot;, img );&lt;br&gt;cvWaitKey(0);&lt;br&gt;cvReleaseImage( &amp;amp;img );&lt;br&gt;cvDestroyWindow(&quot;Example1&quot;);&lt;/blockquote&gt;
}</content:encoded>
			<link>https://vsreality.3dn.ru/blog/2009-08-20-15</link>
			<dc:creator>Milk3D</dc:creator>
			<guid>https://vsreality.3dn.ru/blog/2009-08-20-15</guid>
			<pubDate>Wed, 19 Aug 2009 23:21:52 GMT</pubDate>
		</item>
		<item>
			<title>OpenCV - Захват видео с камеры</title>
			<description>#include &quot;highgui.h&quot;&lt;br&gt;
int main(int argc, char* argv[])&lt;br&gt;
{&lt;br&gt;&lt;blockquote class=&quot;webkit-indent-blockquote&quot; style=&quot;margin: 0 0 0 40px; border: none; padding: 0px;&quot;&gt;cvNamedWindow( &quot;Example2&quot;, CV_WINDOW_AUTOSIZE );&lt;br&gt;CvCapture* capture = cvCreateCameraCapture(0);&lt;br&gt;int width = (int)cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_WIDTH);&lt;br&gt;int height = (int)cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_HEIGHT);&lt;br&gt;IplImage* frame;&lt;br&gt;while(1){&lt;br&gt;&lt;/blockquote&gt;&lt;blockquote class=&quot;webkit-indent-blockquote&quot; style=&quot;margin: 0 0 0 40px; border: none; padding: 0px;&quot;&gt;&lt;blockquote class=&quot;webkit-indent-blockquote&quot; style=&quot;margin: 0 0 0 40px; border: none; padding: 0px;&quot;&gt;frame = cvQueryFrame( capture );&lt;br&gt;if( !frame ) break;&lt;br&gt;cvShowImage( &quot;Example2&quot;, frame );&lt;br&gt;char c = cvWaitKey(33);&lt;br&gt;if( c == 27 ) break;&lt;/blockquote&gt;&lt;/blockquote&gt;&lt;blockquote class=&quot;webkit-indent-blockquote&quot; style=&quot;margin: 0 0 0 40px; border: none; padding: 0px;&quot;&gt;}&lt;br&gt;cvReleaseCapture( &amp;amp;capture );&lt;br&gt;cvDestroyWindow( &quot;Example2&quot; );&lt;/blockquote&gt;
}</description>
			<content:encoded>#include &quot;highgui.h&quot;&lt;br&gt;
int main(int argc, char* argv[])&lt;br&gt;
{&lt;br&gt;&lt;blockquote class=&quot;webkit-indent-blockquote&quot; style=&quot;margin: 0 0 0 40px; border: none; padding: 0px;&quot;&gt;cvNamedWindow( &quot;Example2&quot;, CV_WINDOW_AUTOSIZE );&lt;br&gt;CvCapture* capture = cvCreateCameraCapture(0);&lt;br&gt;int width = (int)cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_WIDTH);&lt;br&gt;int height = (int)cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_HEIGHT);&lt;br&gt;IplImage* frame;&lt;br&gt;while(1){&lt;br&gt;&lt;/blockquote&gt;&lt;blockquote class=&quot;webkit-indent-blockquote&quot; style=&quot;margin: 0 0 0 40px; border: none; padding: 0px;&quot;&gt;&lt;blockquote class=&quot;webkit-indent-blockquote&quot; style=&quot;margin: 0 0 0 40px; border: none; padding: 0px;&quot;&gt;frame = cvQueryFrame( capture );&lt;br&gt;if( !frame ) break;&lt;br&gt;cvShowImage( &quot;Example2&quot;, frame );&lt;br&gt;char c = cvWaitKey(33);&lt;br&gt;if( c == 27 ) break;&lt;/blockquote&gt;&lt;/blockquote&gt;&lt;blockquote class=&quot;webkit-indent-blockquote&quot; style=&quot;margin: 0 0 0 40px; border: none; padding: 0px;&quot;&gt;}&lt;br&gt;cvReleaseCapture( &amp;amp;capture );&lt;br&gt;cvDestroyWindow( &quot;Example2&quot; );&lt;/blockquote&gt;
}</content:encoded>
			<link>https://vsreality.3dn.ru/blog/2009-08-20-14</link>
			<dc:creator>Milk3D</dc:creator>
			<guid>https://vsreality.3dn.ru/blog/2009-08-20-14</guid>
			<pubDate>Wed, 19 Aug 2009 23:19:36 GMT</pubDate>
		</item>
		<item>
			<title>OpenCV - Работа с отдельными пикселями</title>
			<description>IplImage* img = cvLoadImage(&quot;image.jpg&quot;);&lt;br&gt;
 for( int y=0; y&lt;img-&gt;height; y++ ) {&lt;br&gt;&lt;/img-&gt;&lt;blockquote class=&quot;webkit-indent-blockquote&quot; style=&quot;margin: 0 0 0 40px; border: none; padding: 0px;&quot;&gt;uchar* ptr = (uchar*)(img-&amp;gt;imageData + y * img-&amp;gt;widthStep);&lt;br&gt;for( int x=0; x&lt;img-&gt;width; x++ ) {&lt;/img-&gt;&lt;br&gt;&lt;/blockquote&gt;&lt;blockquote class=&quot;webkit-indent-blockquote&quot; style=&quot;margin: 0 0 0 40px; border: none; padding: 0px;&quot;&gt;&lt;blockquote class=&quot;webkit-indent-blockquote&quot; style=&quot;margin: 0 0 0 40px; border: none; padding: 0px;&quot;&gt;if(ptr[3*x]+20&amp;gt;=ptr[3*x+1]||ptr[3*x+2]+20&amp;gt;=ptr[3*x+1]){&lt;br&gt;&lt;/blockquote&gt;&lt;/blockquote&gt;&lt;blockquote class=&quot;webkit-indent-blockquote&quot; style=&quot;margin: 0 0 0 40px; border: none; padding: 0px;&quot;&gt;&lt;blockquote class=&quot;webkit-indent-blockquote&quot; style=&quot;margin: 0 0 0 40px; border: none; padding: 0px;&quot;&gt;&lt;blockquote class=&quot;webkit-indent-blockquote&quot; style=&quot;margin: 0 0 0 40px; border: none; padding: 0px;&quot;&gt;ptr[3*x] = 0;&lt;br&gt;ptr[3*x+1] = 0;&lt;br&gt;ptr[3*x+2] = 0;&lt;/blockquote&gt;&lt;/blockquote&gt;&lt;/blockquote&gt;&lt;blockquote class=&quot;webkit-indent-blockquote&quot; style=&quot;margin: 0 0 0 40px; border: none; padding: 0px;&quot;&gt;&lt;blockquote class=&quot;webkit-indent-blockquote&quot; style=&quot;margin: 0 0 0 40px; border: none; padding: 0px;&quot;&gt;}&lt;/blockquote&gt;&lt;/blockquote&gt;&lt;blockquote class=&quot;webkit-indent-blockquote&quot; style=&quot;margin: 0 0 0 40px; border: none; padding: 0px;&quot;&gt;}&lt;/blockquote&gt;&lt;img-&gt;&lt;img-&gt;
 }&lt;/img-&gt;&lt;/img-&gt;</description>
			<content:encoded>IplImage* img = cvLoadImage(&quot;image.jpg&quot;);&lt;br&gt;
 for( int y=0; y&lt;img-&gt;height; y++ ) {&lt;br&gt;&lt;/img-&gt;&lt;blockquote class=&quot;webkit-indent-blockquote&quot; style=&quot;margin: 0 0 0 40px; border: none; padding: 0px;&quot;&gt;uchar* ptr = (uchar*)(img-&amp;gt;imageData + y * img-&amp;gt;widthStep);&lt;br&gt;for( int x=0; x&lt;img-&gt;width; x++ ) {&lt;/img-&gt;&lt;br&gt;&lt;/blockquote&gt;&lt;blockquote class=&quot;webkit-indent-blockquote&quot; style=&quot;margin: 0 0 0 40px; border: none; padding: 0px;&quot;&gt;&lt;blockquote class=&quot;webkit-indent-blockquote&quot; style=&quot;margin: 0 0 0 40px; border: none; padding: 0px;&quot;&gt;if(ptr[3*x]+20&amp;gt;=ptr[3*x+1]||ptr[3*x+2]+20&amp;gt;=ptr[3*x+1]){&lt;br&gt;&lt;/blockquote&gt;&lt;/blockquote&gt;&lt;blockquote class=&quot;webkit-indent-blockquote&quot; style=&quot;margin: 0 0 0 40px; border: none; padding: 0px;&quot;&gt;&lt;blockquote class=&quot;webkit-indent-blockquote&quot; style=&quot;margin: 0 0 0 40px; border: none; padding: 0px;&quot;&gt;&lt;blockquote class=&quot;webkit-indent-blockquote&quot; style=&quot;margin: 0 0 0 40px; border: none; padding: 0px;&quot;&gt;ptr[3*x] = 0;&lt;br&gt;ptr[3*x+1] = 0;&lt;br&gt;ptr[3*x+2] = 0;&lt;/blockquote&gt;&lt;/blockquote&gt;&lt;/blockquote&gt;&lt;blockquote class=&quot;webkit-indent-blockquote&quot; style=&quot;margin: 0 0 0 40px; border: none; padding: 0px;&quot;&gt;&lt;blockquote class=&quot;webkit-indent-blockquote&quot; style=&quot;margin: 0 0 0 40px; border: none; padding: 0px;&quot;&gt;}&lt;/blockquote&gt;&lt;/blockquote&gt;&lt;blockquote class=&quot;webkit-indent-blockquote&quot; style=&quot;margin: 0 0 0 40px; border: none; padding: 0px;&quot;&gt;}&lt;/blockquote&gt;&lt;img-&gt;&lt;img-&gt;
 }&lt;/img-&gt;&lt;/img-&gt;</content:encoded>
			<link>https://vsreality.3dn.ru/blog/2009-08-20-13</link>
			<dc:creator>Milk3D</dc:creator>
			<guid>https://vsreality.3dn.ru/blog/2009-08-20-13</guid>
			<pubDate>Wed, 19 Aug 2009 23:15:47 GMT</pubDate>
		</item>
		<item>
			<title>Алгоритм закрашивания</title>
			<description>&lt;p&gt;Алгоритм закрашивания очень часто используется в компьютерной графике для закрашивания фигур имеющих границы. Так же этот алгоритм может иметь и другое применение например его можно использовать для нахождения центра масс тела по его изображению. Приведу два алгоритма один рекурсивный, а второй линейный. Рекурсивный имеет один недостаток, его нельзя использовать для закрашивания больших фигур так как при большом количестве элементов происходит переполнение стека. Код использует OpenCV для работы с изображениями, но при желании их можно переписать под что угодно.&lt;/p&gt;
&lt;p&gt;1. Рекурсивный алгоритм&lt;/p&gt;&lt;p&gt;&lt;br&gt;
&lt;code&gt;
void zakrashivanie(uchar** ptr,int x, int y){&lt;br&gt;&lt;/code&gt;&lt;/p&gt;&lt;blockquote class=&quot;webkit-indent-blockquote&quot; style=&quot;margin: 0 0 0 40px; border: none; padding: 0px;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: -webkit-monospace; &quot;&gt;if(ptr[y][3*x]==255){&lt;/span&gt;&lt;br&gt;&lt;/blockquote&gt;&lt;blockquote class=&quot;webkit-indent-blockquote&quot; style=&quot;margin: 0 0 0 40px; border: none; padding: 0px;&quot;&gt;&lt;blockquote class=&quot;webkit-indent-blockquote&quot; style=&quot;margin: 0 0 0 40px; border: none; padding: 0px;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: -webkit-monospace; &quot;&gt;//Закраска (x, y) пикселя&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: -webkit-monospace; &quot;&gt;ptr[y][3*x] = 0;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: -webkit-monospace; &quot;&gt;ptr[y][3*x+1] = 255;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: -webkit-monospace; &quot;&gt;ptr[y][3*x+2] = 0;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: -webkit-monospace; &quot;&gt;zakrashivanie(ptr,x-1,y);&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: -webkit-monospace; &quot;&gt;zakrashivanie(ptr,x+1,y);&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: -webkit-monospace; &quot;&gt;zakrashivanie(ptr,x,y-1);&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: -webkit-monospace; &quot;&gt;zakrashivanie(ptr,x,y+1);&lt;/span&gt;&lt;/blockquote&gt;&lt;/blockquote&gt;&lt;blockquote class=&quot;webkit-indent-blockquote&quot; style=&quot;margin: 0 0 0 40px; border: none; padding: 0px;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: -webkit-monospace; &quot;&gt;}&lt;/span&gt;&lt;/blockquote&gt;&lt;code&gt;
&lt;/code&gt;&lt;p&gt;&lt;code&gt;
}
&lt;/code&gt;
&lt;/p&gt;
&lt;p&gt;2. Волновой алгоритм&lt;/p&gt;&lt;p&gt;&lt;br&gt;
void NearPix(uchar** ptr,int x, int y, int *numStack, CvPoint *Stack){&lt;br&gt;&lt;/p&gt;&lt;blockquote class=&quot;webkit-indent-blockquote&quot; style=&quot;margin: 0 0 0 40px; border: none; padding: 0px;&quot;&gt;if(ptr[y][3*x]==255){&lt;br&gt;&lt;/blockquote&gt;&lt;blockquote class=&quot;webkit-indent-blockquote&quot; style=&quot;margin: 0 0 0 40px; border: none; padding: 0px;&quot;&gt;&lt;blockquote class=&quot;webkit-indent-blockquote&quot; style=&quot;margin: 0 0 0 40px; border: none; padding: 0px;&quot;&gt;ptr[y][3*x] = 0;&lt;br&gt;ptr[y][3*x+1] = 255;&lt;br&gt;ptr[y][3*x+2] = 0;&lt;br&gt;Stack[*numStack].x=x;&lt;br&gt;Stack[*numStack].y=y;&lt;br&gt;(*numStack)++;&lt;/blockquote&gt;&lt;/blockquote&gt;&lt;blockquote class=&quot;webkit-indent-blockquote&quot; style=&quot;margin: 0 0 0 40px; border: none; padding: 0px;&quot;&gt;}&lt;/blockquote&gt;&lt;p&gt;
}&lt;/p&gt;
&lt;p&gt;void OneStep(uchar** ptr, int *numSrc, int *numDest, CvPoint *Src, CvPoint *Dest){&lt;br&gt;&lt;/p&gt;&lt;blockquote class=&quot;webkit-indent-blockquote&quot; style=&quot;margin: 0 0 0 40px; border: none; padding: 0px;&quot;&gt;int x,y,i;&lt;br&gt;*numDest=0;&lt;br&gt;for(i=0; i&lt;*numSrc;i++){&lt;br&gt;&lt;/blockquote&gt;&lt;blockquote class=&quot;webkit-indent-blockquote&quot; style=&quot;margin: 0 0 0 40px; border: none; padding: 0px;&quot;&gt;&lt;blockquote class=&quot;webkit-indent-blockquote&quot; style=&quot;margin: 0 0 0 40px; border: none; padding: 0px;&quot;&gt;x=Src[i].x;&lt;br&gt;y=Src[i].y;&lt;br&gt;NearPix(ptr,x+1,y,numDest,Dest);&lt;br&gt;NearPix(ptr,x-1,y,numDest,Dest);&lt;br&gt;NearPix(ptr,x,y+1,numDest,Dest);&lt;br&gt;NearPix(ptr,x,y-1,numDest,Dest);&lt;/blockquote&gt;&lt;/blockquote&gt;&lt;blockquote class=&quot;webkit-indent-blockquote&quot; style=&quot;margin: 0 0 0 40px; border: none; padding: 0px;&quot;&gt;}&lt;/blockquote&gt;&lt;p&gt;
}&lt;/p&gt;
&lt;p&gt;void WaveFill(uchar** ptr,int xst, int yst){&lt;br&gt;&lt;/p&gt;&lt;blockquote class=&quot;webkit-indent-blockquote&quot; style=&quot;margin: 0 0 0 40px; border: none; padding: 0px;&quot;&gt;int numA, numB;&lt;br&gt;CvPoint *stackA, *stackB;&lt;br&gt;stackA=new CvPoint[10000];&lt;br&gt;stackB=new CvPoint[10000];&lt;br&gt;numA=1;&lt;br&gt;stackA[0].x=xst;&lt;br&gt;stackA[0].y=yst;&lt;br&gt;numB=0;&lt;br&gt;while(1){&lt;br&gt;&lt;/blockquote&gt;&lt;blockquote class=&quot;webkit-indent-blockquote&quot; style=&quot;margin: 0 0 0 40px; border: none; padding: 0px;&quot;&gt;&lt;blockquote class=&quot;webkit-indent-blockquote&quot; style=&quot;margin: 0 0 0 40px; border: none; padding: 0px;&quot;&gt;if(numA&amp;gt;0)OneStep(ptr,&amp;amp;numA,&amp;amp;numB,stackA,stackB);&lt;br&gt;else break;&lt;br&gt;if(numB&amp;gt;0)OneStep(ptr,&amp;amp;numB,&amp;amp;numA,stackB,stackA);&lt;br&gt;else break;&lt;/blockquote&gt;&lt;/blockquote&gt;&lt;blockquote class=&quot;webkit-indent-blockquote&quot; style=&quot;margin: 0 0 0 40px; border: none; padding: 0px;&quot;&gt;}&lt;br&gt;delete [] stackB;&lt;br&gt;delete [] stackA;&lt;/blockquote&gt;
&lt;p&gt;
}&lt;/p&gt;</description>
			<content:encoded>&lt;p&gt;Алгоритм закрашивания очень часто используется в компьютерной графике для закрашивания фигур имеющих границы. Так же этот алгоритм может иметь и другое применение например его можно использовать для нахождения центра масс тела по его изображению. Приведу два алгоритма один рекурсивный, а второй линейный. Рекурсивный имеет один недостаток, его нельзя использовать для закрашивания больших фигур так как при большом количестве элементов происходит переполнение стека. Код использует OpenCV для работы с изображениями, но при желании их можно переписать под что угодно.&lt;/p&gt;
&lt;p&gt;1. Рекурсивный алгоритм&lt;/p&gt;&lt;p&gt;&lt;br&gt;
&lt;code&gt;
void zakrashivanie(uchar** ptr,int x, int y){&lt;br&gt;&lt;/code&gt;&lt;/p&gt;&lt;blockquote class=&quot;webkit-indent-blockquote&quot; style=&quot;margin: 0 0 0 40px; border: none; padding: 0px;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: -webkit-monospace; &quot;&gt;if(ptr[y][3*x]==255){&lt;/span&gt;&lt;br&gt;&lt;/blockquote&gt;&lt;blockquote class=&quot;webkit-indent-blockquote&quot; style=&quot;margin: 0 0 0 40px; border: none; padding: 0px;&quot;&gt;&lt;blockquote class=&quot;webkit-indent-blockquote&quot; style=&quot;margin: 0 0 0 40px; border: none; padding: 0px;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: -webkit-monospace; &quot;&gt;//Закраска (x, y) пикселя&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: -webkit-monospace; &quot;&gt;ptr[y][3*x] = 0;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: -webkit-monospace; &quot;&gt;ptr[y][3*x+1] = 255;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: -webkit-monospace; &quot;&gt;ptr[y][3*x+2] = 0;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: -webkit-monospace; &quot;&gt;zakrashivanie(ptr,x-1,y);&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: -webkit-monospace; &quot;&gt;zakrashivanie(ptr,x+1,y);&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: -webkit-monospace; &quot;&gt;zakrashivanie(ptr,x,y-1);&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: -webkit-monospace; &quot;&gt;zakrashivanie(ptr,x,y+1);&lt;/span&gt;&lt;/blockquote&gt;&lt;/blockquote&gt;&lt;blockquote class=&quot;webkit-indent-blockquote&quot; style=&quot;margin: 0 0 0 40px; border: none; padding: 0px;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: -webkit-monospace; &quot;&gt;}&lt;/span&gt;&lt;/blockquote&gt;&lt;code&gt;
&lt;/code&gt;&lt;p&gt;&lt;code&gt;
}
&lt;/code&gt;
&lt;/p&gt;
&lt;p&gt;2. Волновой алгоритм&lt;/p&gt;&lt;p&gt;&lt;br&gt;
void NearPix(uchar** ptr,int x, int y, int *numStack, CvPoint *Stack){&lt;br&gt;&lt;/p&gt;&lt;blockquote class=&quot;webkit-indent-blockquote&quot; style=&quot;margin: 0 0 0 40px; border: none; padding: 0px;&quot;&gt;if(ptr[y][3*x]==255){&lt;br&gt;&lt;/blockquote&gt;&lt;blockquote class=&quot;webkit-indent-blockquote&quot; style=&quot;margin: 0 0 0 40px; border: none; padding: 0px;&quot;&gt;&lt;blockquote class=&quot;webkit-indent-blockquote&quot; style=&quot;margin: 0 0 0 40px; border: none; padding: 0px;&quot;&gt;ptr[y][3*x] = 0;&lt;br&gt;ptr[y][3*x+1] = 255;&lt;br&gt;ptr[y][3*x+2] = 0;&lt;br&gt;Stack[*numStack].x=x;&lt;br&gt;Stack[*numStack].y=y;&lt;br&gt;(*numStack)++;&lt;/blockquote&gt;&lt;/blockquote&gt;&lt;blockquote class=&quot;webkit-indent-blockquote&quot; style=&quot;margin: 0 0 0 40px; border: none; padding: 0px;&quot;&gt;}&lt;/blockquote&gt;&lt;p&gt;
}&lt;/p&gt;
&lt;p&gt;void OneStep(uchar** ptr, int *numSrc, int *numDest, CvPoint *Src, CvPoint *Dest){&lt;br&gt;&lt;/p&gt;&lt;blockquote class=&quot;webkit-indent-blockquote&quot; style=&quot;margin: 0 0 0 40px; border: none; padding: 0px;&quot;&gt;int x,y,i;&lt;br&gt;*numDest=0;&lt;br&gt;for(i=0; i&lt;*numSrc;i++){&lt;br&gt;&lt;/blockquote&gt;&lt;blockquote class=&quot;webkit-indent-blockquote&quot; style=&quot;margin: 0 0 0 40px; border: none; padding: 0px;&quot;&gt;&lt;blockquote class=&quot;webkit-indent-blockquote&quot; style=&quot;margin: 0 0 0 40px; border: none; padding: 0px;&quot;&gt;x=Src[i].x;&lt;br&gt;y=Src[i].y;&lt;br&gt;NearPix(ptr,x+1,y,numDest,Dest);&lt;br&gt;NearPix(ptr,x-1,y,numDest,Dest);&lt;br&gt;NearPix(ptr,x,y+1,numDest,Dest);&lt;br&gt;NearPix(ptr,x,y-1,numDest,Dest);&lt;/blockquote&gt;&lt;/blockquote&gt;&lt;blockquote class=&quot;webkit-indent-blockquote&quot; style=&quot;margin: 0 0 0 40px; border: none; padding: 0px;&quot;&gt;}&lt;/blockquote&gt;&lt;p&gt;
}&lt;/p&gt;
&lt;p&gt;void WaveFill(uchar** ptr,int xst, int yst){&lt;br&gt;&lt;/p&gt;&lt;blockquote class=&quot;webkit-indent-blockquote&quot; style=&quot;margin: 0 0 0 40px; border: none; padding: 0px;&quot;&gt;int numA, numB;&lt;br&gt;CvPoint *stackA, *stackB;&lt;br&gt;stackA=new CvPoint[10000];&lt;br&gt;stackB=new CvPoint[10000];&lt;br&gt;numA=1;&lt;br&gt;stackA[0].x=xst;&lt;br&gt;stackA[0].y=yst;&lt;br&gt;numB=0;&lt;br&gt;while(1){&lt;br&gt;&lt;/blockquote&gt;&lt;blockquote class=&quot;webkit-indent-blockquote&quot; style=&quot;margin: 0 0 0 40px; border: none; padding: 0px;&quot;&gt;&lt;blockquote class=&quot;webkit-indent-blockquote&quot; style=&quot;margin: 0 0 0 40px; border: none; padding: 0px;&quot;&gt;if(numA&amp;gt;0)OneStep(ptr,&amp;amp;numA,&amp;amp;numB,stackA,stackB);&lt;br&gt;else break;&lt;br&gt;if(numB&amp;gt;0)OneStep(ptr,&amp;amp;numB,&amp;amp;numA,stackB,stackA);&lt;br&gt;else break;&lt;/blockquote&gt;&lt;/blockquote&gt;&lt;blockquote class=&quot;webkit-indent-blockquote&quot; style=&quot;margin: 0 0 0 40px; border: none; padding: 0px;&quot;&gt;}&lt;br&gt;delete [] stackB;&lt;br&gt;delete [] stackA;&lt;/blockquote&gt;
&lt;p&gt;
}&lt;/p&gt;</content:encoded>
			<link>https://vsreality.3dn.ru/blog/2009-08-20-12</link>
			<dc:creator>Milk3D</dc:creator>
			<guid>https://vsreality.3dn.ru/blog/2009-08-20-12</guid>
			<pubDate>Wed, 19 Aug 2009 22:26:21 GMT</pubDate>
		</item>
	</channel>
</rss>