|
- #pragma once
- class CL{
- public:
- char r, g, b;
- };
- class LM
- {
- public:
- LM(void){
- img = NULL;
- height = 200;
- width = 200;
- iterCount = 100;
- scale = 1000;
- xMaxBound = 4;
- xMinBound = 3.5;
- yMaxBound = 1;
- yMinBound = 0;
- }
- ~LM(void){
- delete[] img;
- }
- static inline double iter(double mult, double prev){
- return mult * prev * (1 - prev);
- }
- static inline int maxof(int *sour, int len){
- int max = 0;
- for(int i = 0;i<len;i++)
- if(sour[i] > max)
- max = sour[i];
- return max;
- }
- public:
- CL* img;
- int height, width;
- int scale;
- int iterCount;
- double xMaxBound, xMinBound, yMaxBound, yMinBound; //取值范围0-4 / 0-1
- void generate(){
- img = new CL[width*height];
- register double currentx;
- register double currenty;
- register int *genCount = new int[height];
- double delta = xMaxBound - xMinBound;
- double sc = delta / width;
- for(int i = 0;i<width;i++){
- //宽度遍历
- currentx = xMinBound + sc * i;
- //高度赋值
- memset(genCount, 0, sizeof(int)*height);
- for(int j = 1;j<scale;j++){
- currenty = 1.0 * j / scale;
- for(int k = 0;k<iterCount;k++)
- currenty = iter(currentx, currenty);
- if(currenty >= 0 && currenty<1)
- genCount[(int)(currenty * height)] ++;
- }
- int max = maxof(genCount, height);
- for(int j = 0;j<height;j++){
- unsigned char p = (genCount[j] << 8) / (max + 0.0001);
- p = p > 0x3F ? 0XFF : (p<<2);
- CL cl = {p, p, p};
- img[(height - 1 - j)*width+i] = cl;
- }
- }
- delete[] genCount;
- }
- void destory(){
- delete[] img;
- }
- };
- //Mandelbrot集合
- //Z(k+1) = Z(k)*Z(k) + C,Any C s.t. |Z(k+1)|不趋近于∞(迭代次数内不大于2)
- #include <math.h>
- class C{
- public:
- double r, i;
- inline double operator~(){
- return sqrt(r*r+i*i);
- }
- inline C operator *(int m){
- C c = {m*r, m*i};
- return c;
- }
- inline C operator *(C z){
- C c = {r*z.r-i*z.i, r*z.i+i*z.r};
- return c;
- }
- inline C operator +(int m){
- C c = {r + m, i};
- return c;
- }
- inline C operator +(C z){
- C c = {r + z.r, i + z.i};
- return c;
- }
- };
- class MS{
- public:
- MS(void){
- img = NULL;
- height = 200;
- width = 200;
- iterCount = 100;
- xMaxBound = 1;
- xMinBound = -2;
- yMaxBound = 1;
- yMinBound = -1;
- }
- ~MS(void){
- delete[] img;
- }
- static inline C iter(C added, C prev){
- return prev * prev + added;
- }
- public:
- CL* img;
- int height, width;
- int iterCount;
- double xMaxBound, xMinBound, yMaxBound, yMinBound; //取值范围0-4 / 0-1
- void generate(){
- img = new CL[width*height];
- double dX = (xMaxBound - xMinBound)/width;
- double dY = (yMaxBound - yMinBound)/height;
- for(int i = 0;i<width;i++){
- for(int j = 0;j<height;j++){
- C added = {xMinBound + dX*i, yMinBound + dY*j};
- C current = {0, 0};
- long infn = 0;
- for(int k = 0;k<iterCount;k++){
- current = iter(added, current);
- if(~current > 2){
- break;
- }
- infn ++;
- }
- unsigned char p = infn * 0xFF / iterCount;
- CL cl = {p, p, p};
- img[(height - 1 - j)*width+i] = cl;
- }
- }
- }
- void destory(){
- delete[] img;
- }
- };
复制代码
|
|