朱利亞集合是一個在復平面上形成分形的點的集合。以法國數學家加斯頓·朱利亞(Gaston Julia)的名字命名。
朱利亞集合可以由下式進行反復迭代得到:

對于固定的復數c,取某一z值(如z = z0),可以得到序列

這一序列可能反散于無窮大或始終處于某一范圍之內并收斂于某一值。我們將使其不擴散的z值的集合稱為朱利亞集合。
以下使用OpenCV編碼繪制Julia集圖形:
#include <Windows.h>#include<highgui/highgui.hpp>using namespace cv;const int icount = 200;     //迭代次數const float c = -0.85;       //實部const float d = 0.088;      //虛部double m_real, m_image;     //Mandelbro集class ComplexClass{public:	double real;	double image;	ComplexClass(double r = 0, double i = 0) { real = r, image = i; }};ComplexClass Operator+(const ComplexClass& a, const ComplexClass &b){	ComplexClass c;	c.real = a.real + b.real;	c.image = a.image + b.image;	return c;}ComplexClass operator*(const ComplexClass& a, const ComplexClass &b){	ComplexClass c;	c.real = a.real * b.real - a.image * b.image;	c.image = a.image * b.real + a.real * b.image;	return c;}double Model(ComplexClass a){	return sqrtf(a.real * a.real + a.image * a.image);}double Iteration(ComplexClass a, int n){	if (n == 0)		return Model(a);	else	{		ComplexClass temp = a*a;		temp.real += c;		temp.image += d;		//    temp.real += m_real;  把這兩句代替前面的兩句就是mandelbrot集了		//    temp.image += m_image;		return Iteration(temp, n - 1);	}}Vec3b dye(double dist){	if (dist < 1000000 && dist>-1000000)		return Vec3b(255, 0, 0);	else		return Vec3b(0, 0, 0);   //Julia集之外的區域置為黑色}int main(){	Mat image = Mat(Size(500, 500), CV_8UC3, Scalar::all(10));	for (int Y = 0; Y < image.rows; Y++)	{		for (int X = 0; X < image.cols; X++)		{			float x = (X - image.cols / 2) / 200.0;			float y = (Y - image.rows / 2) / 200.0;			m_real = x;			m_image = y;			ComplexClass a(x, y);			float dist = Iteration(a, icount);			image.at<Vec3b>(Y, X) = dye(dist);		}	}	//namedWindow("OpenCV For Julia", 0);	imshow("OpenCV For Julia | c = -0.85  d = 0.088", image);	waitKey();}改變實部c和虛數b的值可以得到不同的圖形,很漂亮。c=-0.576   d=0.456:

c=-0.8 d=0.156:

c=0.285 d=0.02:

c=-0.85 d=0.088:

新聞熱點
疑難解答