【问题标题】:C how to draw a point / set a pixel without using graphics library or any other library functionsC如何在不使用图形库或任何其他库函数的情况下绘制点/设置像素
【发布时间】:2013-02-25 16:49:51
【问题描述】:

我试图了解如何在不使用库函数的情况下绘制一组点(/设置像素)形成一个圆。

现在,在给定半径的情况下获取点的 (x,y) 坐标很简单。

    for (x=-r; x <r; x=x+0.1) {
         y = sqrt(r*r - x*x);
         draw(x,y, 0, 0);
     }

但是一旦我有了要点,你如何实际绘制圆圈让我感到困惑。我可以使用图形库,但我想了解如何在不使用图形库的情况下做到这一点

    void draw(float x, float y, float center_x, float center_y) {
          //logic to set pixel given x, y and circle's center_x and center_y
          // basically print x and y on the screen say print as a dot .
          // u 'd need some sort of a 2d char array but how do you translate x and y
          // to pixel positions
    }

有人可以分享任何链接/参考或解释这是如何工作的吗?

【问题讨论】:

  • 请定义“画”!如果您的意思是:“在显示器上打印”,这很大程度上取决于您使用的系统。

标签: c


【解决方案1】:
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)] = '.';
  }
}

艾迪丝: 您更改了评论,以包含更多您的问题,所以我将扩大我的答案。

你有两组坐标:

  • 世界坐标(如世界地图上的经度和纬度比例或电磁显微镜上的飞米)这些主要是您的 x 和 y
  • 显示坐标:这些是显示设备(如 Nexus 7 或 Nexus 10 平板电脑)的表示形式及其物理尺寸(像素或像素或每英寸点数)

您需要一个度量,将您的世界坐标转换为显示坐标。为了让事情变得更复杂,你需要一个窗口(你想向用户展示的世界的一部分)来剪辑你不能展示的东西(比如非洲,当你想展示欧洲时)。您可能希望缩放您的世界坐标以匹配您的显示坐标(您想要显示多少欧洲)

这些度量和剪裁是简单的代数变换

  • 将世界坐标缩放到显示坐标:display-x = world-x * 因子(飞米或公里到像素)
  • 将世界中心转换为显示中心:显示-X + 调整

等等。只是“代数变换”或“几何”的维基百科

【讨论】:

  • 不错... - 但为什么 26 不是 25 甚至更好的是 24?
  • visiblenormalize 函数向我发出警告。在哪里可以找到它们?
【解决方案2】:

这是一个棘手的问题,因为从技术上讲,C 没有任何内置的输入/输出功能。即使写入文件也需要一个库。在某些系统上,如实模式 DOS,您可以直接访问视频内存并通过将值写入该内存来设置像素,但现代操作系统确实阻碍了这样做。您可以尝试编写引导加载程序,以在没有操作系统的情况下以更宽松的 CPU 模式启动程序,但这是一大堆蠕虫。

因此,使用最简单的 stdio 库,您可以使用 ascii 图形写入 stdout,如另一个答案所示,或者您可以输出简单的图形格式,如 xbm,可以使用单独的图像查看器查看程序。更好的选择可能是 格式。

画圆部分,请看经典的Bresenham algorithm。或者,对于太多信息,Jim Blinn 的A Trip Down the Graphics Pipeline 的第 1 章描述了15种不同的画圆算法!

【讨论】:

    【解决方案3】:

    我有一个利用 unicode 盲文的文件。

    #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;
    }
    

    不客气!

    【讨论】:

      猜你喜欢
      • 2016-06-27
      • 1970-01-01
      • 2017-01-01
      • 1970-01-01
      • 2012-11-18
      • 1970-01-01
      • 2013-04-14
      • 2011-02-08
      • 1970-01-01
      相关资源
      最近更新 更多