Отображать пиксель на экране в C
Как изменить пиксель на дисплее в C?
Предположим НИЧЕГО: Я использую Linux-консоль из консоли, чтобы сделать это. Я не хочу использовать инструментальные средства GUI или фреймворки для рисования пикселя. Я не хочу рисовать пиксель в окне. Я хочу нарисовать пиксель непосредственно на экране.
EDIT: У меня есть экран. Я работаю на ноутбуке с Linux. Я бы предпочел решение, не использующее X, поскольку я бы лучше научился тому, как работает X, чем использовать X.
Если у вас больше информации, спросите, но не предполагайте. Я не пытаюсь создать графический интерфейс, и это было основной целью блокировки предположений, поскольку я не хочу, чтобы люди предполагали, что я делаю то, что происходит долго, когда на самом деле я просто возился.
EDIT 2: вы можете использовать любые связанные с X11 библиотеки, если вы можете объяснить, как они работают.
Ответы
Ответ 1
Если мы действительно ничего не принимаем, можем ли мы предположить, что X запущен? Если уж на то пошло, можем ли мы предположить, что есть видеокарта? Возможно, Linux работает без головок, и мы получаем доступ к нему через последовательную консоль.
Если нам позволено предположить несколько вещей, допустим, что Linux загрузился с поддержкой фреймбуфера. (Прошло пару лет с тех пор, как я работал с фейдбуферами Linux, я могу получить некоторые детали не так.) Будет создано устройство, возможно, /dev/fb
или /dev/fb0
. Откройте этот файл и начните писать значения RGB со смещением, и экран изменится, практически независимо от чего-либо: текстовая консоль, графическая консоль, полноценная среда рабочего стола и т.д. Если вы хотите посмотреть, работает ли поддержка фреймбуфера, сделайте dd if=/dev/zero of=/dev/fb
в командной строке, а дисплей должен быть черным.
Ответ 2
C не имеет графических возможностей - для этого вам потребуется использовать стороннюю библиотеку.
Ответ 3
Вы не можете принять отображение в C. Существует буквально никакой способ делать то, что вы просите.
Edit: Хорошо, у вас есть дисплей, но опять же, оттуда вы не можете многое сделать. Дело в том, что существует TON конкурирующих стандартов для графических дисплеев, и хотя некоторые из них (например, интерфейсы VGA) стандартизированы, многие другие (интерфейсы драйверов дисплея, например) НЕ. Большая часть того, что у X (и других драйверов устройств отображения, таких как Windows и т.д.), Имеет специальный код интерфейса для того, чтобы говорить с драйверами дисплея; они абстрагируют сложность работы с драйверами дисплея. У оконных систем есть HUGE-библиотеки сложного и специального кода для работы с драйверами дисплея; тот факт, что эти вещи относительно прозрачны, свидетельствует о том, сколько работы они вкладывают в эти вещи с течением времени.
Ответ 4
Очень примитивен и делает много предположений:
fd = open("/dev/fb0", O_RDWR);
lseek(fd, 640*y+x, SEEK_SET);
write(fd, "\377\377\377\377", 4);
В действительности вы использовали бы mmap
, а не write
, и используйте соответствующий ioctl
для запроса режима экрана, а не для предположения о 640xHHH 32bpp. Существуют также проблемы, связанные с endian и т.д.
Итак, в реальной реальности вы можете использовать какой-то библиотечный код, который обрабатывает вас для этого.
Ответ 5
Я полагаю, вы могли бы рисовать терминальную программу, которую вы используете в качестве консоли. Все, что вам нужно сделать, это выяснить, какой из них и посмотреть.
Упс я предполагал терминал.: P
Ответ 6
Я думаю, что вы ищете информацию о том, как писать в буфер кадров. Самый простой способ - использовать SDL и визуализировать в буфере кадров или использовать GTK + с DirectFB, хотя это противоречит вашему указу о том, что вы не используете инструментальные средства или фреймворки.
Ответ 7
Ваш лучший друг будет printf
. В основном печатная сетка с некоторым символом (например, "." ) Означает все пиксели. И печатная сетка с символом пробела (например, '') означает, что все пиксели выключены.
Например, мы можем использовать функцию sine()
в равном выходном потоке:
#include <stdio.h>
#define MAXY 20
#define MAXX 75
static char display[MAXY][MAXX];
void setGraph(void) {
memset(display, ' ', sizeof(display));
int i;
// draw Y axis
for (i=0; i < MAXY; i++)
display[i][3] = '|';
// draw X axis
for (i=0; i < MAXX; i++)
display[1][i] = '-';
// draw origin
display[0][0] = '0';
display[0][1] = ',';
display[0][2] = '0';
// draw arrows
display[1][MAXX-1] = '>';
display[MAXY-1][3] = 'v';
// draw labels
display[0][MAXX-3] = 'X';
display[MAXY-3][2] = 'Y';
}
void plotSine() {
int i;
int y;
for (i=4; i < MAXX; i++) {
y = 2 + (int)7.0*(1.0 + sin(0.45*(float)i));
display[y][i] = '.';
}
}
void drawDisplay(void) {
int x,y;
for (x=0; x < MAXY; x++) {
for (y=0; y < MAXX; y++) {
printf("%c", display[x][y]);
}
printf("\n");
}
}
int main () {
setGraph();
plotSine();
drawDisplay();
return 0;
}
Что будет генерировать такой вывод:
0,0| X
-------------------------------------------------------------------------->
| ** ** ** ** **
| * * * * * * * * * *
|
| * * * * *
| * * * * *
|
| * * * * *
| * * * * *
|
| * * * * *
| * * * * *
|
| * * * * * * * * * *
|* ** ** ** ** **
|
Y|
|
v