【C语言练手】C语言画太极图

呵呵昨天花了一个圆,今天想画个太极图,我知道没啥技术含量,但是挺有意思的,希望各位看官不要鄙视我不务正业,画完此图,不再做这些事情。

先展示下画出来的图像的情况,因为不支持pgm格式的图像,所以我用的 QQ截图:

今天,二话不说上代码。同时再次致谢Banu前辈

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

typedef struct {
                size_t width;
                size_t height;
                unsigned char *data;

} Image;

static Image * image_new (size_t width,
                                size_t height){
                Image *image;
                image = malloc (sizeof *image);
                image->width = width;
                image->height = height;
                image->data = malloc (width * height);
                return image;

}

static void

image_free (Image *image)

{
                free (image->data);
               free (image);
}
                static void

image_fill (Image *image,
                        unsigned char value)
{

                memset (image->data, value, image->width * image->height);

}



/**

 * image_set_pixel:

 *

 * Sets a pixel passed in signed (x, y) coordinates, where (0,0) is at

 * the center of the image.

 **/

static void

image_set_pixel (Image *image,

                                ssize_t x,

                                ssize_t y,

                                unsigned char value)

{

                size_t tx, ty;

                unsigned char *p;
                tx = (image->width / 2) + x;

                ty = (image->height / 2) + y;
                p = image->data + (ty * image->width) + tx;
 *p = value;

}



static void

image_save (const Image *image,

 const char *filename)

{

                FILE *out;
                out = fopen (filename, "wb");

 if (!out)

                                return;



                fprintf (out, "P5\n");

                fprintf (out, "%zu %zu\n", image->width, image->height);

                fprintf (out, "255\n");
                fwrite (image->data, 1, image->width * image->height, out);



                fclose (out);

}



static void draw_Taijitu(Image *image,int radius,int value)

{

 int x,y;

 int rlimit ,llimit;
 int radius_2 = radius*radius;

 for(y = -radius;y<radius;y++)

 for(x= -radius;x<radius;x++)
 if(x*x+y*y <= radius_2)

                          image_set_pixel(image,x,y,0xff);



 for(y = -radius;y<0;y++)

 for(x = 0;x<radius;x++)

 if((x*x)+(y*y) <= radius_2)

                          image_set_pixel(image,x,y,value);



 for(y = -radius;y<0;y++)

 for(x = -(int)sqrt((double)(-radius*y-y*y));x<0;x++)

                        image_set_pixel(image,x,y,value);

 for(y = 0;y<radius;y++)

 {

                                llimit = (int)sqrt((double)(radius*y - y*y));

                                rlimit = (int)sqrt((double)(radius_2 - y*y));

 for(x = llimit;x<rlimit;x++)

                                                image_set_pixel(image,x,y,value);

 }



 for(y = 2*radius/6;y<4*radius/6;y++)

 {

                                rlimit =(int) sqrt((double)(radius*y-y*y-2*radius_2/9));

                                llimit = -rlimit;
 for(x = llimit;x<rlimit;x++)

                                                image_set_pixel(image,x,y,value);

 }



 for(y = -4*radius/6;y<-2*radius/6;y++)

 {

                                rlimit = sqrt(-radius*y-y*y-2*radius_2/9);

                                llimit = -rlimit;

 for(x = llimit;x<rlimit;x++)

                                                image_set_pixel(image,x,y,0xff)
 }
                return ;
}

 int main (int argc, char *argv[])

{
                Image *image;
                image = image_new (800, 800);
                image_fill (image, 0xaa);

                draw_Taijitu (image, 300, 0);

                image_save (image, "taiji_6.pgm");
                image_free (image);
                return 0;

}

小编亲自测试过,这个代码可用,虽然在函数的命名和实现上存在瑕疵,拿来练手找找编程的感觉足够,最后在文件执行目录会生成taiji_6.pgm名字的图片

修改自:http://blog.chinaunix.net/uid-24774106-id-3048064.html

原文发布于微信公众号 - 程序员互动联盟(coder_online)

原文发表时间:2016-11-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏HansBug's Lab

【LATEX】个人版latex论文模板

以下是我的个人论文模板,运行环境为Xelatex(在线ide:Sharelatex.com) 鉴于本人常有插入程序的需求,故引用了lstlisting \Req...

459120
来自专栏芋道源码1024

Dubbo 源码解析 —— LoadBalance

前言 终于到了集群容错中的最后一个关键词,也就是 LoadBalance(负载均衡),负载均衡必然会涉及一些算法.但是也不用太担心,算法这个词虽然高大上,但是算...

40740
来自专栏人工智能LeadAI

Spark新愿景:让深度学习变得更加易于使用

01 前 言 Spark成功的实现了当年的承诺,让数据处理变得更容易,现在,雄心勃勃的Databricks公司展开了一个新的愿景:让深度学习变得更容易。 当然牛...

39650
来自专栏racaljk

2017第八届蓝桥杯决赛(C++ B组)4.发现环

小明的实验室有N台电脑,编号1~N。原本这N台电脑之间有N-1条数据链接相连,恰好构成一个树形网络。在树形网络上,任意两台电脑之间有唯一的路径相连。 不过在最...

27440
来自专栏专知

Tensorflow Eager Execution入门指南

本文介绍了最新版的Tensorflow 1.7的功能及其使用方法,重点介绍其中最有趣的功能之一eager_execution,它许用户在不创建静态图的情况下运行...

579130
来自专栏磐创AI技术团队的专栏

Tensorboard 详解(上篇)

26030
来自专栏专知

【前沿】Pytorch开源VQA神经网络模块,让你快速完成看图问答

【导读】近期,NLP专家Harsh Trivedi使用Pytorch实现了一个视觉问答的神经模块网络,想法是参考CVPR2016年的论文《Neural Modu...

30480
来自专栏专知

【最新TensorFlow1.4.0教程01】TF1.4.0介绍与动态图机制 Eager Execution使用

【导读】主题链路知识是我们专知的核心功能之一,为用户提供AI领域系统性的知识学习服务,一站式学习人工智能的知识,包含人工智能( 机器学习、自然语言处理、计算机视...

41280
来自专栏AI2ML人工智能to机器学习

TF Boy 之初筵 - 分布十三式

我们在 " 机器学习平台的优化器 (平台篇、优化篇)" 里面提到TensorFlow (TF) 速度的成为深度学习的武林第一大帮。 博士好友清华,在这方面也颇有...

8820
来自专栏小詹同学

人脸识别(三)——源码放送

人脸识别相关的基本原理和流程,以及各个步骤的介绍和代码前两篇都有介绍,其实可以通过前两篇自行整合出完整的人脸识别源码,并且适当修改可以实现MFC程...

59380

扫码关注云+社区

领取腾讯云代金券