我在学习Mandelbrot想写个程序测试一下。但是在计算的时候好像不太对。我把源程序贴出来。大家看看打印结果怎么不对呢。package computerGraphics;/**
* <p>Title: </p>
*
* <p>Description: </p>
*
* <p>Copyright: Copyright (c) 2005</p>
*
* <p>Company: </p>
*
* @author not attributable
* @version 1.0
*/
public class MandelbrotSetTest {
public static int pref_testNumber = 200; public MandelbrotSetTest() {
} public static void main(String[] args) {
MandelbrotSetTest test = new MandelbrotSetTest();
test.testOnComplexPlane(0, 0, 800, 600);
}
public static double getSubspaceIndex(ComplexNumber constantNumber) {
ComplexNumber startNumber = new ComplexNumber(0, 0);
double testNumber = 0;
while (testNumber < pref_testNumber && startNumber.magnitude() <= 2) {
startNumber.mult(startNumber).add(constantNumber);
testNumber++;
} //startNumber.debug();
// <= 1
return testNumber/pref_testNumber;
} public void testOnComplexPlane(int startX, int startY, int width, int height) {
double real_min = -2.0;
double real_max = 0.5;
double image_min = - 1.25;
double image_max = 1.25;
double real_increasement = (real_max - real_min) / width;
double real = real_min;
double image = image_min;
for (int y = startY; y < height; y ++) {
if (y > height) {
y = 0;
}
for (int x = startX; x < width; x ++) {
if (x > width) {
break;
}
double subspaceIndex = getSubspaceIndex(ComplexNumber.valueOf(real, image));
real += real_increasement;
System.out.println("x = " + x + ", y = " + y + ", subspaceIndex = " + subspaceIndex);
//paintPixel(x, y, color);
}
image += real_increasement;
}
}
}
package computerGraphics;/**
* <p>Title: </p>
*
* <p>Description: </p>
*
* <p>Copyright: Copyright (c) 2005</p>
*
* <p>Company: </p>
*
* @author not attributable
* @version 1.0
*/
public class ComplexNumber {
private double real;
private double image;
private static ComplexNumber complexNumber = new ComplexNumber(0, 0); public ComplexNumber(double param_real, double param_image) {
real = param_real;
image = param_image;
} public static ComplexNumber valueOf(double param_real, double param_image) {
complexNumber.setReal(param_real);
complexNumber.setImage(param_image);
return complexNumber;
} public ComplexNumber mult(ComplexNumber another) {
real = real * another.real - image * another.image;
image = real * another.image + image * another.real;
return this;
} public ComplexNumber add(ComplexNumber another) {
real = real + another.real;
image = image + another.image;
return this;
} public double magnitude() {
return Math.sqrt(real * real + image * image);
} public void debug() {
System.out.println("real = " + real + ", image = " + image + ", magnitude = " + magnitude());
} public double getImage() {
return image;
} public double getReal() {
return real;
} public void setImage(double image) {
this.image = image;
} public void setReal(double real) {
this.real = real;
}
}
* <p>Title: </p>
*
* <p>Description: </p>
*
* <p>Copyright: Copyright (c) 2005</p>
*
* <p>Company: </p>
*
* @author not attributable
* @version 1.0
*/
public class MandelbrotSetTest {
public static int pref_testNumber = 200; public MandelbrotSetTest() {
} public static void main(String[] args) {
MandelbrotSetTest test = new MandelbrotSetTest();
test.testOnComplexPlane(0, 0, 800, 600);
}
public static double getSubspaceIndex(ComplexNumber constantNumber) {
ComplexNumber startNumber = new ComplexNumber(0, 0);
double testNumber = 0;
while (testNumber < pref_testNumber && startNumber.magnitude() <= 2) {
startNumber.mult(startNumber).add(constantNumber);
testNumber++;
} //startNumber.debug();
// <= 1
return testNumber/pref_testNumber;
} public void testOnComplexPlane(int startX, int startY, int width, int height) {
double real_min = -2.0;
double real_max = 0.5;
double image_min = - 1.25;
double image_max = 1.25;
double real_increasement = (real_max - real_min) / width;
double real = real_min;
double image = image_min;
for (int y = startY; y < height; y ++) {
if (y > height) {
y = 0;
}
for (int x = startX; x < width; x ++) {
if (x > width) {
break;
}
double subspaceIndex = getSubspaceIndex(ComplexNumber.valueOf(real, image));
real += real_increasement;
System.out.println("x = " + x + ", y = " + y + ", subspaceIndex = " + subspaceIndex);
//paintPixel(x, y, color);
}
image += real_increasement;
}
}
}
package computerGraphics;/**
* <p>Title: </p>
*
* <p>Description: </p>
*
* <p>Copyright: Copyright (c) 2005</p>
*
* <p>Company: </p>
*
* @author not attributable
* @version 1.0
*/
public class ComplexNumber {
private double real;
private double image;
private static ComplexNumber complexNumber = new ComplexNumber(0, 0); public ComplexNumber(double param_real, double param_image) {
real = param_real;
image = param_image;
} public static ComplexNumber valueOf(double param_real, double param_image) {
complexNumber.setReal(param_real);
complexNumber.setImage(param_image);
return complexNumber;
} public ComplexNumber mult(ComplexNumber another) {
real = real * another.real - image * another.image;
image = real * another.image + image * another.real;
return this;
} public ComplexNumber add(ComplexNumber another) {
real = real + another.real;
image = image + another.image;
return this;
} public double magnitude() {
return Math.sqrt(real * real + image * image);
} public void debug() {
System.out.println("real = " + real + ", image = " + image + ", magnitude = " + magnitude());
} public double getImage() {
return image;
} public double getReal() {
return real;
} public void setImage(double image) {
this.image = image;
} public void setReal(double real) {
this.real = real;
}
}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货