C语言如何在图片上画一个圆
创作时间:
作者:
@小白创作中心
C语言如何在图片上画一个圆
引用
1
来源
1.
https://docs.pingcode.com/baike/1185715
本文将详细介绍如何通过使用图形库和实现Bresenham算法在图片上绘制一个圆。
一、使用图形库
1.1 使用SDL库
SDL(Simple DirectMedia Layer)是一种跨平台的多媒体库,适用于游戏和多媒体应用。使用SDL库可以方便地在图片上绘制图形,包括圆。
安装和初始化SDL库
首先,需要安装SDL库。在Linux系统上,可以使用以下命令:
sudo apt-get install libsdl2-dev
在Windows系统上,可以从SDL官方网站下载并安装。
#include <SDL2/SDL.h>
#include <stdio.h>
#include <math.h>
void draw_circle(SDL_Renderer *renderer, int x_center, int y_center, int radius) {
const int32_t diameter = (radius * 2);
int32_t x = (radius - 1);
int32_t y = 0;
int32_t tx = 1;
int32_t ty = 1;
int32_t error = (tx - diameter);
while (x >= y) {
// Each of the following renders an octant of the circle
SDL_RenderDrawPoint(renderer, x_center + x, y_center - y);
SDL_RenderDrawPoint(renderer, x_center + x, y_center + y);
SDL_RenderDrawPoint(renderer, x_center - x, y_center - y);
SDL_RenderDrawPoint(renderer, x_center - x, y_center + y);
SDL_RenderDrawPoint(renderer, x_center + y, y_center - x);
SDL_RenderDrawPoint(renderer, x_center + y, y_center + x);
SDL_RenderDrawPoint(renderer, x_center - y, y_center - x);
SDL_RenderDrawPoint(renderer, x_center - y, y_center + x);
if (error <= 0) {
++y;
error += ty;
ty += 2;
}
if (error > 0) {
--x;
tx += 2;
error += (tx - diameter);
}
}
}
int main(int argc, char* argv[]) {
SDL_Init(SDL_INIT_VIDEO);
SDL_Window *window = SDL_CreateWindow("SDL2 Circle",
SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 480, 0);
SDL_Renderer *renderer = SDL_CreateRenderer(window, -1, 0);
SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
SDL_RenderClear(renderer);
SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255);
draw_circle(renderer, 320, 240, 100);
SDL_RenderPresent(renderer);
SDL_Delay(5000);
SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(window);
SDL_Quit();
return 0;
}
解释代码
SDL_Init(SDL_INIT_VIDEO):初始化SDL视频子系统。SDL_CreateWindow:创建一个窗口。SDL_CreateRenderer:创建一个渲染器。SDL_SetRenderDrawColor:设置绘图颜色。draw_circle:函数使用Bresenham算法在给定的渲染器上绘制一个圆。SDL_RenderPresent:显示渲染结果。SDL_Delay:暂停程序,显示结果。
1.2 使用OpenCV库
OpenCV是一个广泛使用的计算机视觉库,也可以用于图像处理和绘图。在C语言中,可以使用OpenCV来绘制圆。
安装和初始化OpenCV库
在Linux系统上,可以使用以下命令:
sudo apt-get install libopencv-dev
在Windows系统上,可以从OpenCV官方网站下载并安装。
#include <opencv2/opencv.hpp>
#include <stdio.h>
int main() {
cv::Mat img = cv::Mat::zeros(480, 640, CV_8UC3);
cv::Point center(320, 240);
int radius = 100;
cv::Scalar color(0, 0, 255);
cv::circle(img, center, radius, color, 2);
cv::imshow("Circle", img);
cv::waitKey(0);
return 0;
}
解释代码
cv::Mat:创建一个空白图像。cv::Point:定义圆心位置。cv::circle:在图像上绘制圆。cv::imshow:显示图像。cv::waitKey:暂停程序,显示结果。
二、使用Bresenham算法
Bresenham算法是一种高效的圆形绘制算法,适用于没有图形库支持的情况。该算法利用整数运算,避免浮点计算,适合嵌入式系统。
2.1 基本原理
Bresenham算法基于对称性,只计算一个八分之一圆的像素点,然后利用对称性绘制其余部分。
2.2 实现代码
#include <stdio.h>
#include <stdlib.h>
void set_pixel(unsigned char* img, int width, int height, int x, int y, unsigned char color) {
if (x >= 0 && x < width && y >= 0 && y < height) {
img[y * width + x] = color;
}
}
void draw_circle(unsigned char* img, int width, int height, int x_center, int y_center, int radius, unsigned char color) {
int x = 0;
int y = radius;
int d = 3 - 2 * radius;
while (y >= x) {
set_pixel(img, width, height, x_center + x, y_center + y, color);
set_pixel(img, width, height, x_center - x, y_center + y, color);
set_pixel(img, width, height, x_center + x, y_center - y, color);
set_pixel(img, width, height, x_center - x, y_center - y, color);
set_pixel(img, width, height, x_center + y, y_center + x, color);
set_pixel(img, width, height, x_center - y, y_center + x, color);
set_pixel(img, width, height, x_center + y, y_center - x, color);
set_pixel(img, width, height, x_center - y, y_center - x, color);
x++;
if (d > 0) {
y--;
d = d + 4 * (x - y) + 10;
} else {
d = d + 4 * x + 6;
}
}
}
int main() {
int width = 640;
int height = 480;
unsigned char* img = (unsigned char*)malloc(width * height);
memset(img, 255, width * height);
draw_circle(img, width, height, 320, 240, 100, 0);
FILE* fp = fopen("circle.pbm", "wb");
fprintf(fp, "P5n%d %dn255n", width, height);
fwrite(img, 1, width * height, fp);
fclose(fp);
free(img);
return 0;
}
解释代码
set_pixel:函数设置像素点的颜色。draw_circle:函数使用Bresenham算法绘制圆。main:函数创建图像,调用draw_circle绘制圆,并保存为PBM格式。
三、其他绘制圆的方法
除了上述方法,还可以使用其他图形库或自定义算法进行绘制。
3.1 使用GDI库(Windows)
GDI(Graphics Device Interface)是Windows系统的图形设备接口,可以用于绘制图形。
#include <windows.h>
void draw_circle(HDC hdc, int x_center, int y_center, int radius) {
Ellipse(hdc, x_center - radius, y_center - radius, x_center + radius, y_center + radius);
}
int main() {
HWND hwnd = GetConsoleWindow();
HDC hdc = GetDC(hwnd);
draw_circle(hdc, 320, 240, 100);
ReleaseDC(hwnd, hdc);
return 0;
}
解释代码
GetConsoleWindow:获取控制台窗口句柄。GetDC:获取设备上下文(DC)。Ellipse:绘制椭圆。ReleaseDC:释放设备上下文。
3.2 使用自定义算法
可以根据需要自定义算法来绘制圆,例如使用参数方程。
#include <stdio.h>
#include <math.h>
void set_pixel(unsigned char* img, int width, int height, int x, int y, unsigned char color) {
if (x >= 0 && x < width && y >= 0 && y < height) {
img[y * width + x] = color;
}
}
void draw_circle(unsigned char* img, int width, int height, int x_center, int y_center, int radius, unsigned char color) {
for (int angle = 0; angle < 360; angle++) {
int x = x_center + radius * cos(angle * M_PI / 180);
int y = y_center + radius * sin(angle * M_PI / 180);
set_pixel(img, width, height, x, y, color);
}
}
int main() {
int width = 640;
int height = 480;
unsigned char* img = (unsigned char*)malloc(width * height);
memset(img, 255, width * height);
draw_circle(img, width, height, 320, 240, 100, 0);
FILE* fp = fopen("circle.pbm", "wb");
fprintf(fp, "P5n%d %dn255n", width, height);
fwrite(img, 1, width * height, fp);
fclose(fp);
free(img);
return 0;
}
解释代码
set_pixel:函数设置像素点的颜色。draw_circle:函数使用参数方程绘制圆。main:函数创建图像,调用draw_circle绘制圆,并保存为PBM格式。
四、总结
在C语言中绘制圆的方法多种多样,常用的方法包括:使用图形库、设置像素点、实现Bresenham算法。本文详细介绍了如何使用SDL库、OpenCV库和Bresenham算法在图片上绘制圆。通过这些方法,您可以根据具体需求选择合适的方案,完成在图片上绘制圆的任务。
热门推荐
丹参:自然与健康的桥梁
如何正确折叠各类雨衣?折叠雨衣时需注意哪些细节?
与乙肝患者接触存在多重风险,这些防护要点请收好
手指骨关节炎用什么药
《哪吒2》全球票房:文化输出的胜利,还是数据泡沫下的虚假繁荣?
无人机CAAC执照实操考试全解析:从基础飞行到设备维护
重庆巴南306㎡混搭风别墅:地上地下四层风格各异,设计师巧妙运用采光
新手必读:小鸡仔饲养完全指南
专门识别超买超卖!“MACD之父”最喜爱的短期摆荡指标,究竟有何魅力?
光电技术专业学什么:揭秘未来科技的核心课程
小鸡养殖:喝水的重要性及正确方法
GEF报告编译③︱以多元、灵活策略提升社区韧性
易经智慧与情绪管理
数据复盘:主力资金净买入151股超亿元 龙虎榜机构抢筹20股
超越瑞典,挪威发现欧洲最大稀土矿床
看病"挂一次号管三天" 实际施行情况如何?
奥迪 A6L 前挡风玻璃损坏后修复和更换哪个更划算
博物馆清代翡翠手镯价值评估与馆藏欣赏
2025春节开长途回老家,哪些事儿要额外注意?
想象一下,人类飞行的神秘机械,为何无法超越蜻蜓的轻盈翅膀?
最简单有效的补气法:站桩养生详解
怎样看懂生辰八字算命
血糖不高,也有可能是胰岛素抵抗
胶囊衣橱怎么搭?学会用这10件衣服,穿出8套耐看又有品位搭配
黄忠攻略分享:技能介绍、连招及实用技巧
十天干:戊土
女人身体体寒如何调理饮食
超详细的花洒安装尺寸标准,装修前必看
红细胞和血红蛋白的关系
注册资本金能不能用?公户转账限额及错误处理指南