13.11.2015, 11:40
|
|
Временная регистрация
Регистрация: 06.05.2007
Сообщений: 75
Сказал спасибо: 18
Сказали Спасибо 9 раз(а) в 9 сообщении(ях)
|
Нужна рабочая функция рисования закрашенного треугольника ...
или многоугольника (полилинии) на си с использованием алгоритма Брезенхема. Целочисленная арифметика.
Нашел на Паскале (забыл я его):
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);
} |
|
|
|
|
13.11.2015, 20:47
|
|
Гражданин KAZUS.RU
Регистрация: 16.02.2012
Сообщений: 441
Сказал спасибо: 89
Сказали Спасибо 735 раз(а) в 149 сообщении(ях)
|
Re: Нужна рабочая функция рисования закрашенного треугольника ...
|
|
|
|
13.11.2015, 21:27
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.05.2005
Адрес: Саратов.ru
Сообщений: 1,548
Сказал спасибо: 384
Сказали Спасибо 737 раз(а) в 417 сообщении(ях)
|
Re: Нужна рабочая функция рисования закрашенного треугольника ...
Где-то находил алгоритм закрашивания произвольного треугольника горизонтальными линиями, шустрый. Но это в понедельник, не раньше...
|
|
|
|
13.11.2015, 21:30
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: Нужна рабочая функция рисования закрашенного треугольника ...
Потому, что единственный быстрый способ заливки - это окно. Линия - это окно, шириной в один пиксел. Вот и вся философия.
|
|
|
|
13.11.2015, 22:11
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.05.2005
Адрес: Саратов.ru
Сообщений: 1,548
Сказал спасибо: 384
Сказали Спасибо 737 раз(а) в 417 сообщении(ях)
|
Re: Нужна рабочая функция рисования закрашенного треугольника ...
Сообщение от Easyrider83
|
Линия - это окно, шириной в один пиксел. Вот и вся философия.
|
Так и просится к концовке хокку...
Easyrider83 познал Дзен, но раскрывать его непосвящённым не намерен.
|
|
|
|
13.11.2015, 23:32
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.05.2005
Адрес: Саратов.ru
Сообщений: 1,548
Сказал спасибо: 384
Сказали Спасибо 737 раз(а) в 417 сообщении(ях)
|
Re: Нужна рабочая функция рисования закрашенного треугольника ...
Сообщение от AJScorp
|
в понедельник, не раньше...
|
Нашёл таки на домашнем компе проэктик по этому алгоритму, думаю разберётесь...
Что-то я добрый сегодня
|
|
|
|
13.11.2015, 23:50
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Нужна рабочая функция рисования закрашенного треугольника ...
Сообщение от AJScorp
|
Easyrider83 познал Дзен
|
Изирайдер познал РТОС...
|
|
|
|
14.11.2015, 00:04
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.05.2005
Адрес: Саратов.ru
Сообщений: 1,548
Сказал спасибо: 384
Сказали Спасибо 737 раз(а) в 417 сообщении(ях)
|
Re: Нужна рабочая функция рисования закрашенного треугольника ...
Сообщение от omercury
|
Изирайдер познал РТОС
|
РТОС - нет... Что познал "Окно", очевидно.
Это малый дзен...
|
|
|
|
14.11.2015, 01:11
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: Нужна рабочая функция рисования закрашенного треугольника ...
Таки оставьте вы меня в покое
|
|
|
|
14.11.2015, 01:23
|
|
Заблокирован
Регистрация: 22.04.2014
Сообщений: 0
Сказал спасибо: 15
Сказали Спасибо 366 раз(а) в 284 сообщении(ях)
|
Re: Нужна рабочая функция рисования закрашенного треугольника ...
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 19:19.
|
|