C如何在不使用图形库或任何其他库函数的情况下绘制点/设置像素

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

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

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

 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:你改变了你的评论,加入了更多你的问题,所以我会稍微扩展我的答案。

你有两组坐标:

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

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

这些指标和剪报是简单的代数转换

  • 将世界坐标缩放到显示坐标:display-x = world-x * factor(飞秒计或公里到像素)
  • 将世界中心转换为显示中心:display-X + adjust

等等。 只是维基百科“alegebraic transformation”或“geometrics”

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

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

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