在C语言中,并没有一个内置的名为 circle 的函数,这个函数通常是由程序员自己定义的,用于在图形界面(如控制台、图形库等)中绘制一个圆形。

由于C语言本身不提供图形绘制功能,circle 函数的实现完全依赖于你使用的图形库或环境,下面我将为你展示几种在不同环境下实现 circle 函数的常见方法。
在控制台中绘制字符圆形(不使用图形库)
这是最简单的方式,不依赖任何外部库,仅使用 printf 在终端上输出由字符组成的圆形,原理是利用圆的方程 (x - h)² + (y - k)² = r² 来判断每个点是否在圆内。
原理:
对于一个以 (h, k) 为圆心,半径为 r 的圆,如果一个点 (x, y) 满足 (x - h)² + (y - k)² <= r²,那么这个点就在圆内或圆上,我们遍历一个能容纳圆的矩形区域,判断每个点是否在圆内,如果在,就打印一个字符(如 ),否则打印空格。
代码示例:

#include <stdio.h>
#include <math.h> // 为了使用 pow 函数
// 在控制台中绘制一个由字符组成的圆
// (h, k): 圆心坐标
// r: 半径
// ch: 用于绘制圆的字符
void circle(int h, int k, int r, char ch) {
// 计算包围圆的正方形边界
int x_min = h - r;
int x_max = h + r;
int y_min = k - r;
int y_max = k + r;
// 遍历这个正方形区域
for (int y = y_min; y <= y_max; y++) {
for (int x = x_min; x <= x_max; x++) {
// 计算当前点到圆心的距离的平方
double distance_squared = pow(x - h, 2) + pow(y - k, 2);
// 如果距离的平方小于或等于半径的平方,则点在圆内或圆上
if (distance_squared <= pow(r, 2)) {
printf("%c", ch);
} else {
printf(" ");
}
}
printf("\n"); // 每行结束后换行
}
}
int main() {
printf("Drawing a circle:\n");
circle(10, 5, 4, '*'); // 在(10,5)位置,半径为4,用'*'画圆
return 0;
}
编译和运行:
你需要链接数学库,因为使用了 pow 函数。
gcc your_file_name.c -o circle -lm ./circle
输出:
Drawing a circle:
****
******
********
**********
**********
********
******
****
使用图形库(最常见的方式)
在实际的图形应用开发中,我们使用专门的图形库。circle 函数是这些库的标准API。
a) Turbo C / DOS 环境 (旧式)
在非常古老的 Turbo C 编译器中,有一个 graphics.h 库,它提供了一个直接的 circle 函数。

代码示例:
#include <graphics.h>
#include <conio.h> // 为了使用 getch()
int main() {
// 初始化图形模式
int gd = DETECT, gm;
initgraph(&gd, &gm, "C:\\TC\\BGI"); // 注意路径要正确
// 设置绘图颜色
setcolor(WHITE);
// 画一个圆
// (x, y) 是圆心, radius 是半径
circle(200, 200, 100);
// 等待用户按键
getch();
// 关闭图形模式,返回文本模式
closegraph();
return 0;
}
注意: graphics.h 是一个过时的、非标准的库,主要用于教学和复古编程,在现代Windows/Linux系统上无法直接使用。
b) Win32 API (Windows 平台)
在原生Windows开发中,使用GDI (Graphics Device Interface)来绘制图形,你需要先获取一个设备上下文句柄,然后调用 Ellipse 函数来画圆(圆是椭圆的特殊情况)。
代码示例:
#include <windows.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
const char* CLASS_NAME = "Circle Window Class";
WNDCLASS wc = { };
wc.lpfnWndProc = WndProc;
wc.hInstance = hInstance;
wc.lpszClassName = CLASS_NAME;
RegisterClass(&wc);
HWND hwnd = CreateWindowEx(
0, CLASS_NAME, "Circle Drawing Example",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, 400, 400,
NULL, NULL, hInstance, NULL
);
if (hwnd == NULL) {
return 0;
}
ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);
MSG msg = { };
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
switch (uMsg) {
case WM_PAINT: {
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
// 获取窗口客户区的中心点
RECT rect;
GetClientRect(hwnd, &rect);
int centerX = rect.right / 2;
int centerY = rect.bottom / 2;
int radius = 100;
// 画一个圆
// (left, top, right, bottom) 定义了一个外接矩形
Ellipse(hdc, centerX - radius, centerY - radius, centerX + radius, centerY + radius);
EndPaint(hwnd, &ps);
}
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
c) SDL (跨平台游戏开发)
SDL (Simple DirectMedia Layer) 是一个非常流行的用于游戏开发和多媒体应用的跨平台库。
代码示例:
首先需要安装SDL库。
#include <SDL2/SDL.h>
#include <stdio.h>
int main(int argc, char* argv[]) {
// 初始化SDL
if (SDL_Init(SDL_INIT_VIDEO) < 0) {
printf("SDL could not initialize! SDL_Error: %s\n", SDL_GetError());
return 1;
}
// 创建窗口
SDL_Window* window = SDL_CreateWindow("SDL Tutorial",
SDL_WINDOWPOS_UNDEFINED,
SDL_WINDOWPOS_UNDEFINED,
800, 600,
SDL_WINDOW_SHOWN);
if (window == NULL) {
printf("Window could not be created! SDL_Error: %s\n", SDL_GetError());
return 1;
}
// 创建渲染器
SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
if (renderer == NULL) {
printf("Renderer could not be created! SDL_Error: %s\n", SDL_GetError());
return 1;
}
// 主循环
int quit = 0;
SDL_Event e;
while (!quit) {
// 处理事件
while (SDL_PollEvent(&e) != 0) {
if (e.type == SDL_QUIT) {
quit = 1;
}
}
// 清空渲染器为黑色
SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
SDL_RenderClear(renderer);
// 设置绘制颜色为白色
SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
// 画一个圆
// SDL没有直接的circle函数,通常用多边形近似
int centerX = 400;
int centerY = 300;
int radius = 150;
for (int w = 0; w < radius * 2; w++) {
for (int h = 0; h < radius * 2; h++) {
int dx = radius - w;
int dy = radius - h;
if ((dx * dx + dy * dy) <= (radius * radius)) {
SDL_RenderDrawPoint(renderer, centerX + dx, centerY + dy);
}
}
}
// 更新屏幕
SDL_RenderPresent(renderer);
}
// 清理资源
SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(window);
SDL_Quit();
return 0;
}
d) OpenGL (跨平台高级图形)
OpenGL 是一个用于渲染2D/3D图形的行业标准API,它本身没有高级图形函数,需要我们自己用基本图元(如线段 GL_LINES)来构建圆形。
代码示例:
#include <GLFW/glfw3.h> // 需要先安装GLFW库
void drawCircle(float centerX, float centerY, float radius) {
int segments = 100; // 圆的精度(线段数)
glBegin(GL_LINE_LOOP);
for (int i = 0; i < segments; i++) {
float theta = 2.0f * 3.1415926f * float(i) / float(segments);
float x = radius * cosf(theta) + centerX;
float y = radius * sinf(theta) + centerY;
glVertex2f(x, y);
}
glEnd();
}
int main() {
if (!glfwInit()) {
return -1;
}
GLFWwindow* window = glfwCreateWindow(800, 600, "OpenGL Circle", NULL, NULL);
if (!window) {
glfwTerminate();
return -1;
}
glfwMakeContextCurrent(window);
while (!glfwWindowShouldClose(window)) {
glClear(GL_COLOR_BUFFER_BIT);
// 设置绘制颜色
glColor3f(1.0f, 1.0f, 1.0f); // 白色
// 画圆
drawCircle(0.0f, 0.0f, 0.5f);
glfwSwapBuffers(window);
glfwPollEvents();
}
glfwTerminate();
return 0;
}
| 环境/库 | circle 函数实现方式 |
特点 |
|---|---|---|
| 控制台 | 自定义,使用数学公式和 printf |
简单,无需库,仅用于字符显示 |
| Turbo C | graphics.h 提供的 circle() |
过时,仅用于复古或DOS环境 |
| Win32 API | 使用 Ellipse() 函数 |
Windows原生,用于桌面应用开发 |
| SDL | 自定义,通常用 SDL_RenderDrawPoint 循环 |
跨平台,轻量级,适合游戏 |
| OpenGL | 自定义,用 GL_LINE_LOOP 绘制多边形 |
跨平台,行业标准,适合高级图形 |
当你在C语言中需要使用 circle 函数时,首先要明确你的目标平台和应用场景,然后选择合适的库或方法来实现它。
