|
Lcd12864, Какие есть идеи...или пишем видеодрайвер... |
|
|
|
Nov 22 2006, 01:21
|

Участник

Группа: Свой
Сообщений: 72
Регистрация: 27-06-06
Из: Msk
Пользователь №: 18 401

|
Порылся нашел алгоритмы для расования линий и окружностей что такое glcd_put_pixel(x, y, color); думаю понятно  (color != 0 - черная точка) Код /************************************************************************* Рисование 8-связной развертки отрезка методом Брэзенхема
Начало в точке (x1,y1), конец в (x2,y2) *************************************************************************/ void glcd_line(int x1, int y1, int x2, int y2,unsigned char color) { int x; int y; int dx; int dy; int sx; int sy; int z; int e; int i; bit ch;
x = x1; y = y1; dx = abs(x2-x1); dy = abs(y2-y1); sx = sign((double)(x2-x1)); sy = sign((double)(y2-y1)); if( dx==0&&dy==0 ) { glcd_put_pixel(x1, y1, color); return; } if( dy>dx ) { z = dx; dx = dy; dy = z; ch = true; } else { ch = false; } e = 2*dy-dx; i = 1; do { glcd_put_pixel(x, y, color); while(e>=0) { if( ch ) { x += sx; } else { y += sy; } e -= 2*dx; } if( ch ) { y += sy; } else { x += sx; } e += 2*dy; ++i; } while(i<=dx); glcd_put_pixel(x, y, color); }
/************************************************************************* Рисование развертки круга методом Брэзенхема
Центр в точке (xc, yc), радиус r. *************************************************************************/ void glcd_circle(int xc, int yc, int r,char color) { int x; int y; int d;
x = 0; y = r; d = 3-2*r; while(y>=x) { glcd_put_pixel((x+xc), (y+yc), color); glcd_put_pixel((x+xc), (-y+yc), color); glcd_put_pixel((-x+xc), (y+yc), color); glcd_put_pixel((-x+xc), (-y+yc), color); glcd_put_pixel((y+xc), (x+yc), color); glcd_put_pixel((y+xc), (-x+yc), color); glcd_put_pixel((-y+xc), (x+yc), color); glcd_put_pixel((-y+xc), (-x+yc), color); if( d<0 )d += 4*x+6; else{ d += 4*(x-y)+10; --y; } ++x; } }
|
|
|
|
|
Nov 22 2006, 01:30
|

Гуру
     
Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659

|
Цитата(vooon @ Nov 22 2006, 05:21)  Порылся нашел алгоритмы для расования линий и окружностей... Код /************************************************************************* Рисование развертки круга методом Брэзенхема
Центр в точке (xc, yc), радиус r. *************************************************************************/ void glcd_circle(int xc, int yc, int r,char color) { int x; int y; int d;
x = 0; y = r; d = 3-2*r; while(y>=x) { glcd_put_pixel((x+xc), (y+yc), color); glcd_put_pixel((x+xc), (-y+yc), color); glcd_put_pixel((-x+xc), (y+yc), color); glcd_put_pixel((-x+xc), (-y+yc), color); glcd_put_pixel((y+xc), (x+yc), color); glcd_put_pixel((y+xc), (-x+yc), color); glcd_put_pixel((-y+xc), (x+yc), color); glcd_put_pixel((-y+xc), (-x+yc), color); if( d<0 )d += 4*x+6; else{ d += 4*(x-y)+10; --y; } ++x; } } Вот хоть один человек в тему ответил ...Да уж, функция glcd_put_pixel не из быстрых...
--------------------
|
|
|
|
|
Nov 22 2006, 08:26
|

Знающий
   
Группа: Свой
Сообщений: 866
Регистрация: 31-03-05
Из: Краснодар
Пользователь №: 3 814

|
Вот выкладываю библиотеку GLCD для контроллера ks0108. Такой вроде стоит в MT12864. Там есть куча функций рисования и отображения шрифтов. Может пригодится!
--------------------
<<Первая производная от чужой идеи - уже твоя идея.>>
|
|
|
|
|
Nov 22 2006, 08:52
|

Местный
  
Группа: Свой
Сообщений: 322
Регистрация: 13-12-05
Пользователь №: 12 147

|
тоже метод...я использую... void LCD_DrawLine(unsigned char x1,unsigned char y1,unsigned char x2,unsigned char y2, unsigned char set) { int x,y,count,xs,ys,xm,ym;
x = (int)x1; y = (int)y1; xs = (int)x2 - (int)x1; ys = (int)y2 - (int)y1; if(xs < 0) xm = -1; else if(xs > 0) xm = 1; else xm = 0; if(ys < 0) ym = -1; else if(ys > 0) ym = 1; else ym = 0; if(xs < 0) xs = -xs; if(ys < 0) ys = -ys;
LCD_SetDot ((unsigned char)x,(unsigned char)y, 1);
if(xs > ys) // Ëèíèÿ < 45 ãðàäóñîâ { count = -(xs/2); while(x != x2) { count = count + ys; x = x + xm; if(count > 0) { y = y + ym; count = count - xs; } LCD_SetDot ((unsigned char)x,(unsigned char)y, set); } } else // Ëèíèÿ >= 45 ãðàäóñîâ { count = -(ys/2); while(y != y2) { count = count + xs; y = y + ym; if(count > 0) { x = x + xm; count = count - ys; } LCD_SetDot ((unsigned char)x,(unsigned char)y, set); } } }
Сообщение отредактировал zorromen - Nov 22 2006, 08:54
|
|
|
|
|
Nov 24 2006, 21:05
|
Знающий
   
Группа: Свой
Сообщений: 543
Регистрация: 22-10-05
Пользователь №: 9 984

|
Молодец ,prottos, давно так не смеялся .  :D А лучше проверять флаг занятости,сколько можно выжать по скорости ,столько и будет, хотя 10милисекунд это уже 100 обновлений в сек,кристаллы не будут успевать разворачиватся, я приходилось почти постоянно "тормозить" загрузку картинки на ЛСД
Сообщение отредактировал bodja74 - Nov 24 2006, 21:17
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|