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算法在图片上绘制圆。通过这些方法,您可以根据具体需求选择合适的方案,完成在图片上绘制圆的任务。
热门推荐
哈尔滨工程大学是国防七子吗?是!当然是!
单招职业技能测试考什么内容?
电机线圈材质的要求,了解电机线圈的材质选择
女子为治脱发滥用米诺地尔,结果变成“小毛人”
如何选择合适的内饰材料以提升车内舒适度?内饰材料的选择有哪些注意事项?
内存超频必看:DDR4内存电压全面解析
71% 消费决策深受社交媒体影响
中医蜡疗・体温决定生老病死
猫咪不吃东西是什么原因?七大常见原因及解决方法
AI应用的流量“炼金术”
李世民《咏兴国寺佛殿前幡》:屈伸烟雾里,低举白云中
上古卷轴mod排行:最受欢迎的10款mod推荐,提升你的游戏体验
电动汽车核心技术解析:ECU与VCU的功能与重要性
事业单位年假规定详解:政策与实践
如何办理银行贷款?银行贷款的流程和条件是什么?
探秘香港与美国收入差异:税制、生活成本与发展潜力对比
10种最常用的厨房菜板:从材质到使用场景的全面解析
动物界的伟大母爱:哪些动物妈妈最感人?!
如何在BIOS中开启CPU的虚拟机模式
龙珠:天津饭那些被边缘化的角色,正在慢慢被遗忘
被动型基金拿平均收益 主动型基金赢在赛道
痘痘最怕三种克星
【科普营养】减肥必须吃低GI食物?不要迷信GI。附:常见食物GI表
肥胖人群备孕攻略!四步法解决
音乐与生活的节奏:探索音乐如何影响我们的日常
总成本excel怎么算
动物行为实验指南丨啮齿动物亲社会选择测试方法
世界第二高峰是什么峰?了解世界最高的山峰
从诈骗罪到合同诈骗罪:解析两者的区别与适用
真的吗?有远视储备孩子就不会近视了?揭秘“视力小金库”真相→