7

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

现在,在给定半径的情况下获取点的 (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
    }

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

4

3 回答 3

6
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 * factor (femtometer or km to pixel)
  • 将世界中心转换为显示中心:显示-X + 调整

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

于 2013-02-25T17:06:45.990 回答
4

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

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

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

于 2013-02-25T19:09:20.667 回答
2

我有一个利用 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;
}

别客气!

于 2020-01-18T23:03:50.617 回答