c语言的画图软件,C语言画图之画个太极图

本文介绍了一个C++程序,通过定义结构体Image来操作图像数据,包括创建、填充、设置像素和保存为PGM格式。重点展示了如何使用image_set_pixel函数绘制Taijitu(太极图),并在main函数中实例化并演示了整个流程。
摘要由CSDN通过智能技术生成

#include

#include

#include

#include

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

for(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

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

{

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

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

for(x = llimit;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

image_set_pixel(image,x,y,value);

}

for(y = -4*radius/6;y

{

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

llimit = -rlimit;

for(x = llimit;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;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值