2010-11-11 5 views
13

Как изменить пиксель на дисплее в C?Отображать пиксель на экране в C

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

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

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

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

+1

Хорошо, я полагаю, вы правы Кос. Я просто не хотел, чтобы люди предполагали, что я хочу пройти длинный путь, чтобы сделать графический интерфейс без инструментария, если на самом деле я предпочел бы узнать, как работают дисплеи. – DavidJFelix

+2

Если мы ничего не можем принять, я не могу предположить, что вопрос находится на английском языке, и даже, что отображаемые символы, описывающие вопрос, не имеют отношения к символам, которые напечатал OP. Хорошо, это глупо, но это одно из моих любимых моментов, что люди говорят «не принимайте ничего!». когда на самом деле они просто означают, что есть несколько базовых предположений, которые они хотят удалить. – LarsH

+0

Это один из моих домашних животных, когда люди делают предположения. :) – DavidJFelix

ответ

10

Если мы действительно ничего не принимаем, можем ли мы предположить, что X запущен? Если уж на то пошло, можем ли мы предположить, что есть видеокарта? Возможно, Linux работает без головок, и мы обращаемся к нему через последовательную консоль.

Если нам позволено предположить несколько вещей, давайте предположим, что Linux загрузился с поддержкой фреймбуфера. (Прошло пару лет с тех пор, как я работал с фейдбуферами Linux, я могу получить некоторые детали не так.) Будет создано устройство, возможно, /dev/fb или /dev/fb0. Откройте этот файл и начните писать значения RGB со смещением, и экран изменится, практически независимо от чего-либо: текстовая консоль, графическая консоль, полноценная среда рабочего стола и т. Д. Если вы хотите посмотреть, работает ли поддержка фреймбуфера, сделайте dd if=/dev/zero of=/dev/fb в командной строке, а дисплей должен быть черным.

+1

'/ dev/urandom' или' ~/naughty.pnm' намного веселее, чем '/ dev/zero' ... –

+0

Протестировано. Экран становится черным. – DavidJFelix

+0

Безопасно ли, кто-нибудь? – Abdillah

13

C не имеет графических возможностей - для этого вам потребуется использовать стороннюю библиотеку.

+0

C является языком и не имеет * реальных * возможностей самостоятельно. Может, вы хотели сказать libc? – cdhowie

+2

OP указан Linux. Это означает, что у вас гораздо больше, чем просто C. –

+4

В третьей стороне библиотеки будет использоваться некоторый язык программирования (возможно, сборка), поддержка AND/OR из операционной системы и драйверов устройств. Очевидно, что вопрос о том, как писать такую ​​стороннюю библиотеку, - вот что здесь задается. К сожалению, этот мусор получает больше оборотов, чем частично полезный ответ. –

6

Вы не можете принять отображение на C. Существует буквально никакой способ сделать то, что вы просите.

Редактировать: Хорошо, у вас есть дисплей, но опять же, оттуда вы не можете многое сделать. Дело в том, что существует TON конкурирующих стандартов для графических дисплеев, и хотя некоторые из них (например, интерфейсы VGA) стандартизированы, многие другие (интерфейсы драйверов дисплея, например) НЕ. Большая часть того, что у X (и других драйверов устройств отображения, таких как Windows и т. Д.), Имеет специальный код интерфейса для того, чтобы говорить с драйверами дисплея; они абстрагируют сложность работы с драйверами дисплея. У оконных систем есть HUGE-библиотеки сложного и специального кода для работы с драйверами дисплея; тот факт, что эти вещи являются относительно прозрачными, свидетельствует о том, сколько работы они вкладывают в эти вещи с течением времени.

+0

Вы можете предположить это. Я запускаю linux с консоли на ноутбуке. – DavidJFelix

+0

Следующее, что вы знаете, вы скажете мне, что оно функционально. :) –

+1

Ну, тогда пройди меня через минимальные требования к тому, как я буду выводить на экран. Вы можете предположить все, что вы точно объясните. – DavidJFelix

0

Я думаю, что вы ищете информацию о том, как писать в буфер кадров. Самый простой способ - использовать SDL и визуализировать в буфере кадров или использовать GTK + с DirectFB, хотя это противоречит вашему указу о том, что вы не используете инструментарий или фреймворки.

+0

Кроме того, предполагается, что есть фреймбуфер. Безгласная операция полностью нормальная. –

+3

McWafflestix: Хотя педантично верно, я думаю, что немного неискренне сказать, что вы не можете принять экран. В конце концов, без какого-либо проявления вопрос не имеет никакого смысла. – Cercerilla

+0

Да, это педантично. Но этот вопрос нужно сделать решительно, потому что именно ОП предлагает предположить «НИЧЕГО». – dmckee

5

Очень примитивно и сделать много предположений:

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. Существуют также вопросы, связанные с эндией, и т. Д.

Таким образом, в реальной реальности вы можете использовать какой-то библиотечный код, который обрабатывает подобные вещи для вас.

1

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

Упс я предполагал терминал. : P

+0

См. Также: ['aalib'] (http://aa-project.sourceforge.net/). – dmckee

-3

Ваш лучший друг будет 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 
Смежные вопросы