利用C语言的Cairo图形库绘制太极图实例教程_C 语言

前言

可能许多人对直接用C语言绘图仍然停留在Turbo C的graphics.h年代,或许也有教育老化的原因,毕竟曾经的经典早已成往事,与其想尽各种办法寻找与其兼容的图形库,不如顺势拥抱灿烂的明天。Cario(http://cairographics.org/)是一个非常出色的2D图形库,著名的GTK+3.0完全采用Cario作为绘图引擎,由此可见它的强大和吸引力。

Cario支持X Window,Quartz,Win32,image.buffers,PostScript,PDF和SVG文件等多种输出设备,开源且跨平台。或许有人会觉得这么强大的东西用起来一定会十分的棘手,其实不然,它所提供的API函数出乎意料的简单易用,这篇文章在这里演示一个绘图太极图的例子,供大家参考。

实例代码如下:

#include <cairo.h> 

#define SIZE (640) /* 太极图大小 */
#define CX (SIZE / 2) /* 太极圆中心横坐标 */
#define CY (SIZE / 2) /* 太极圆中心纵坐标 */
#define R (SIZE / 2) /* 太极圆半径 */ 

/* 把角度转换为所对应的弧度 */
#define ANGLE(ang) (ang * 3.1415926 / 180.0) 

int main(int argc, char *argv[])
{
 /* 创建32位RGBA颜色格式的Cairo绘图环境,直接在Memory中渲染 */
 cairo_surface_t* surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, SIZE + 1, SIZE + 1);
 cairo_t* cr = cairo_create(surface); 

 /* 绘制太极边框 */
 cairo_set_line_width(cr, 2.0);
 cairo_set_source_rgba(cr, 0, 0, 0, 1);
 cairo_arc(cr, CX, CY, R, ANGLE(0), ANGLE(360));
 cairo_stroke(cr); 

 /* 绘制阴阳圆 */
 cairo_set_source_rgba(cr, 0, 0, 0, 1);
 cairo_arc(cr, CX, CY, R, ANGLE(90), ANGLE(270));
 cairo_fill(cr);
 cairo_set_source_rgba(cr, 1, 1, 1, 1);
 cairo_arc(cr, CX, CY, R, ANGLE(-90), ANGLE(90));
 cairo_fill(cr); 

 /* 绘制阴阳线 */
 cairo_set_source_rgba(cr, 0, 0, 0, 1);
 cairo_arc(cr, CX, CY - R / 2, R / 2, ANGLE(-90), ANGLE(90));
 cairo_fill(cr);
 cairo_set_source_rgba(cr, 1, 1, 1, 1);
 cairo_arc(cr, CX, CY + R / 2, R / 2, ANGLE(90), ANGLE(270));
 cairo_fill(cr); 

 /* 绘制太极眼 */
 cairo_set_source_rgba(cr, 1, 1, 1, 1);
 cairo_arc(cr, CX, CY - R / 2, R / 10, ANGLE(0), ANGLE(360));
 cairo_fill(cr);
 cairo_set_source_rgba(cr, 0, 0, 0, 1);
 cairo_arc(cr, CX, CY + R / 2, R / 10, ANGLE(0), ANGLE(360));
 cairo_fill(cr); 

 /* 将Memory的渲染效果存储到图片中 */
 cairo_surface_write_to_png(surface, "taichi.png");
 /* 销毁并退出Cairo绘图环境 */
 cairo_destroy(cr);
 cairo_surface_destroy (surface); 

 return 0;
} 

代码非常之简单吧,借此抛砖引玉,希望更多的人会喜欢上Cario图形库。GCC编译的话,可以参考如下的命令。

gcc -o taichi $(pkg-config --cflags --libs cairo) taichi.c 

运行后的效果是这样的,大家可以试试看。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索c语言绘制图形
cairo图形库
ps绘制太极图、canvas 绘制太极图、c语言绘制钟表、c语言绘制函数图像、c语言绘制图形,以便于您获取更多的相关知识。

时间: 2024-10-25 12:17:23

利用C语言的Cairo图形库绘制太极图实例教程_C 语言的相关文章

C语言泛型编程实例教程_C 语言

本文实例讲述了C语言泛型编程的方法,分享给大家供大家参考之用.具体分析如下: 首先,泛型编程让你编写完全一般化并可重复使用的算法,其效率与针对某特定数据类型而设计的算法相同.在C语言中,可以通过一些手段实现这样的泛型编程.这里介绍一种方法--通过无类型指针void* 看下面的一个实现交换两个元素内容的函数swap,以整型int为例: void swap(int* i1,int* i2){ int temp; temp = *i1; *i1 = *i2; *i2 = temp; } 当你想交换两个

一波C语言二元查找树算法题目解答实例汇总_C 语言

按层次遍历二元树问题描述:输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印.  例如输入: 8 / / 6 10 / / / / 5 7 9 11 输出 8 6 10 5 7 9 11           定义二元树(其实是二元搜索树,但并不遍历算法)的结点为: struct BSTreeNode { int value; BSTreeNode *left; BSTreeNode *right; };       思路:利用队列的先进先出,很容易实现.每次取出队列的首

C语言编程中函数的基本学习教程_C 语言

C 语言中的函数等价于 Fortran 语言中的子程序或函数,也等价于 Pascal 语言中的过程或函数.函数为计算的封装提供了一种简便的方法,此后使用函数时不需要考虑它是如何实现的.使用设计正确的函数,程序员无需考虑功能是如何实现的,而只需知道它具有哪些功能就够了.在 C 语言中可以简单.方便.高效地使用函数.我们经常会看到在定义后仅调用了一次的短函数,这样做可以使代码段更清晰易读. 到目前为止,我们所使用的函数(如 printf.getchar 和 putchar 等)都是函数库中提供的函数

使用C语言实现vector动态数组的实例分享_C 语言

下面是做项目时实现的一个动态数组,先后加入了好几个之后的项目,下面晒下代码. 头文件: # ifndef __CVECTOR_H__ # define __CVECTOR_H__ # define MIN_LEN 256 # define CVEFAILED -1 # define CVESUCCESS 0 # define CVEPUSHBACK 1 # define CVEPOPBACK 2 # define CVEINSERT 3 # define CVERM 4 # define EXP

一些C语言中字符串的算法问题解决实例小结_C 语言

    字符串问题是面试中经常出现的问题,这类问题有很多,难以不一.下面是几道字符串的题目,网上都能找到解答,自己实现了一下,供网友参考.感觉算法重要的是要有正确的思路,实现起来不是问题.自己一定要多思考,这样收获可能会更多一点.         问题1:找两个字符串的最长公共子串.         具体描述,如果字符串一的所有字符按其在字符串中的顺序出现在另外一个字符串二中,则字符串一称之为字符串二的子串.注意,并不要求子串(字符串一)的字符必须连续出现在字符串二中.请编写一个函数,输入两个字

C语言循环结构与时间函数用法实例教程_C 语言

本文实例展示了C语言循环结构与时间函数用法,对于C语言的学习来说是非常不错的参考借鉴材料.分享给大家供大家参考之用.具体如下: 完整实例代码如下: /********************************************** ** <Beginning C 4th Edition> Notes codes ** Created by Goopand ** Compiler: gcc 4.7.0 *****************************************

C语言创建和操作单链表数据结构的实例教程_C 语言

1,为什么要用到链表 数组作为存放同类数据的集合,给我们在程序设计时带来很多的方便,增加了灵活性.但数组也同样存在一些弊病.如数组的大小在定义时要事先规定,不能在程序中进行调整,这样一来,在程序设计中针对不同问题有时需要3 0个大小的数组,有时需要5 0个数组的大小,难于统一.我们只能够根据可能的最大需求来定义数组,常常会造成一定存储空间的浪费. 我们希望构造动态的数组,随时可以调整数组的大小,以满足不同问题的需要.链表就是我们需要的动态数组.它是在程序的执行过程中根据需要有数据存储就向系统要求

C语言中的函数指针基础学习教程_C 语言

顾名思义,函数指针就是函数的指针.它是一个指针,指向一个函数.看例子: A) char * (*fun1)(char * p1,char * p2); B) char * *fun2(char * p1,char * p2); C) char * fun3(char * p1,char * p2); 看看上面三个表达式分别是什么意思? C)这很容易,fun3是函数名,p1,p2是参数,其类型为char *型,函数的返回值为char *类型. B) 也很简单,与C)表达式相比,唯一不同的就是函数的

C语言编程中生成随机数的入门教程_C 语言

语言产生随机数是一个常见的编程功能任务,当然这个也不难,调用两三个函数就出来了,但是你知道这些函数具体是起到怎样的作用,并且是它们是如何产生随机数的吗? 几个概念 随机数:数学上产生的都是伪随机数,真正的随机数使用物理方法产生的. 随机数种子:随机数的产生是由算术规则产生的,srand(seed)的随机数种子不同,rand()的随机数值就不同,倘若每次的随机数种子一样,则rand()的值就一样.所以要产生随机数,则srand(seed)的随机数种子必须也要随机的. 用srand()产生随机数种子