simon.snake
Fractal Bachius
Posts: 640
Experienced Fractal eXtreme plugin crasher!
|
|
« Reply #15 on: April 24, 2016, 05:28:38 PM » |
|
So, what do we call the new formula from Simon Snake, is "FT_Simon100A_plain" a good name?
We do need a new name for this formula. Suggestions welcome. I thought of WIFIbrot, but that's only really describing one small part of the image (there are different looking areas towards the bottom middle for example). I'm not all that imaginative (hence my user name on here still containing the word Simon), so thinking caps at the ready... Go! I started trying to look at all those algebraic equations and couldn't begin to understand them, so I'm mightily glad there are those out there who do. Thanks. Simon
|
|
« Last Edit: April 24, 2016, 05:55:04 PM by simon.snake »
|
Logged
|
To anyone viewing my posts and finding missing/broken links to a website called www.needanother.co.uk, I still own the domain but recently cancelled my server (saving £30/month) so even though the domain address exists, it points nowhere. I hope to one day sort something out but for now - sorry!
|
|
|
simon.snake
Fractal Bachius
Posts: 640
Experienced Fractal eXtreme plugin crasher!
|
|
« Reply #16 on: April 24, 2016, 05:53:40 PM » |
|
I have eliminated the second pair of zrsqr and zisqr defines, because zrsqr and zisqr are not used in the top half of the equation.
I'm still quite a newbie at this but I recall the reason there has to be two sets of the equations is to optimise slightly. The bottom ones are calculated just before returning to the for loop so the bailout can be performed at the right time with correct values. In my case and also in the standard Mandelbrot, the top ones are used to assist when squaring Z so as to avoid creating additional temporary variables. I do feel my code for Fractal eXtreme could have been optimised further to avoid creating expensive temporaries (especially when the high precision code is being called), just not the way you suggest.
|
|
|
Logged
|
To anyone viewing my posts and finding missing/broken links to a website called www.needanother.co.uk, I still own the domain but recently cancelled my server (saving £30/month) so even though the domain address exists, it points nowhere. I hope to one day sort something out but for now - sorry!
|
|
|
Kalles Fraktaler
|
|
« Reply #17 on: April 24, 2016, 07:12:26 PM » |
|
I thought of WIFIbrot, but that's only really describing one small part of the image (there are different looking areas towards the bottom middle for example).
Indeed, it has seahorse valleys and and such! Do you have more formulas?
|
|
|
Logged
|
|
|
|
stardust4ever
Fractal Bachius
Posts: 513
|
|
« Reply #18 on: April 24, 2016, 08:08:01 PM » |
|
I can do any formula in perturbation as long as each term only contains one abs value. abs(a)*abs(a) is equal to abs(a*a) However for example "4th Celtic Real Quasi Heart" contains zi = 4 * abs(zr) * zi * abs(zrsqr - zisqr) + JuliaI; This is not the same as 4 * zi * abs(zr*zrsqr - zr*zisqr) + JuliaI so I don't know how to handle that. It should be. I would like to add that per the laws of mathematics, in dealing with real numbers, abs(x) is always positive. X^2 is always positive regardless of whether X is positive or negative. I'm not going to write a rigorous proof, but suffice to say that X^2 = |X|^2 = |x^2| for all real numbers. Also |X| * |Y| is always equal to |X * Y| for real numbers, again because both outputs will always be positive. I used two abs() commands in the quasi heart formula because it was easy to write. Zrsqr and Zisqr will always be positive no matter what because they are the square of a real number, however this is not the case for Zrsqr - Zisqr which can be positive or negative depending on which coefficient is bigger. So abs(Zrsqr - Zisqr) will have a different effect on each equation. 4.0 * abs(Zr) * Zi * abs(Zrsqr - Zisqr) should be identical to 4.0 * Zi * abs(Zr * (Zrsqr - Zisqr)) based on the distributive and associative properties of multiplication, and the identity |x| * |y| = |x * y| is always true because a rule states that the product of two positive real numbers is always positive. Unless something weird is going on in your code, these expression should be identical. Forgive me for not rearranging the equation to include a single abs() operation because it was easier for me to visually check my equations for typos or logic errors when each formula has terms laid out in the same order. If you feel one of my formulas is in error please let me know so I can check it.
|
|
« Last Edit: April 24, 2016, 08:15:01 PM by stardust4ever »
|
Logged
|
|
|
|
Kalles Fraktaler
|
|
« Reply #19 on: April 24, 2016, 08:13:47 PM » |
|
I would like to add that per the laws of mathematics, in dealing with real numbers, abs(x) is always positive. X^2 is always positive regardless of whether X is positive or negative. I'm not going to write a rigorous proof, but suffice to say that X^2 = |X|^2 = |x^2| for all real numbers.
Also |X| * |Y| is always equal to |X * Y| for real numbers, again because both outputs will always be positive. I used two abs() commands in the quasi heart formula because it was easy to write.
Zrsqr and Zisqr will always be positive no matter what because they are the square of a real number, however this is not the case for Zrsqr - Zisqr which can be positive or negative depending on which coefficient is bigger. So abs(Zrsqr - Zisqr) will have a different effect on each equation.
4.0 * abs(Zr) * Zi * abs(Zrsqr - Zisqr)
should be identical to
4.0 * Zi * abs(Zr * (Zrsqr - Zisqr))
based on the distributive and associative properties of multiplication, and the identity
|x| * |y| = |x * y|
is always true because a rule states that the product of two positive real numbers is always positive.
Unless something weird is going on in your code, these expression should be identical. Forgive me for not rearranging the equation to include a single abs() operation because it was easier for me to visually check my equations for typos or logic errors when each formula has terms laid out in the same order. If you feel one of my formulas is in error please let me know so I can check it.
I never attempted these formulas but yes, 4.0 * abs(Zr) * Zi * abs(Zrsqr - Zisqr) should be identical to 4.0 * Zi * abs(Zr * (Zrsqr - Zisqr)) So you are right
|
|
|
Logged
|
|
|
|
stardust4ever
Fractal Bachius
Posts: 513
|
|
« Reply #20 on: April 24, 2016, 08:29:52 PM » |
|
Sometimes unexplained consequences happen in software code that cannot be explained. For instance my "radiant" BS in the previous page, alternate version the 4th Mandelbrot BS formula created by subbing Zsqr for Z * abs(Z) in a "nested" powers resulted in "rays" emanating from the main brot because I placed the the Zsqr definition at the beginning of the code instead of the end. Copying these two code from beginning to end resulted in the same fractal without the ray artifacts. I attempted to duplicate this effect with the standard Mandelbrot and Burning Ship fractals for 2nd, 3rd, and 4th order by moving these two lines from end to beginning of the formula, with absolutely no percieved difference. Assuming all variables are zeroed out prior to the start of iteration, the results of placing Zsqr = Z * Z at the beinning or the end shouldn't matter, but it did have a dramatic effect for the alternate formula I discovered in trying to implement my own Snake brot. And Simon.Snake, the Snake brot you provided is indeed forth order even though it has twofold symmetry. In my quick two minute zoom movie I produced, I made my last fork in the path around 90 zooms and hit the minibrot at 120. A second order equation would have placed the mini around 180 zooms if my last fork was at 90.
|
|
|
Logged
|
|
|
|
Kalles Fraktaler
|
|
« Reply #21 on: April 24, 2016, 09:16:11 PM » |
|
Yes the snake-brot is 4th order. I see it clearly because to get smooth gradients with high-bailout, log(power) is used, and there bands are clearly visible for other values (If you see any bands in my movie, it's because the codec...)
|
|
|
Logged
|
|
|
|
simon.snake
Fractal Bachius
Posts: 640
Experienced Fractal eXtreme plugin crasher!
|
|
« Reply #22 on: April 24, 2016, 09:16:25 PM » |
|
Do you have more formulas?
Lots, but whether any of them are suitable candidates for conversion to Perturbation is another matter. I am happy to upload a FractInt formula database that I have been writing since time immemorial. Some are good, a lot are rubbish, some require mathematical operations such as cos, abs, sqrt etc. and some behave in strange ways or contain conditional branching to achieve different things. I play about, and don't often know the consequences of my trial and error approach. I'll upload it in a new thread, as it will be easier to find in the future.
|
|
|
Logged
|
To anyone viewing my posts and finding missing/broken links to a website called www.needanother.co.uk, I still own the domain but recently cancelled my server (saving £30/month) so even though the domain address exists, it points nowhere. I hope to one day sort something out but for now - sorry!
|
|
|
stardust4ever
Fractal Bachius
Posts: 513
|
|
« Reply #23 on: April 25, 2016, 12:01:42 AM » |
|
Lots, but whether any of them are suitable candidates for conversion to Perturbation is another matter. I am happy to upload a FractInt formula database that I have been writing since time immemorial. Some are good, a lot are rubbish, some require mathematical operations such as cos, abs, sqrt etc. and some behave in strange ways or contain conditional branching to achieve different things.
I play about, and don't often know the consequences of my trial and error approach.
I'll upload it in a new thread, as it will be easier to find in the future.
Anything involving irrational functions or long division probably would not be a good candidate. Long division in arbitrary precision is a pain or so I've heard. At least I know it's super annoying to do base ten longhand on paper. Irrational functions such as square roots, fractional powers, and trig functions require iteration to compute even at float precision so these would be a royal pain in the ass to do in arbitrary. Each iteration of said function would require many sub-iterations. I presume absolute value works nicely because it is possible to create separate cases in code if the operand is negative or positive, and adjust the formula acordingly.
|
|
|
Logged
|
|
|
|
stardust4ever
Fractal Bachius
Posts: 513
|
|
« Reply #24 on: April 25, 2016, 12:20:54 AM » |
|
Beat you to it by a few hours, LOL! So, what do we call the new formula from Simon Snake, is "FT_Simon100A_plain" a good name? Expanding this function, also to be used for calculating the high precision reference, gives: xn = y*y*abs(y*y)-4*y*abs(x*y)*x-x*x*abs(y*y)-y*y*abs(x*x)+x*x*abs(x*x) + x0; yn = - 2*x*y*abs(y*y)-2*y*y*abs(x*y)+2*x*x*abs(x*y)+2*x*y*abs(x*x) + y0; Adding perturbation, (reference+delta)-reference, gives: xn = (y+b)*(y+b)*abs((y+b)*(y+b))-4*(y+b)*abs((x+a)*(y+b))*(x+a)-(x+a)*(x+a)*abs((y+b)*(y+b))-(y+b)*(y+b)*abs((x+a)*(x+a))+(x+a)*(x+a)*abs((x+a)*(x+a)) - y*y*abs(y*y)+4*y*abs(x*y)*x+x*x*abs(y*y)+y*y*abs(x*x)-x*x*abs(x*x) + x0; yn = - 2*(x+a)*(y+b)*abs((y+b)*(y+b))-2*(y+b)*(y+b)*abs((x+a)*(y+b))+2*(x+a)*(x+a)*abs((x+a)*(y+b))+2*(x+a)*(y+b)*abs((x+a)*(x+a)) + 2*x*y*abs(y*y)+2*y*y*abs(x*y)-2*x*x*abs(x*y)-2*x*y*abs(x*x) + y0; Analyzing the first term, we have (reference+delta)=(y+b)*(y+b)*abs((y+b)*(y+b)) and reference=y*y*abs(y*y) Expand gives (y*y+2*b*y+b*b)*abs(y*y+2*b*y+b*b) - y*y*abs(y*y) Rearranging so that we can identify what's in laser-blaster's abs-method and what's the rest: y*y*abs(y*y+2*b*y+b*b) - y*y*abs(y*y) + (2*b*y+b*b)*abs(y*y+2*b*y+b*b) y*y is the ref for laser-blaster's abs-method and 2*b*y+b*b is the delta: y*y*lb_abs_db(y*y,2*b*y+b*b) + (2*b*y+b*b)*abs(y*y+2*b*y+b*b) Repeat for the next 8 terms, and you get: xn = y*y*lb_abs_db(y*y,2*b*y+b*b)-4*y*x*lb_abs_db(x*y,x*b+a*y+a*b)-x*x*lb_abs_db(y*y,2*b*y+b*b)-y*y*lb_abs_db(x*x,2*x*a+a*a)+x*x*lb_abs_db(x*x,2*x*a+a*a) + (2*b*y+b*b)*abs(y*y+2*b*y+b*b)-4*(y*a+b*x+b*a)*abs(x*y+x*b+a*y+a*b)-(2*x*a+a*a)*abs(y*y+2*b*y+b*b)-(2*b*y+b*b)*abs(x*x+2*x*a+a*a)+(2*x*a+a*a)*abs(x*x+2*x*a+a*a) + a0; yn = 2*x*x*lb_abs_db(x*y,x*b+a*y+a*b)+2*x*y*lb_abs_db(x*x,2*x*a+a*a)-2*x*y*lb_abs_db(y*y,2*b*y+b*b)-2*y*y*lb_abs_db(x*y,x*b+a*y+a*b) + 2*(2*x*a+a*a)*abs(x*y+x*b+a*y+a*b) +2*(x*b+a*y+a*b)*abs(x*x+2*x*a+a*a)-2*(x*b+a*y+a*b)*abs(y*y+2*b*y+b*b)-2*(2*b*y+b*b)*abs(x*y+x*b+a*y+a*b) + b0; And the result is stunning:
http://www.youtube.com/v/ENS4r4fdyKE&rel=1&fs=1&hd=1I finally read the full post. I was on a mobile device without flash capability when I made my first reply and missed the embedded video! Fractal forums needs to update their embed code to support HTML5... But seriously, this is awesome! Kalles, are you doing repetitious multiplies? Defining common terms such as x*x or y*y by creating variables like Xsqr and Ysqr so you only have to compute them once, and using the distributive property when possible as I did in my FX float codes would reduce render time by eliminating unnecessary calculations.
|
|
« Last Edit: April 25, 2016, 12:40:01 AM by stardust4ever »
|
Logged
|
|
|
|
panzerboy
Fractal Lover
Posts: 242
|
|
« Reply #25 on: April 25, 2016, 01:47:44 AM » |
|
... I've been waiting for Microsoft to release a new version of VS with 64-bit support included for free, and then I'll try again. ...
https://www.visualstudio.com/en-us/products/free-developer-offers-vs.aspxVisual Studio community is free and supports 64 bit. I haven't as yet tried to build a FX plugin with it so no promises.
|
|
|
Logged
|
|
|
|
Kalles Fraktaler
|
|
« Reply #26 on: April 25, 2016, 10:49:26 AM » |
|
I have uploaded a version 2.9.6 which includes simon.snake's wonderful formula
|
|
|
Logged
|
|
|
|
simon.snake
Fractal Bachius
Posts: 640
Experienced Fractal eXtreme plugin crasher!
|
|
« Reply #27 on: April 25, 2016, 05:13:35 PM » |
|
Visual Studio community is free and supports 64 bit. I haven't as yet tried to build a FX plugin with it so no promises.
I downloaded and installed VS Community 2015 yesterday, and when I attempt to load one of the solution files it says that the solution is Incompatible, and that "The Application is not Installed". I think I read somewhere that the Community 2015 will allow you to edit and build incompatible sources if you have the appropriate Visual Studio version installed, which means I am no further forward.
|
|
|
Logged
|
To anyone viewing my posts and finding missing/broken links to a website called www.needanother.co.uk, I still own the domain but recently cancelled my server (saving £30/month) so even though the domain address exists, it points nowhere. I hope to one day sort something out but for now - sorry!
|
|
|
simon.snake
Fractal Bachius
Posts: 640
Experienced Fractal eXtreme plugin crasher!
|
|
« Reply #28 on: April 25, 2016, 05:52:07 PM » |
|
I have uploaded a version 2.9.6 which includes simon.snake's wonderful formula I'm happily zooming in to somewhere magical right now, and it's so quick it is unbelievable. One thing I would like to ask is this: For those who understand the mathematics involved in my formula, could you attempt to explain in reasonably simple terms what is going on with the values, and, with regard to the fractal's properties, why it generates images that it does? I don't know why it looks the way it does, and can't fathom it out, but I'd love to learn something about it, however basic.
|
|
|
Logged
|
To anyone viewing my posts and finding missing/broken links to a website called www.needanother.co.uk, I still own the domain but recently cancelled my server (saving £30/month) so even though the domain address exists, it points nowhere. I hope to one day sort something out but for now - sorry!
|
|
|
TheRedshiftRider
|
|
« Reply #29 on: April 26, 2016, 01:26:48 PM » |
|
I think I found a similar formula: f(z)=(absre(z)*absim(z))^2+c
|
|
|
Logged
|
Motivation is like a salt, once it has been dissolved it can react with things it comes into contact with to form something interesting.
|
|
|
|