Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
11.06.2010, 20:06
|
|
Почётный гражданин KAZUS.RU
Регистрация: 20.09.2009
Сообщений: 1,899
Сказал спасибо: 470
Сказали Спасибо 408 раз(а) в 255 сообщении(ях)
|
Библиотека LS020+LPC2368
Хочу сделать библиотеку чтоб слегка поиграть с этим дисплеем, начал немного редактировать чужое Вопрос будет ли работать вот так? Конечно хочится сделать прорисовку линий, кругов, 3D функции. Но боюсь не осилить, помогите
|
|
|
|
11.06.2010, 21:13
|
|
Почётный гражданин KAZUS.RU
Регистрация: 20.09.2009
Сообщений: 1,899
Сказал спасибо: 470
Сказали Спасибо 408 раз(а) в 255 сообщении(ях)
|
Re: Библиотека LS020+LPC2368
На самом деле вопроса три: как нарисовать линию х1 у1 х2 у2, нарисовать круг х у радиус, и как сделать прозрачный цвет?
|
|
|
|
11.06.2010, 22:31
|
|
Вид на жительство
Регистрация: 14.10.2009
Сообщений: 338
Сказал спасибо: 35
Сказали Спасибо 92 раз(а) в 73 сообщении(ях)
|
Re: Библиотека LS020+LPC2368
линия рисуется по такому принципу
Вначале узнается расстояние от двух точек от точки с меньшей координатой к точке с большей
Потом узнается завышение или снижение от точки к точке на линии. Все данные берутся по целочисленному модулю.
Затем если ширина больше превышения (x2-x1) › (y2-y1), то расстояние по ширине делится на расстояние по высоте - получаем количество прямоугольников в одну линию расположенных вдоль которых необходимо нарисовать прямоугольные области в 1px чтобы равномерно прочертить маленькими горизонтальными линиями.
и наоборот если ширина МЕНЬШЕ высоты (x2-x1) ‹ (y2-y1) то высоту делим на ширину и получаем количество столбцов необходимое чтобы начертить линию вертикальными штрихами.
После этого вычисления нужно только узнать длину линий горизонтальных или высоту столбцов. Для этого в случае (x2-x1) › (y2-y1) ширину делим на количество линий или d варианте (x1-x2) ‹ (y2-y1) высоту на количество столбцов.
теперь мы имеем длину отрезков, их количество и соответственно смещение одного столбца от другого.
Нам надо начертить линию на экране - для этого используя функцию экрана "заполнение области цветом" мы рисуем нашу линию в несколько команд, смещая за каждый проход цикла x и y на длину (высоту) прочерченного прямоугольника.
__________________
Найди путь или проложи сам!
Последний раз редактировалось MasterMushi; 12.06.2010 в 00:09.
|
|
|
Сказали "Спасибо" MasterMushi
|
|
|
11.06.2010, 22:59
|
|
Почётный гражданин KAZUS.RU
Регистрация: 20.09.2009
Сообщений: 1,899
Сказал спасибо: 470
Сказали Спасибо 408 раз(а) в 255 сообщении(ях)
|
Re: Библиотека LS020+LPC2368
Спасибо! С кругом как быть?
|
|
|
|
12.06.2010, 00:05
|
|
Вид на жительство
Регистрация: 14.10.2009
Сообщений: 338
Сказал спасибо: 35
Сказали Спасибо 92 раз(а) в 73 сообщении(ях)
|
Re: Библиотека LS020+LPC2368
С кругом сложнее. Просто линиями не нарисовать, придется по точке отрисовывать
http://algolist.manual.ru/graphics/painting/circle.php
теория и функция метода такого рисования на С
PHP код:
|
void circle (int x, int y, int radius) { int dx, dy, sum;
dx = sum = radius; for (dy=0; dx; dy++) { sum -= dy; // Вычисляем следующий dx while (sum ‹ 0) sum += dx--;
setpixel (x+dx, y+dy); setpixel (x+dx, y-dy); setpixel (x-dx, y+dy); setpixel (x-dx, y-dy); } }
|
теперь отсебятина ....
Хотя если чертить не окружность а круг, то можно рисовать и вертикальными столбцами или построчно. Мы знаем ширину и высоту круга и знаем что начнем чертить от 1 пиксела. Поэтому используя функцию квадратного умножения от радиуса и умножая это дело на 2 мы будем иметь длинну линии на нужном расстоянии от центра окружности. НО!!! Нужно иметь в виду что у нас именно правый или левый край окружности это 0 координат прироста радиуса.
Тоесть надо начертить круг радиусом 10 пикселов
PHP код:
|
int x=70, y=60, radius=10, x1, x2, y1, y2, color;
x1=x+radius; x2=x-radius;
while (radius--) //в цикле получаем линии //Но не просто так а чертим от центра к краям постепенно уменьшая //значение высоты столбцов {
y1=y+radius^2; y2=y-radius^2;
fill_rect(x2+radius, x2+radius, y1, y2, color); fill_rect(x1-radius, x1-radius, y1, y2, color);
}
|
както так ))))) может где ошибся, промоделируйте
__________________
Найди путь или проложи сам!
Последний раз редактировалось MasterMushi; 12.06.2010 в 02:00.
Причина: Отлов багов
|
|
|
Сказали "Спасибо" MasterMushi
|
|
|
12.06.2010, 04:32
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
|
Re: Библиотека LS020+LPC2368
|
|
|
|
12.06.2010, 09:02
|
|
Почётный гражданин KAZUS.RU
Регистрация: 20.09.2009
Сообщений: 1,899
Сказал спасибо: 470
Сказали Спасибо 408 раз(а) в 255 сообщении(ях)
|
Re: Библиотека LS020+LPC2368
MasterMushi, Очень жаль что нельзя поставить за одно сообщение 10 или 20 плюсов, я бы поставил 100! Спасибо огромное, буду пробовать запихать эти функции в библиотеку... И уж раз такая пьянка пошла может вы знаете как сделать регулируемый, полупрозрачный цвет? Допустим у меня есть массив рисунков в памяти. Рисунок фона во весь экран и маленькие пиктограммы (ярлыки).. Как сделать так чтоб ярлык стал полупрозрачным и эта прозрачнось была регулируемая? Это наверно практически не исполнимо?
|
|
|
|
12.06.2010, 11:22
|
|
Почётный гражданин KAZUS.RU
Регистрация: 20.09.2009
Сообщений: 1,899
Сказал спасибо: 470
Сказали Спасибо 408 раз(а) в 255 сообщении(ях)
|
Re: Библиотека LS020+LPC2368
Тут видимо надо брать каждую точку ярлыка и сравнивать с точкой фона имеющей такую же кардинату. И смешивать цвета, градацию цвета. Для этого надо иметь не хилую палитру, да и смешивать голову сломаешь...
|
|
|
|
12.06.2010, 12:02
|
|
Почётный гражданин KAZUS.RU
Регистрация: 20.09.2009
Сообщений: 1,899
Сказал спасибо: 470
Сказали Спасибо 408 раз(а) в 255 сообщении(ях)
|
Re: Библиотека LS020+LPC2368
Вот поглядеть правильно?
PHP код:
|
void LCD_Line(int x1, int y1, int x2, int y2); //Рисуем линию
//==============================
void LCD_Line(int x1, int y1, int x2, int y2)//========//Рисуем линию
{
int dx = (x2 - x1 ›= 0 ? 1 : -1);
int dy = (y2 - y1 ›= 0 ? 1 : -1);
int lengthX,lengthY,length;
//===============================================
if (x2›=x1) {lengthX=x2-x1;} else {lengthX=x1-x2;}
if (y2›=y1) {lengthY=y2-y1;} else {lengthY=y1-y2;}
if (lengthX › lengthY){length=lengthX;} else {length=lengthY;}
//===============================================
if (length == 0)
{
LCD_PutPixel(x1, y1, RGB_BLUE);
}
if (lengthY ‹= lengthX)
{
//------------------ Начальные значения-------------------//
int x = x1;
int y = y1;
int d = -lengthX;
//------------------ Основной цикл -----------------------//
length++;
while(length--)
{
LCD_PutPixel(x, y, RGB_BLUE);
x += dx;
d += 2 * lengthY;
if (d › 0) {
d -= 2 * lengthX;
y += dy;
}
}
}
else
{
//------------------ Начальные значения-------------------//
int x = x1;
int y = y1;
int d = - lengthY;
//------------------ Основной цикл------------------------//
length++;
while(length--)
{
LCD_PutPixel(x, y, RGB_BLUE);
y += dy;
d += 2 * lengthX;
if (d › 0) {
d -= 2 * lengthY;
x += dx;
}
}
}
}
//==============================================
|
Так рисуем линию
PHP код:
|
void LCD_Circle(unsigned char cx, unsigned char cy ,unsigned char radius,unsigned color); //Рисуем круг
//================================================
void LCD_Circle(unsigned char cx, unsigned char cy ,unsigned char radius,unsigned color)//===//Рисуем круг
{
int x, y, xchange, ychange, radiusError;
x = radius;
y = 0;
xchange = 1 - 2 * radius;
ychange = 1;
radiusError = 0;
while(x ›= y)
{
LCD_PutPixel(cx+x, cy+y, color);
LCD_PutPixel(cx-x, cy+y, color);
LCD_PutPixel(cx-x, cy-y, color);
LCD_PutPixel(cx+x, cy-y, color);
LCD_PutPixel(cx+y, cy+x, color);
LCD_PutPixel(cx-y, cy+x, color);
LCD_PutPixel(cx-y, cy-x, color);
LCD_PutPixel(cx+y, cy-x, color);
y++;
radiusError += ychange;
ychange += 2;
if ( 2*radiusError + xchange › 0 )
{
x--;
radiusError += xchange;
xchange += 2;
}
}
}
//=====================================
|
А вот так круг.
|
|
|
Сказали "Спасибо" Uragan90
|
|
|
12.06.2010, 22:18
|
|
Вид на жительство
Регистрация: 14.10.2009
Сообщений: 338
Сказал спасибо: 35
Сказали Спасибо 92 раз(а) в 73 сообщении(ях)
|
Re: Библиотека LS020+LPC2368
Посмотри в даташте на экран как работает функция вывода массива из разного цвета сразу в область экрана. Этой функцией можно очень сильно упростить вывод и ускорить работу программы. Например горизонтальные и вертикальные линии можно прямо отрабатывать этой функцией без вычислений вообще. и на наклонные линии количество проходов на цикл уменьшится.
Философия тут вот в чем - при выводе лучше тратить процессорное время непосредственно на вывод данных а не на вычисления того, как вывести.
НО, твой код все же ОК, а оптимизировать можно до помешательства. Поэтому если в железе все заработает на ура, то можно и на этом варианте остановится.
Прозрачный цвет - увы без видеоподсистемы в виде видеопамяти и вывода по прерыванию таймера не обойтись. Экран у нас как односторонний взрослый - мы на нем можем рисовать, а вот принимать от него данные увы нет. Поэтому надо отстроить видео подсистему, отдав порт и вывод выборки микросхеме в которую будет писаться текущее состояние экрана.
Изменив состояние видеопамяти мы функцией заполнения прямоугольника СРАЗУ выводим всю видеопамять на экран. И О чудо, не смотря на внешнюю сложность, нам можно не мучится со многими вещами по экрану. Например для вывода вообще не нужно будет ничего кроме заполнения области. А все библиотечные функции пишем исключительно для работы с оперативой.
Плюс метода - просто и очень быстро
Минус - аппаратные средства лишние. Еще минус - выводить весь экран занимает время, но это решается выводом в цикле блоками (токенами) 8х8 по таймеру. Тоесть не мешая ни какой подпрограмме быстро пихаем куски на экран с частотой полного перезаполнения 3-4 кадра в секунду.
Хотя я могу и ошибаться насчет однонаправленности, надо смотреть даташит
__________________
Найди путь или проложи сам!
|
|
|
Сказали "Спасибо" MasterMushi
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
Плата LPC2368
|
Uragan90 |
Микроконтроллеры, АЦП, память и т.д |
170 |
13.04.2010 13:03 |
библиотека HC12 для Proteus
|
Fenolftalein |
Proteus, KiCAD и другие ECAD |
0 |
12.01.2010 10:47 |
Часовой пояс GMT +4, время: 10:14.
|
|