Skip to content

Commit

Permalink
Merge pull request #9 from hrkalona/release/1.0.8.8
Browse files Browse the repository at this point in the history
Release/1.0.8.8
  • Loading branch information
hrkalona committed Aug 15, 2023
2 parents c053dbe + 62347f1 commit bcc3e12
Show file tree
Hide file tree
Showing 218 changed files with 7,015 additions and 1,846 deletions.
9 changes: 9 additions & 0 deletions Changelog.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1,12 @@
Version 1.0.8.8
-Added a new BigNum type based on BigInteger which is faster than the built-in type in low zoom levels
-Added Rank Order in histogram coloring
-Implemented multi-threaded reference calculation for Mandelbrot for very high precisions (excluding MPFR)
-Added an option for Normal Map to be combinable with other statistical coloring methods
-Fixed some bugs related to rotation
-Added interpolation mode in custom direct palette editor
-Refactored some code after doing some tests with java 20 version

Version 1.0.8.7
-Implemented a period detection algorithm based on derivative for Mandelbrot 2-5 powers
-Added new functions Magnet Pataki 2-5 and N powers
Expand Down
6 changes: 5 additions & 1 deletion README.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
Fractal Zoomer 1.0.8.7
Fractal Zoomer 1.0.8.8

The most complete fractal generating software using java!

Expand Down Expand Up @@ -28,3 +28,7 @@ Many Color Algorithms
Color Cycling
Orbits
Image filters


Acknowledgments:
I want to thank Eleftheria Karaferi, without her love, support and patience this project would not have come so far.
Binary file modified lib/apfloat.jar
Binary file not shown.
71 changes: 67 additions & 4 deletions src/fractalzoomer/bailout_conditions/BailoutCondition.java
Original file line number Diff line number Diff line change
Expand Up @@ -30,18 +30,26 @@ public abstract class BailoutCondition {
protected double bound;
protected Apfloat ddbound;
protected BigNum bnbound;
protected BigIntNum binbound;
protected DoubleDouble ddcbound;
protected int id;


protected boolean useThreads;

public void setUseThreads(boolean useThreads) {
this.useThreads = useThreads;
}
protected BailoutCondition(double bound) {


useThreads = true;
this.bound = bound;
if(ThreadDraw.PERTURBATION_THEORY || ThreadDraw.HIGH_PRECISION_CALCULATION) {
ddbound = new MyApfloat(bound);
ddcbound = new DoubleDouble(bound);

if(ThreadDraw.USE_BIGNUM_FOR_REF_IF_POSSIBLE || ThreadDraw.HIGH_PRECISION_CALCULATION) {
bnbound = new BigNum(ddbound);
bnbound = new BigNum(bound);
binbound = new BigIntNum(bound);
}
}

Expand All @@ -51,15 +59,70 @@ protected BailoutCondition(double bound) {
public abstract boolean escaped(BigComplex z, BigComplex zold, BigComplex zold2, int iterations, BigComplex c, BigComplex start, BigComplex c0, Apfloat norm_squared, BigComplex pixel);
public abstract boolean escaped(BigNumComplex z, BigNumComplex zold, BigNumComplex zold2, int iterations, BigNumComplex c, BigNumComplex start, BigNumComplex c0, BigNum norm_squared, BigNumComplex pixel);

public abstract boolean escaped(BigIntNumComplex z, BigIntNumComplex zold, BigIntNumComplex zold2, int iterations, BigIntNumComplex c, BigIntNumComplex start, BigIntNumComplex c0, BigIntNum norm_squared, BigIntNumComplex pixel);

public abstract boolean escaped(DDComplex z, DDComplex zold, DDComplex zold2, int iterations, DDComplex c, DDComplex start, DDComplex c0, DoubleDouble norm_squared, DDComplex pixel);

public abstract boolean escaped(MpfrBigNumComplex z, MpfrBigNumComplex zold, MpfrBigNumComplex zold2, int iterations, MpfrBigNumComplex c, MpfrBigNumComplex start, MpfrBigNumComplex c0, MpfrBigNum norm_squared, MpfrBigNumComplex pixel);

public abstract boolean escaped(MpirBigNumComplex z, MpirBigNumComplex zold, MpirBigNumComplex zold2, int iterations, MpirBigNumComplex c, MpirBigNumComplex start, MpirBigNumComplex c0, MpirBigNum norm_squared, MpirBigNumComplex pixel);

public boolean escaped(Complex z, Complex zold, Complex zold2, int iterations, Complex c, Complex start, Complex c0, double norm_squared, Complex pixel, Complex zl, MantExpComplex zd) {
return escaped(z, zold, zold2, iterations, c, start, c0, norm_squared, pixel);
}
public boolean escaped(BigComplex z, BigComplex zold, BigComplex zold2, int iterations, BigComplex c, BigComplex start, BigComplex c0, Apfloat norm_squared, BigComplex pixel, Complex zl, MantExpComplex zd) {
return escaped(z, zold, zold2, iterations, c, start, c0, norm_squared, pixel);
}
public boolean escaped(BigNumComplex z, BigNumComplex zold, BigNumComplex zold2, int iterations, BigNumComplex c, BigNumComplex start, BigNumComplex c0, BigNum norm_squared, BigNumComplex pixel, Complex zl, MantExpComplex zd) {
return escaped(z, zold, zold2, iterations, c, start, c0, norm_squared, pixel);
}

public boolean escaped(BigIntNumComplex z, BigIntNumComplex zold, BigIntNumComplex zold2, int iterations, BigIntNumComplex c, BigIntNumComplex start, BigIntNumComplex c0, BigIntNum norm_squared, BigIntNumComplex pixel, Complex zl, MantExpComplex zd) {
return escaped(z, zold, zold2, iterations, c, start, c0, norm_squared, pixel);
}

public boolean escaped(DDComplex z, DDComplex zold, DDComplex zold2, int iterations, DDComplex c, DDComplex start, DDComplex c0, DoubleDouble norm_squared, DDComplex pixel, Complex zl, MantExpComplex zd) {
return escaped(z, zold, zold2, iterations, c, start, c0, norm_squared, pixel);
}

public boolean escaped(MpfrBigNumComplex z, MpfrBigNumComplex zold, MpfrBigNumComplex zold2, int iterations, MpfrBigNumComplex c, MpfrBigNumComplex start, MpfrBigNumComplex c0, MpfrBigNum norm_squared, MpfrBigNumComplex pixel, Complex zl, MantExpComplex zd) {
return escaped(z, zold, zold2, iterations, c, start, c0, norm_squared, pixel);
}

public boolean escaped(MpirBigNumComplex z, MpirBigNumComplex zold, MpirBigNumComplex zold2, int iterations, MpirBigNumComplex c, MpirBigNumComplex start, MpirBigNumComplex c0, MpirBigNum norm_squared, MpirBigNumComplex pixel, Complex zl, MantExpComplex zd) {
return escaped(z, zold, zold2, iterations, c, start, c0, norm_squared, pixel);
}

public boolean Escaped(GenericComplex z, GenericComplex zold, GenericComplex zold2, int iterations, GenericComplex c, GenericComplex start, GenericComplex c0, Object norm_squared, GenericComplex pixel, Complex zl, MantExpComplex zd) {
if(z instanceof BigNumComplex) {
return escaped((BigNumComplex)z, (BigNumComplex)zold, (BigNumComplex)zold2, iterations, (BigNumComplex)c, (BigNumComplex)start, (BigNumComplex)c0, (BigNum) norm_squared, (BigNumComplex)pixel, zl, zd);
}
else if(z instanceof BigIntNumComplex) {
return escaped((BigIntNumComplex)z, (BigIntNumComplex)zold, (BigIntNumComplex)zold2, iterations, (BigIntNumComplex)c, (BigIntNumComplex)start, (BigIntNumComplex)c0, (BigIntNum) norm_squared, (BigIntNumComplex)pixel, zl, zd);
}
else if(z instanceof MpirBigNumComplex) {
return escaped((MpirBigNumComplex)z, (MpirBigNumComplex)zold, (MpirBigNumComplex)zold2, iterations, (MpirBigNumComplex)c, (MpirBigNumComplex)start, (MpirBigNumComplex)c0, (MpirBigNum) norm_squared, (MpirBigNumComplex)pixel, zl, zd);
}
else if(z instanceof MpfrBigNumComplex) {
return escaped((MpfrBigNumComplex)z, (MpfrBigNumComplex)zold, (MpfrBigNumComplex)zold2, iterations, (MpfrBigNumComplex)c, (MpfrBigNumComplex)start, (MpfrBigNumComplex)c0, (MpfrBigNum) norm_squared, (MpfrBigNumComplex)pixel, zl, zd);
}
else if (z instanceof BigComplex) {
return escaped((BigComplex)z, (BigComplex)zold, (BigComplex)zold2, iterations, (BigComplex)c, (BigComplex)start, (BigComplex)c0, (Apfloat) norm_squared, (BigComplex)pixel, zl, zd);
}
else if (z instanceof DDComplex) {
return escaped((DDComplex)z, (DDComplex)zold, (DDComplex)zold2, iterations, (DDComplex)c, (DDComplex)start, (DDComplex)c0, (DoubleDouble) norm_squared, (DDComplex)pixel, zl, zd);
}
else {
return escaped((Complex) z, (Complex)zold, (Complex)zold2, iterations, (Complex)c, (Complex)start, (Complex)c0, (double) norm_squared, (Complex)pixel, zl, zd);
}
}

public boolean Escaped(GenericComplex z, GenericComplex zold, GenericComplex zold2, int iterations, GenericComplex c, GenericComplex start, GenericComplex c0, Object norm_squared, GenericComplex pixel) {
if(z instanceof BigNumComplex) {
return escaped((BigNumComplex)z, (BigNumComplex)zold, (BigNumComplex)zold2, iterations, (BigNumComplex)c, (BigNumComplex)start, (BigNumComplex)c0, (BigNum) norm_squared, (BigNumComplex)pixel);
return escaped((BigNumComplex)z, (BigNumComplex)zold, (BigNumComplex)zold2, iterations, (BigNumComplex)c, (BigNumComplex)start, (BigNumComplex)c0, (BigNum) norm_squared, (BigNumComplex)pixel);
}
else if(z instanceof BigIntNumComplex) {
return escaped((BigIntNumComplex)z, (BigIntNumComplex)zold, (BigIntNumComplex)zold2, iterations, (BigIntNumComplex)c, (BigIntNumComplex)start, (BigIntNumComplex)c0, (BigIntNum) norm_squared, (BigIntNumComplex)pixel);
}
else if(z instanceof MpirBigNumComplex) {
return escaped((MpirBigNumComplex)z, (MpirBigNumComplex)zold, (MpirBigNumComplex)zold2, iterations, (MpirBigNumComplex)c, (MpirBigNumComplex)start, (MpirBigNumComplex)c0, (MpirBigNum) norm_squared, (MpirBigNumComplex)pixel);
Expand Down
35 changes: 32 additions & 3 deletions src/fractalzoomer/bailout_conditions/CircleBailoutCondition.java
Original file line number Diff line number Diff line change
Expand Up @@ -61,13 +61,37 @@ public boolean escaped(Complex z, Complex zold, Complex zold2, int iterations, C
@Override
public boolean escaped(BigComplex z, BigComplex zold, BigComplex zold2, int iterations, BigComplex c, BigComplex start, BigComplex c0, Apfloat norm_squared, BigComplex pixel) {

return z.norm_squared().compareTo(ddbound) >= 0;
if(useThreads) {
return z.norm_squared().compareTo(ddbound) >= 0;
}
else {
return z.norm_squared_no_threads().compareTo(ddbound) >= 0;
}

}

@Override
public boolean escaped(BigNumComplex z, BigNumComplex zold, BigNumComplex zold2, int iterations, BigNumComplex c, BigNumComplex start, BigNumComplex c0, BigNum norm_squared, BigNumComplex pixel) {
return z.norm_squared().compareBothPositive(bnbound) >= 0;

if(useThreads) {
return z.norm_squared().compareBothPositive(bnbound) >= 0;
}
else {
return z.norm_squared_no_threads().compareBothPositive(bnbound) >= 0;
}

}

@Override
public boolean escaped(BigIntNumComplex z, BigIntNumComplex zold, BigIntNumComplex zold2, int iterations, BigIntNumComplex c, BigIntNumComplex start, BigIntNumComplex c0, BigIntNum norm_squared, BigIntNumComplex pixel) {

if(useThreads) {
return z.norm_squared().compare(binbound) >= 0;
}
else {
return z.norm_squared_no_threads().compare(binbound) >= 0;
}

}

@Override
Expand All @@ -77,7 +101,12 @@ public boolean escaped(MpfrBigNumComplex z, MpfrBigNumComplex zold, MpfrBigNumCo

@Override
public boolean escaped(MpirBigNumComplex z, MpirBigNumComplex zold, MpirBigNumComplex zold2, int iterations, MpirBigNumComplex c, MpirBigNumComplex start, MpirBigNumComplex c0, MpirBigNum norm_squared, MpirBigNumComplex pixel) {
return z.norm_squared(temp1p, temp2p).compare(bound) >= 0;
if(useThreads) {
return z.norm_squared(temp1p, temp2p).compare(bound) >= 0;
}
else {
return z.norm_squared_no_threads(temp1p, temp2p).compare(bound) >= 0;
}
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,11 @@ public boolean escaped(BigNumComplex z, BigNumComplex zold, BigNumComplex zold2,
return norm_squared.compareBothPositive(bnbound) >= 0;
}

@Override
public boolean escaped(BigIntNumComplex z, BigIntNumComplex zold, BigIntNumComplex zold2, int iterations, BigIntNumComplex c, BigIntNumComplex start, BigIntNumComplex c0, BigIntNum norm_squared, BigIntNumComplex pixel) {
return norm_squared.compare(binbound) >= 0;
}

@Override
public boolean escaped(MpfrBigNumComplex z, MpfrBigNumComplex zold, MpfrBigNumComplex zold2, int iterations, MpfrBigNumComplex c, MpfrBigNumComplex start, MpfrBigNumComplex c0, MpfrBigNum norm_squared, MpfrBigNumComplex pixel) {
return norm_squared.compare(bound) >= 0;
Expand All @@ -48,4 +53,80 @@ public boolean escaped(DDComplex z, DDComplex zold, DDComplex zold2, int iterati
return norm_squared.compareTo(ddcbound) >= 0;

}

@Override
public boolean escaped(Complex z, Complex zold, Complex zold2, int iterations, Complex c, Complex start, Complex c0, double norm_squared, Complex pixel, Complex zl, MantExpComplex zd) {

if(zl != null) {
return zl.norm_squared() >= bound;
}
else {
return zd.norm_squared().toDouble() >= bound;
}

}

@Override
public boolean escaped(BigComplex z, BigComplex zold, BigComplex zold2, int iterations, BigComplex c, BigComplex start, BigComplex c0, Apfloat norm_squared, BigComplex pixel, Complex zl, MantExpComplex zd) {

if(zl != null) {
return zl.norm_squared() >= bound;
}
else {
return zd.norm_squared().toDouble() >= bound;
}

}

@Override
public boolean escaped(BigNumComplex z, BigNumComplex zold, BigNumComplex zold2, int iterations, BigNumComplex c, BigNumComplex start, BigNumComplex c0, BigNum norm_squared, BigNumComplex pixel, Complex zl, MantExpComplex zd) {
if(zl != null) {
return zl.norm_squared() >= bound;
}
else {
return zd.norm_squared().toDouble() >= bound;
}
}

@Override
public boolean escaped(BigIntNumComplex z, BigIntNumComplex zold, BigIntNumComplex zold2, int iterations, BigIntNumComplex c, BigIntNumComplex start, BigIntNumComplex c0, BigIntNum norm_squared, BigIntNumComplex pixel, Complex zl, MantExpComplex zd) {
if(zl != null) {
return zl.norm_squared() >= bound;
}
else {
return zd.norm_squared().toDouble() >= bound;
}
}

@Override
public boolean escaped(MpfrBigNumComplex z, MpfrBigNumComplex zold, MpfrBigNumComplex zold2, int iterations, MpfrBigNumComplex c, MpfrBigNumComplex start, MpfrBigNumComplex c0, MpfrBigNum norm_squared, MpfrBigNumComplex pixel, Complex zl, MantExpComplex zd) {
if(zl != null) {
return zl.norm_squared() >= bound;
}
else {
return zd.norm_squared().toDouble() >= bound;
}
}

@Override
public boolean escaped(MpirBigNumComplex z, MpirBigNumComplex zold, MpirBigNumComplex zold2, int iterations, MpirBigNumComplex c, MpirBigNumComplex start, MpirBigNumComplex c0, MpirBigNum norm_squared, MpirBigNumComplex pixel, Complex zl, MantExpComplex zd) {
if(zl != null) {
return zl.norm_squared() >= bound;
}
else {
return zd.norm_squared().toDouble() >= bound;
}
}

@Override
public boolean escaped(DDComplex z, DDComplex zold, DDComplex zold2, int iterations, DDComplex c, DDComplex start, DDComplex c0, DoubleDouble norm_squared, DDComplex pixel, Complex zl, MantExpComplex zd) {

if(zl != null) {
return zl.norm_squared() >= bound;
}
else {
return zd.norm_squared().toDouble() >= bound;
}

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,11 @@ public boolean escaped(BigNumComplex z, BigNumComplex zold, BigNumComplex zold2,
return z.getAbsRe().compareBothPositive(bnbound) >= 0 && z.getAbsIm().compareBothPositive(bnbound) >= 0;
}

@Override
public boolean escaped(BigIntNumComplex z, BigIntNumComplex zold, BigIntNumComplex zold2, int iterations, BigIntNumComplex c, BigIntNumComplex start, BigIntNumComplex c0, BigIntNum norm_squared, BigIntNumComplex pixel) {
return z.getAbsRe().compare(binbound) >= 0 && z.getAbsIm().compare(binbound) >= 0;
}

@Override
public boolean escaped(MpfrBigNumComplex z, MpfrBigNumComplex zold, MpfrBigNumComplex zold2, int iterations, MpfrBigNumComplex c, MpfrBigNumComplex start, MpfrBigNumComplex c0, MpfrBigNum norm_squared, MpfrBigNumComplex pixel) {
return z.getAbsRe(temp1).compare(bound) >= 0 && z.getAbsIm(temp2).compare(bound) >= 0;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,11 @@ public boolean escaped(BigNumComplex z, BigNumComplex zold, BigNumComplex zold2,
return z.norm().compareBothPositive(bnbound) >= 0;
}

@Override
public boolean escaped(BigIntNumComplex z, BigIntNumComplex zold, BigIntNumComplex zold2, int iterations, BigIntNumComplex c, BigIntNumComplex start, BigIntNumComplex c0, BigIntNum norm_squared, BigIntNumComplex pixel) {
return z.norm().compare(binbound) >= 0;
}

@Override
public boolean escaped(MpfrBigNumComplex z, MpfrBigNumComplex zold, MpfrBigNumComplex zold2, int iterations, MpfrBigNumComplex c, MpfrBigNumComplex start, MpfrBigNumComplex c0, MpfrBigNum norm_squared, MpfrBigNumComplex pixel) {
return z.norm(temp1, temp2).compare(bound) >= 0;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,8 +51,15 @@ public FieldLinesBailoutCondition(double bound) {
@Override
public boolean escaped(Complex z, Complex zold, Complex zold2, int iterations, Complex c, Complex start, Complex c0, double norm_squared, Complex pixel) {

return iterations > 1 && z.getRe() / zold.getRe() >= bound && z.getIm() / zold.getIm() >= bound;

if(iterations > 1) {

if(zold.getRe() == 0 || zold.getIm() == 0) {
return false;
}

return z.getRe() / zold.getRe() >= bound && z.getIm() / zold.getIm() >= bound;
}
return false;
}

@Override
Expand All @@ -75,12 +82,30 @@ public boolean escaped(BigNumComplex z, BigNumComplex zold, BigNumComplex zold2,
if(iterations > 1) {
Complex temp = z.toComplex();
Complex temp2 = zold.toComplex();

if(temp2.getRe() == 0 || temp2.getIm() == 0) {
return false;
}

return temp.getRe() / temp2.getRe() >= bound && temp.getIm() / temp2.getIm() >= bound;
}
return false;

}

@Override
public boolean escaped(BigIntNumComplex z, BigIntNumComplex zold, BigIntNumComplex zold2, int iterations, BigIntNumComplex c, BigIntNumComplex start, BigIntNumComplex c0, BigIntNum norm_squared, BigIntNumComplex pixel) {
BigIntNum zoldRe = zold.getRe();
BigIntNum zoldIm = zold.getIm();

if(iterations > 1 && (zoldRe.isZero() || zoldIm.isZero())) {
return false;
}

return iterations > 1 && z.getRe().divide(zoldRe).compare(binbound) >= 0 && z.getIm().divide(zoldIm).compare(binbound) >= 0;

}

@Override
public boolean escaped(MpfrBigNumComplex z, MpfrBigNumComplex zold, MpfrBigNumComplex zold2, int iterations, MpfrBigNumComplex c, MpfrBigNumComplex start, MpfrBigNumComplex c0, MpfrBigNum norm_squared, MpfrBigNumComplex pixel) {
MpfrBigNum zoldRe = zold.getRe();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,11 @@ public boolean escaped(BigNumComplex z, BigNumComplex zold, BigNumComplex zold2,
return z.getRe().compare(bnbound) >= 0;
}

@Override
public boolean escaped(BigIntNumComplex z, BigIntNumComplex zold, BigIntNumComplex zold2, int iterations, BigIntNumComplex c, BigIntNumComplex start, BigIntNumComplex c0, BigIntNum norm_squared, BigIntNumComplex pixel) {
return z.getRe().compare(binbound) >= 0;
}

@Override
public boolean escaped(MpfrBigNumComplex z, MpfrBigNumComplex zold, MpfrBigNumComplex zold2, int iterations, MpfrBigNumComplex c, MpfrBigNumComplex start, MpfrBigNumComplex c0, MpfrBigNum norm_squared, MpfrBigNumComplex pixel) {
return z.getRe().compare(bound) >= 0;
Expand Down
Loading

0 comments on commit bcc3e12

Please sign in to comment.