专栏首页程序员互动联盟【C语言练手】C语言画太极图

【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)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

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

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 网站上的验证码是怎么产生的?

    目前,许多网站的会员登录时都要求输入验证码,尽管验证码的形式五花八门,但是所使用的原理基本是一样的,都是生成随机字符串,然后描绘成图片的形式输出。 验证码的...

    程序员互动联盟
  • 【答疑释惑】Android多国语言实现原理

    先来看一下网友的问题: ? 网友们问的问题是android中布局文件中android:text="hello_world"和 android:text="@s...

    程序员互动联盟
  • 不同编程语言的程序可不可以通过接口相互调用?

    在真正搞明白这个事情之前首先要想明白一件事情,目前所有的编程语言都要遵守冯诺依曼的架构,也就是所有编程语言都要转化成二进制的文件机器语言,这样子计算机才能真正识...

    程序员互动联盟
  • Reference Nodes(引用节点)

    iOSDevLog
  • 【HiBlock技术工坊69期会议实录】MYKEY多链钱包和ETH账户合约介绍 ​

    Hiblock区块链技术工坊活动,由HiBlock发起,下笔有神公司支持、区块链兄弟,HPB芯链联合主办,深度聚焦于分享区块链知识,实现小会技术交友,在上海已成...

    辉哥
  • 项目经理最牛思维导图二

    yeedomliu
  • 思维导图学 Kotlin

    Yano_nankai
  • [小梅的体验课堂]Microsoft edge canary mac版本体验

    华硕微软越来越没有自己的JC了,不经在windows里面加了wsl而且还废弃了自己的老edge浏览器,重新基于chromium内核开发了新的edge浏览器了,不...

    bboysoul
  • 互联网黑话指南

    grain先森
  • 项目经理最牛思维导图三

    yeedomliu

扫码关注云+社区

领取腾讯云代金券