前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【C语言练手】C语言画太极图

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

作者头像
程序员互动联盟
发布2018-03-16 15:00:37
5.2K0
发布2018-03-16 15:00:37
举报

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

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

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

代码语言:javascript
复制
#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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2016-11-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员互动联盟 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档