7
votes

C Comment dessiner un pixel / définir un pixel sans utiliser de bibliothèque graphique ni d'autres fonctions de la bibliothèque

J'essaie de comprendre comment je peux dessiner un ensemble de points (/ définir les pixels) qui forment un cercle sans utiliser les fonctions de la bibliothèque.

Maintenant, obtenez les coordonnées (x, y) des points étant donné que le rayon est simple. xxx

mais une fois que j'ai les points, comment vous avez réellement Dessinez le cercle est ce qui me déroule. Je peux utiliser la bibliothèque graphique, mais je veux comprendre comment vous pouvez le faire sans utiliser la bibliothèque graphique xxx

si quelqu'un pourrait partager des liens / références ou d'expliquer comment cela fonctionne? < / p>

c

1 commentaires

S'il vous plaît définir "Draw"! Si vous voulez dire: "Imprimer sur l'écran", cela dépend beaucoup de quel système utilisez-vous.


3 Réponses :


6
votes
char display[80][26];

void clearDisplay(void) {
   memset(display, ' ', sizeof(display));
}

void printDisplay(void) {
  for (short row=0; row<26; row++) {
    for (short col=0; col<80; col++) {
      printf("%c", display[col][row]);
    }
    printf("\n");
  }
}


void draw(float x, float y, float center_x, float center_y) {
  if (visible(x,y)) {
    display[normalize(x)][normalize(y)] = '.';
  }
}
EDITH:
  you changed your comment, to incorporate more of your question, so I will expand my answer a bit.you have two sets of coordinates:
world coordinates (like scaled longitude and latitude on a world map or femtometers on a electromagnet microscope) these are mostly your x and y
display coordinates: these are the representation of your displaying device, like a Nexus 7 or a Nexus 10 Tablet, with its physical dimensions (pixels or pels or dots per inch)
you need a metric, that transforms your world coordinates into display coordinates. To make things more complicated, you need a window (the part of the world you want to show the user) to clip the things you do cannot show (like africa, when you want to show europe). And you may want to zoom your world coordinates to match your display coordinates (how much of europe you want to display)These metrics and clippings are simple algebraic transformations 
zoom the world-coordinate to display-coordinate: display-x = world-x * factor (femtometer or kilometer to pixel)
translate the world-center to display-center: display-X + adjustment
and so on. Just wikipedia for "alegebraic transformation" or "geometrics"

2 commentaires

Nice ... - mais pourquoi 26 pas 25 ou même mieux 24?


M'a donné des avertissements sur visible et normaliser les fonctions . Où les trouver?



4
votes

C'est une question difficile, car techniquement C n'a pas de capacité d'entrée / sortie intégrée. Même écrire dans un fichier nécessite une bibliothèque. Sur certains systèmes, comme DOS Real-Mode, vous pouvez accéder directement à la mémoire vidéo et définir des pixels en écrivant des valeurs dans cette mémoire, mais les OSES modernes gênent vraiment cela. Vous pouvez essayer d'écrire un chargeur de démarrage pour lancer le programme dans un mode CPU plus permissive sans OS, mais c'est une énorme boîte de vers.

Ainsi, à l'aide de la mimimum nue, la bibliothèque STDIO, vous pouvez écrire sur STDOUT à l'aide de l'ASCII Graphics comme l'autre réponse de la réponse, ou vous pouvez émettre un format graphique simple comme XBM qui peut être visualisé avec un programme de visualisation d'images distinct. Un meilleur choix peut être le formats NetPBM .

Pour la partie de dessin du cercle, jetez un coup d'œil au classique Bresenham Algorithm . Ou, pour trop d'informations, le chapitre 1 de Jim Blinn's < EM> Un voyage sur le pipeline graphique décrit 15 différents algorithmes de dessin de cercle!


0 commentaires

2
votes

J'ai un fichier qui profite de Unicode braille.

#include <stdio.h>
#include <wchar.h>
#include <locale.h>

#define PIXEL_TRUE 1
#define PIXEL_FALSE 0

// Core Function.
void drawBraille(int type) {
  if(type > 255) {
    return;
  }
  setlocale(LC_CTYPE, "");
  wchar_t c = 0x2800 + type;
  wprintf(L"%lc", c);
}

/*
  Pixel Array.
  0x01, 0x08,
  0x02, 0x10,
  0x04, 0x20,
  0x40, 0x80,
*/

int pixelArr[8] = {
  0x01, 0x08,
  0x02, 0x10,
  0x04, 0x20,
  0x40, 0x80
};

typedef int cell[8];

void drawCell(cell cell) {
  int total;
  for(int i = 0; i < 8; i++) {
    if(cell[i] == 1) {
      total += pixelArr[i];
    }
  }
  drawBraille(total);
}

// Main.
int main(void) {
  cell a = {
    0, 1,
    0, 0, 
    1, 1,
    0, 1
  };
  drawCell(a);
return 0;
}


0 commentaires