分析一个写图片的c++程序

#include <iostream>
#include <cmath>
#include <cstdlib>
#include <cstdio>
#define DIM 1024
#define DM1 (DIM-1)
#define _sq(x) ((x)*(x)) // square
#define _cb(x) abs((x)*(x)*(x)) // absolute value of cube
#define _cr(x) (unsigned char)(pow((x),1.0/3.0)) // cube root

unsigned char GR(int,int);//三原色中的绿色
unsigned char BL(int,int);//蓝色

unsigned char RD(int i,int j){//红色
return (char)(_sq(cos(atan2(j-512,i-512)/2))*255);//(j-512,i-512)的原因是:原点在文件的中心。cos(atan2(j-512,i-512)/2)中除2的原因:由于cos()的范围是(-1,1),当/2后cos()的范围(0,1)。//然后再将(0,1)范围内的数求平方,这样做的结果是增加(0,1)范围的稀释度。最后×255得到(0,255)范围的数,说白了就是相当于rand()函数,不过这个函数的依赖是(x,y)这个点的位置,而不是硬件上的信息。
}
unsigned char GR(int i,int j){
return (char)(_sq(cos(atan2(j-512,i-512)/2-2*acos(-1)/3))*255);//acos是反余玄函数。其中acos(-1)的结果是3.14159,2×acos(-1)/3的结果是120度,而前面atan2()的结果范围是(0,90度),减过后是(-120度,-30度).
}
unsigned char BL(int i,int j){
return (char)(_sq(cos(atan2(j-512,i-512)/2+2*acos(-1)/3))*255);//度数范围(120度,210度).
}

void pixel_write(int,int);//在指定的点上写入。
FILE *fp;//创建一个文件。
int main(){
	fp = fopen("MathPic.ppm","wb");//创建一个.ppm格式的图片文件。
	fprintf(fp, "P6\n%d %d\n255\n", DIM, DIM);//申请1024×1024大小的空间。
	for(int j=0;j<DIM;j++)//以循环的形式对整个空间进行扫描,用来写入所有的点上的颜色。
	for(int i=0;i<DIM;i++)
	pixel_write(i,j);
	fclose(fp);//关闭文件。
	return 0;
}
void pixel_write(int i, int j){
	static unsigned char color[3];//有三种颜色即三色。
	color[0] = RD(i,j)&255;//&255是用来"保证"颜色数不会超过255。255的二进制是11111111。
	color[1] = GR(i,j)&255;
	color[2] = BL(i,j)&255;
	fwrite(color, 1, 3, fp);//fwrite(数据,数据类型大小(字节数),写入数据的最大数量,文件指针);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值