Подтвердить что ты не робот

Отображать пиксель на экране в C

Как изменить пиксель на дисплее в C?

Предположим НИЧЕГО: Я использую Linux-консоль из консоли, чтобы сделать это. Я не хочу использовать инструментальные средства GUI или фреймворки для рисования пикселя. Я не хочу рисовать пиксель в окне. Я хочу нарисовать пиксель непосредственно на экране.

EDIT: У меня есть экран. Я работаю на ноутбуке с Linux. Я бы предпочел решение, не использующее X, поскольку я бы лучше научился тому, как работает X, чем использовать X.

Если у вас больше информации, спросите, но не предполагайте. Я не пытаюсь создать графический интерфейс, и это было основной целью блокировки предположений, поскольку я не хочу, чтобы люди предполагали, что я делаю то, что происходит долго, когда на самом деле я просто возился.

EDIT 2: вы можете использовать любые связанные с X11 библиотеки, если вы можете объяснить, как они работают.

4b9b3361

Ответ 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