Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту


 
Опции темы
Непрочитано 13.11.2015, 11:40  
MikhailSh
Временная регистрация
 
Регистрация: 06.05.2007
Сообщений: 75
Сказал спасибо: 18
Сказали Спасибо 9 раз(а) в 9 сообщении(ях)
MikhailSh на пути к лучшему
По умолчанию Нужна рабочая функция рисования закрашенного треугольника ...

или многоугольника (полилинии) на си с использованием алгоритма Брезенхема. Целочисленная арифметика.
Нашел на Паскале (забыл я его):
http://www.delphimaster.net/view/8-1126933826
Вот этот, что-то неправильно работает:
Код:
void GUI_DrawPolyLineFill(T_GUI_POLY_LINE *ptrPolyLine, uint16_t Color)
{
	//Public-domain code by Darel Rex Finley, 2007

#define POLY_X(Z)		((int32_t)((ptrPolyLine-›ptrNodeTablePolyLine + Z)-›Pos_X))	 //((int32_t)((Points + Z)-›Y))	
#define POLY_Y(Z)		((int32_t)((ptrPolyLine-›ptrNodeTablePolyLine + Z)-›Pos_Y)) //((int32_t)((Points + Z)-›X))	
	
	//uint16_t TextColor, BackColor;
	uint16_t nodes = 0, nodeX[GUI_POLYLINE_MAX_CORNERS];
	uint16_t pixelX = 0, pixelY = 0, i = 0,	j = 0, swap = 0;
	uint16_t IMAGE_LEFT = 0, IMAGE_RIGHT = 0, IMAGE_TOP = 0, IMAGE_BOTTOM = 0;

	IMAGE_LEFT = IMAGE_RIGHT = ptrPolyLine-›ptrNodeTablePolyLine-›Pos_X; //prtPoints-›Pos_X;
	IMAGE_TOP= IMAGE_BOTTOM = ptrPolyLine-›ptrNodeTablePolyLine-›Pos_Y; //prtPoints-›Pos_Y;

	//LCD_GetColors(&TextColor, &BackColor);
	for (i = 1; i ‹ ptrPolyLine-›NodeNum; i++) //NumPoint
	{
		pixelX = POLY_X(i); 
		if (pixelX ‹ IMAGE_LEFT)
		{
			IMAGE_LEFT = pixelX;
		}
		if (pixelX › IMAGE_RIGHT)
		{
			IMAGE_RIGHT = pixelX;
		}

		pixelY = POLY_Y(i); 
		if (pixelY ‹ IMAGE_TOP)
		{
			IMAGE_TOP = pixelY;
		}
		if(pixelY › IMAGE_BOTTOM)
		{
			IMAGE_BOTTOM = pixelY;
		}
	}

	//LCD_SetTextColor(BackColor);

	//Loop through the rows of the image
	for (pixelY = IMAGE_TOP; pixelY ‹ IMAGE_BOTTOM; pixelY++)
	{
		//Build a list of nodes
		nodes = 0; j = ptrPolyLine-›NodeNum - 1;

		for (i = 0; i ‹ ptrPolyLine-›NodeNum; i++)
		{
			if (((POLY_Y(i)‹(double) pixelY) && (POLY_Y(j)›=(double) pixelY)) || \
					((POLY_Y(j)‹(double) pixelY) && (POLY_Y(i)›=(double) pixelY)))
			{
				nodeX[nodes++] = (int) (POLY_X(i) + ((pixelY-POLY_Y(i)) * (POLY_X(j)-POLY_X(i)))/(POLY_Y(j)-POLY_Y(i)));
			}
			j = i;
		}

		//Sort the nodes, via a simple "Bubble" sort
		i = 0;
		while (i ‹ nodes - 1)
		{
			if (nodeX[i] › nodeX[i + 1])
			{
				swap = nodeX[i];
				nodeX[i] = nodeX[i + 1];
				nodeX[i + 1] = swap;
				if (i)
				{
					i--;
				}
			}
			else
			{
				i++;
			}
		}

		//Fill the pixels between node pairs
		for (i = 0; i ‹ nodes; i += 2)
		{
			if (nodeX[i] ›= IMAGE_RIGHT)
			{
				break;
			}
			if (nodeX[i + 1] › IMAGE_LEFT)
			{
				if (nodeX[i] ‹ IMAGE_LEFT)
				{
					nodeX[i] = IMAGE_LEFT;
				}
				if (nodeX[i + 1] › IMAGE_RIGHT)
				{
					nodeX[i + 1] = IMAGE_RIGHT;
				}
				//LCD_SetTextColor(BackColor);
				//LCD_DrawLine(pixelY, nodeX[i + 1], nodeX[i + 1] - nodeX[i], LCD_DIR_HORIZONTAL);
				GUI_DrawLineDirection(pixelY, nodeX[i + 1], nodeX[i + 1] - nodeX[i], Color, GUI_LINE_DIRECTION_HORIZONTAL);

				//LCD_SetTextColor(TextColor);
				//LCD_PutPixel(pixelY, nodeX[i + 1]);
				//LCD_PutPixel(pixelY, nodeX[i]);
				GUI_PutPoint(pixelY, nodeX[i + 1], Color);
				GUI_PutPoint(pixelY, nodeX[i], Color);
				
				//for (j=nodeX[i]; j‹nodeX[i+1]; j++) PutPixel(j,pixelY);
			}
		}
	}

	//Draw the edges
	//LCD_SetTextColor(TextColor);
}
Реклама:
MikhailSh вне форума  
Непрочитано 13.11.2015, 20:47  
zöner
Гражданин KAZUS.RU
 
Регистрация: 16.02.2012
Сообщений: 441
Сказал спасибо: 89
Сказали Спасибо 735 раз(а) в 149 сообщении(ях)
zöner на пути к лучшему
По умолчанию Re: Нужна рабочая функция рисования закрашенного треугольника ...

можно проверять принадлежность каждой точки треугольнику, если лежит внутри - закрашивать
http://algolist.manual.ru/maths/geom/belong/poly2d.php
http://totologic.blogspot.fr/2014/01...ngle-test.html
zöner вне форума  
Непрочитано 13.11.2015, 21:27  
AJScorp
Почётный гражданин KAZUS.RU
 
Аватар для AJScorp
 
Регистрация: 10.05.2005
Адрес: Саратов.ru
Сообщений: 1,548
Сказал спасибо: 384
Сказали Спасибо 737 раз(а) в 417 сообщении(ях)
AJScorp на пути к лучшему
По умолчанию Re: Нужна рабочая функция рисования закрашенного треугольника ...

Где-то находил алгоритм закрашивания произвольного треугольника горизонтальными линиями, шустрый. Но это в понедельник, не раньше...
AJScorp вне форума  
Непрочитано 13.11.2015, 21:30  
Easyrider83
Гуру портала
 
Аватар для Easyrider83
 
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 918
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
Easyrider83 на пути к лучшему
По умолчанию Re: Нужна рабочая функция рисования закрашенного треугольника ...

Потому, что единственный быстрый способ заливки - это окно. Линия - это окно, шириной в один пиксел. Вот и вся философия.
Easyrider83 вне форума  
Непрочитано 13.11.2015, 22:11  
AJScorp
Почётный гражданин KAZUS.RU
 
Аватар для AJScorp
 
Регистрация: 10.05.2005
Адрес: Саратов.ru
Сообщений: 1,548
Сказал спасибо: 384
Сказали Спасибо 737 раз(а) в 417 сообщении(ях)
AJScorp на пути к лучшему
По умолчанию Re: Нужна рабочая функция рисования закрашенного треугольника ...

Сообщение от Easyrider83 Посмотреть сообщение
Линия - это окно, шириной в один пиксел. Вот и вся философия.
Так и просится к концовке хокку...

Easyrider83 познал Дзен, но раскрывать его непосвящённым не намерен.
AJScorp вне форума  
Непрочитано 13.11.2015, 23:32  
AJScorp
Почётный гражданин KAZUS.RU
 
Аватар для AJScorp
 
Регистрация: 10.05.2005
Адрес: Саратов.ru
Сообщений: 1,548
Сказал спасибо: 384
Сказали Спасибо 737 раз(а) в 417 сообщении(ях)
AJScorp на пути к лучшему
По умолчанию Re: Нужна рабочая функция рисования закрашенного треугольника ...

Сообщение от AJScorp Посмотреть сообщение
в понедельник, не раньше...
Нашёл таки на домашнем компе проэктик по этому алгоритму, думаю разберётесь...
Что-то я добрый сегодня
Вложения:
Тип файла: rar 3DTest.rar (189.4 Кб, 24 просмотров)
AJScorp вне форума  
Непрочитано 13.11.2015, 23:50  
omercury
Почётный гражданин KAZUS.RU
 
Аватар для omercury
 
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
omercury на пути к лучшему
По умолчанию Re: Нужна рабочая функция рисования закрашенного треугольника ...

Сообщение от AJScorp Посмотреть сообщение
Easyrider83 познал Дзен
Изирайдер познал РТОС...
omercury вне форума  
Непрочитано 14.11.2015, 00:04  
AJScorp
Почётный гражданин KAZUS.RU
 
Аватар для AJScorp
 
Регистрация: 10.05.2005
Адрес: Саратов.ru
Сообщений: 1,548
Сказал спасибо: 384
Сказали Спасибо 737 раз(а) в 417 сообщении(ях)
AJScorp на пути к лучшему
По умолчанию Re: Нужна рабочая функция рисования закрашенного треугольника ...

Сообщение от omercury Посмотреть сообщение
Изирайдер познал РТОС
РТОС - нет... Что познал "Окно", очевидно.
Это малый дзен...
AJScorp вне форума  
Непрочитано 14.11.2015, 01:11  
Easyrider83
Гуру портала
 
Аватар для Easyrider83
 
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 918
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
Easyrider83 на пути к лучшему
По умолчанию Re: Нужна рабочая функция рисования закрашенного треугольника ...

Таки оставьте вы меня в покое
Easyrider83 вне форума  
Непрочитано 14.11.2015, 01:23  
STM32F0
Заблокирован
 
Регистрация: 22.04.2014
Сообщений: 0
Сказал спасибо: 15
Сказали Спасибо 366 раз(а) в 284 сообщении(ях)
STM32F0 на пути к лучшему
По умолчанию Re: Нужна рабочая функция рисования закрашенного треугольника ...

Сообщение от AJScorp Посмотреть сообщение
Easyrider83 познал Дзен
Сообщение от omercury Посмотреть сообщение
Изирайдер познал РТОС
Сообщение от AJScorp Посмотреть сообщение
познал "Окно", очевидно.
Сообщение от Easyrider83 Посмотреть сообщение
оставьте вы меня в покое
Он познал "Дядь, дай закурить!" в пятницу 13-го.
STM32F0 вне форума  
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужна простая рабочая схема для Х10 coolbassnik Автоматика и аппаратура связи 0 17.01.2010 17:36


Часовой пояс GMT +4, время: 13:29.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot