Title: A new 3d mandelbrot-like fractal
Post by: Tglad on December 10, 2009, 04:00:29 AM
Hi everyone. Here are some pictures of a quite unique type of 3d mandelbrot. They are based on an interesting property of the tetrahedron, that it can quadruple cover itself. It can fold into a tetrahedron with 1/4 the surface area. So, just as the 2d mandelbrot folds a circle into itself and squares the distance circularly, this shape folds a tetrahedron into itself and squares the distance tetrahedrally.
Title: Re: A new 3d mandelbrot-like fractal
Post by: David Makin on December 10, 2009, 01:46:42 PM
That's cool ! OK, you have me interested - any chance on telling us the formula ?
Title: Re: A new 3d mandelbrot-like fractal
Post by: kram1032 on December 10, 2009, 08:22:12 PM
Niiice :D
The Mandeltenna or something :)
Title: Re: A new 3d mandelbrot-like fractal
Post by: Tglad on December 11, 2009, 07:42:15 AM
The description is simpler than my code, first you fold your point onto itself like the video http://www.vimeo.com/8113730 (http://www.vimeo.com/8113730) Then if the distance was the radius of the tetrahedron that the point sat on, you square that radius... then add C.
I don't know a simple formula for the folding so the UF code manually maps triangles... so is more code than it should be. I'll try and simplify it down, before posting the code. Do you know how to do multi-dimensional arrays in UF? I guess they're not possible, bummer.
Title: Re: A new 3d mandelbrot-like fractal
Post by: lycium on December 11, 2009, 07:49:49 AM
Do you know how to do multi-dimensional arrays in UF? I guess they're not possible, bummer.
just do the additions and multiplications yourself; computer memory is 1d after all.
Title: Re: A new 3d mandelbrot-like fractal
Post by: David Makin on December 11, 2009, 02:02:51 PM
Do you know how to do multi-dimensional arrays in UF? I guess they're not possible, bummer.
just do the additions and multiplications yourself; computer memory is 1d after all. Yes UF does do, for example: float myArray[5, 6, 10] or float screenArray[#width+1, #height+1] However it only does it with fixed-size arrays, not with the newer dynamic arrays which are one-dimensional only and the dimensions for the fixed-size arrays must be known at compile time.
Title: Re: A new 3d mandelbrot-like fractal
Post by: Tglad on December 12, 2009, 12:21:53 AM
Thanks, here's the code: Vector class: class Vector(){ public: func Init(float xx, float yy, float zz) x = xx y = yy z = zz endfunc float func Dot(Vector other) return x*other.x + y*other.y + z*other.z endfunc func Divide(float f) x = x / f y = y / f z = z / f endfunc func Multiply(Vector a, float f) x = a.x * f y = a.y * f z = a.z * f endfunc func MultiplyEquals(float f) x = x * f y = y * f z = z * f endfunc func Normalise() float mag = sqrt(x*x + y * y + z*z) if mag>0 x = x / mag y = y / mag z = z / mag endif endfunc float func Magnitude() return sqrt(x*x + y*y + z*z) endfunc func Add(Vector a, Vector b) x = a.x + b.x y = a.y + b.y z = a.z + b.z endfunc func AddEquals(Vector a) x = x + a.x y = y + a.y z = z + a.z endfunc func Subtract(Vector a, Vector b) x = a.x - b.x y = a.y - b.y z = a.z - b.z endfunc func Cross(Vector a, Vector b) float _x = (a.y * b.z) - (a.z * b.y) float _y = (a.z * b.x) - (a.x * b.z) float _z = (a.x * b.y) - (a.y * b.x)
x = _x y = _y z = _z endfunc float x float y float z }
Initialisation: Vector corners[4] ; unit length tetrahedron corners corners[0] = new Vector() corners[1] = new Vector() corners[2] = new Vector() corners[3] = new Vector() corners[0].Init(0, 1, 0) corners[1].Init(0, -1/3, sqrt(8/9)) corners[2].Init(-sqrt(2/3), -1/3, -(1/3) * sqrt(2)) corners[3].Init(sqrt(2/3), -1/3, -(1/3) * sqrt(2)) Vector normals[4] Vector crosses[4,3] ; crosses[face index][corner index]. cross product of corners for inside-outside measures Vector C = new Vector() int triangles[4,3] ; triangles[face index, corner of face] triangles[0, 0] = 0 ; wish I knew how to do an initialiser list triangles[0, 1] = 1 triangles[0, 2] = 2 triangles[1, 0] = 0 triangles[1, 1] = 2 triangles[1, 2] = 3 triangles[2, 0] = 0 triangles[2, 1] = 3 triangles[2, 2] = 1 triangles[3, 0] = 2 triangles[3, 1] = 1 triangles[3, 2] = 3 ; for use later Vector point = new Vector() Vector corn0 = new Vector() Vector corn1 = new Vector() Vector corn2 = new Vector() Vector bary = new Vector() int it = 0 repeat normals[it] = new Vector() crosses[it, 0] = new Vector() crosses[it, 1] = new Vector() crosses[it, 2] = new Vector() Vector cr1 = new Vector() cr1.Subtract(corners[triangles[it, 2]], corners[triangles[it, 0]]) Vector cr2 = new Vector() cr2.Subtract(corners[triangles[it, 1]], corners[triangles[it, 0]])
normals[it].Cross(cr1, cr2) normals[it].Normalise() ; leave this divide out below for an alternative where face of tetrahedron has magnitude 1, rather than corners. Produces slightly different shape normals[it].Divide(normals[it].Dot(corners[triangles[it, 0]])) ; normal is not unit length so that a corner point gives dot of 1 crosses[it, 0].Cross(corners[triangles[it, 2]], corners[triangles[it, 1]]) crosses[it, 1].Cross(corners[triangles[it, 0]], corners[triangles[it, 2]]) crosses[it, 2].Cross(corners[triangles[it, 1]], corners[triangles[it, 0]]) until (it=it+1)>=4
int squareMap[4,4,3] ; squareMap[quadrant, face index, corner of quadrant] squareMap[0, 0, 0] = 0 squareMap[0, 0, 1] = 1 squareMap[0, 0, 2] = 2 squareMap[0, 1, 0] = 0 squareMap[0, 1, 1] = 2 squareMap[0, 1, 2] = 3 squareMap[0, 2, 0] = 0 squareMap[0, 2, 1] = 3 squareMap[0, 2, 2] = 1 squareMap[0, 3, 0] = 0 squareMap[0, 3, 1] = 3 squareMap[0, 3, 2] = 1
squareMap[1, 0, 0] = 1 squareMap[1, 0, 1] = 0 squareMap[1, 0, 2] = 3 squareMap[1, 1, 0] = 2 squareMap[1, 1, 1] = 0 squareMap[1, 1, 2] = 1 squareMap[1, 2, 0] = 3 squareMap[1, 2, 1] = 0 squareMap[1, 2, 2] = 2 squareMap[1, 3, 0] = 3 squareMap[1, 3, 1] = 0 squareMap[1, 3, 2] = 2
squareMap[2, 0, 0] = 2 squareMap[2, 0, 1] = 3 squareMap[2, 0, 2] = 0 squareMap[2, 1, 0] = 3 squareMap[2, 1, 1] = 1 squareMap[2, 1, 2] = 0 squareMap[2, 2, 0] = 1 squareMap[2, 2, 1] = 2 squareMap[2, 2, 2] = 0 squareMap[2, 3, 0] = 1 squareMap[2, 3, 1] = 2 squareMap[2, 3, 2] = 0
squareMap[3, 0, 0] = 1 squareMap[3, 0, 1] = 3 squareMap[3, 0, 2] = 2 squareMap[3, 1, 0] = 2 squareMap[3, 1, 1] = 1 squareMap[3, 1, 2] = 3 squareMap[3, 2, 0] = 3 squareMap[3, 2, 1] = 2 squareMap[3, 2, 2] = 1 squareMap[3, 3, 0] = 3 squareMap[3, 3, 1] = 2 squareMap[3, 3, 2] = 1
Inner loop: ; convert c and z to vectors, for convenience C.x = real(cri) C.y = imag(cri) C.z = cj point.x = real(zri) point.y = imag(zri) point.z = zj float magnitude = 1 int ij = 0 ; ij is just a unique name for the iterator over each tetrahedron face repeat magnitude = point.Dot(normals[ij]) ; normals isn't unit length so this gives radial magnitude in shape of tetrahedron if (magnitude > 0) ; on right side of triangle ; TDL super simple way to get barycentric coordinates of triangle bary.x = crosses[ij, 0].Dot(point) bary.y = crosses[ij, 1].Dot(point) bary.z = crosses[ij, 2].Dot(point) if (bary.x >= 0 && bary.y >= 0 && bary.z >= 0) ; correct face is found bary.Divide(bary.x+bary.y+bary.z) ; barycentrics sum to 1 int n = 0 if (bary.x >= 0.5) ; quadrant 0 n = 0 bary.x = bary.x - 0.5 elseif (bary.y >= 0.5) ; quadrant 1 n = 1 bary.y = bary.y - 0.5 elseif (bary.x + bary.y <= 0.5) ; quadrant 2 n = 2 else ; quadrant 3 (middle) n = 3 float baryz = 1 - (bary.x + bary.y) bary.y = 0.5 - bary.x bary.x = 0.5 - baryz endif ; Z^2 + c bary.x = bary.x * 2 ; double the size here bary.y = bary.y * 2 bary.z = 1 - (bary.x + bary.y) magnitude = magnitude*magnitude; corn0.Multiply(corners[squareMap[n, ij, 0]], bary.x) corn1.Multiply(corners[squareMap[n, ij, 1]], bary.y) corn2.Multiply(corners[squareMap[n, ij, 2]], bary.z) point.Add(corn0, corn1) point.AddEquals(corn2) point.MultiplyEquals(magnitude) point.AddEquals(C) ij=10 ; break out of loop since the face was found endif endif until (ij = ij+1)>=4 zri = point.x + flip(point.y) ; convert back to z zj = point.z
Title: Re: A new 3d mandelbrot-like fractal
Post by: David Makin on December 12, 2009, 12:58:54 AM
Many thanks for posting that, I'll be having a play with it as soon as I've managed to streamline my current WIP formula.
Title: Re: A new 3d mandelbrot-like fractal
Post by: Tglad on December 12, 2009, 01:53:13 AM
And lastly, if you make the following changes: remove: normals[it].Divide(normals[it].Dot(corners[triangles[it, 0]])) add: magnitude = point.Magnitude() after: if (point.Dot(normals[ij]) > 0) add: point.Normalise() after: point.AddEquals(corn2) Then you get this alien overlord :) It seems to be a valid inflation of the tetrahedron to a sphere. So it folds the sphere in a tetrahedron-like way. Not conformal but the amount of stretch is bounded, so quasi-conformal I think.
Title: Re: A new 3d mandelbrot-like fractal
Post by: kram1032 on December 13, 2009, 05:55:29 PM
I wonder what happens with the smooth part on the bottom over time... :)
Title: Re: A new 3d mandelbrot-like fractal
Post by: Tglad on December 15, 2009, 12:38:16 AM
The alien fractal above is probably about 2-quasi conformal, which means a small sphere will map to an ellipse with long radius no more than twice the short radius. In this measure it is better than the mandelbulb which is infinity-quasi conformal (unbounded stretch at the poles), but 2 is still quite stretched. But the bigger issue with this fractal is that the mapping isn't smooth. It is continuous but not infinitely differentiable. So an extension of this fractal is to make the mapping smoother (which will also make it more conformal). I don't know an analytic way, but here's a numeric way, just for the record: - Take 1000 points spaced systematically on a unit sphere, record the lengths to their neighbours - Map them all to the new sphere using the spherical tetrahedral mapping, double the recorded lengths - Iteratively shift each point-pair to constrain the lengths to the recorded lengths - Also constraint the points to remain on the unit sphere This will generate a table-lookup mapping, that can be interpolated to generate a fast, smooth version of the alien fractal. No idea if it would look better, but it would fill more criteria for a 3d mandelbrot.
Anyway, here's the power 3 version of the previous power 2 fractal
Title: Re: A new 3d mandelbrot-like fractal
Post by: Tglad on January 13, 2010, 04:25:10 AM
I implemented the routine described above, it iteratively changes the mapping towards a smoother and more conformal one. My my approximate measure, it takes the average eccentricity down from 1.9, to 1.5 where the 2d mandelbrot has eccentricity of 1. As you can see, the surface is a little rounder and there is almost no whipped-cream/taffy.
I then noticed that this was actually more like the tricorn of the 3d mandelbrot, and the base shouldn't be rotating 180 degrees. The unrotated shape in fascinating enough in itself that I'll post it in a separate topic.
Title: Re: A new 3d mandelbrot-like fractal
Post by: David Makin on January 13, 2010, 12:46:02 PM
Anyway, here's the power 3 version of the previous power 2 fractal
Can we see say the power 8 version of this one please ?
Title: Re: A new 3d mandelbrot-like fractal
Post by: Tglad on January 14, 2010, 02:01:30 AM
Sure. The second one is power 8 from the tetrahedral mapping in my other post. I don't see the point of using power 8 myself, it doesn't make the mapping less stretched overall
Title: Re: A new 3d mandelbrot-like fractal
Post by: David Makin on January 14, 2010, 02:18:20 AM
Sure. The second one is power 8 from the tetrahedral mapping in my other post. I don't see the point of using power 8 myself, it doesn't make the mapping less stretched overall
I know but since most folks seem to find the power 8 Mandelbulb more aesthetically pleasing than the power 2 I wondered if the same would be true of the tetrahdral mapping version - I think the answer is probably yes but not by quite as great a margin :)
Title: Re: A new 3d mandelbrot-like fractal
Post by: kram1032 on January 14, 2010, 08:16:46 PM
in that case, the first pic looks better :)
Title: Re: A new 3d mandelbrot-like fractal
Post by: Tglad on January 16, 2010, 04:32:40 AM
Here's the code. Use the basic vector class given earlier in this thread. This defines the tetrahedron axes and the mapping lookup table: Vector corners[4] corners[0] = new Vector() corners[1] = new Vector() corners[2] = new Vector() corners[3] = new Vector() corners[0].Init(0, 1, 0) corners[1].Init(0, -1/3, sqrt(8/9)) corners[2].Init(-sqrt(2/3), -1/3, -(1/3) * sqrt(2)) corners[3].Init(sqrt(2/3), -1/3, -(1/3) * sqrt(2)) Vector normals[4] Vector crosses[4*3] Vector C = new Vector() Vector temp1 = new Vector() Vector temp2 = new Vector() int triangles[4,3] triangles[0 , 0] = 0 triangles[0 , 1] = 1 triangles[0 , 2] = 2 triangles[1 , 0] = 2 triangles[1 , 1] = 3 triangles[1 , 2] = 0 triangles[2 , 0] = 1 triangles[2 , 1] = 0 triangles[2 , 2] = 3 triangles[3 , 0] = 3 triangles[3 , 1] = 2 triangles[3 , 2] = 1 Vector posit = new Vector() Vector bary = new Vector() int it = 0 repeat normals[it] = new Vector() crosses[it*3 + 0] = new Vector() crosses[it*3 + 1] = new Vector() crosses[it*3 + 2] = new Vector() Vector cr1 = new Vector() cr1.Subtract(corners[triangles[it, 2]], corners[triangles[it, 0]]) Vector cr2 = new Vector() cr2.Subtract(corners[triangles[it, 1]], corners[triangles[it, 0]])
normals[it].Cross(cr1, cr2) normals[it].Normalise() crosses[it*3 + 0].Cross(corners[triangles[it, 2]], corners[triangles[it, 1]]) crosses[it*3 + 1].Cross(corners[triangles[it, 0]], corners[triangles[it, 2]]) crosses[it*3 + 2].Cross(corners[triangles[it, 1]], corners[triangles[it, 0]]) until (it=it+1)>=4 int maxI = 29 int maxJ = 29 Vector point[29, 29] it = 0 repeat int it2 = 0 repeat point[it, it2] = new Vector() until (it2=it2+1)>=maxJ until (it=it+1)>=maxI point[0, 0].Init(-0.000000, 1.000000, -0.000000) point[0, 1].Init(0.000000, 0.998399, 0.056569) point[0, 2].Init(0.000000, 0.991307, 0.131572) point[0, 3].Init(0.000000, 0.973080, 0.230469) point[0, 4].Init(0.000000, 0.936487, 0.350702) point[0, 5].Init(0.000000, 0.874871, 0.484356) point[0, 6].Init(0.000000, 0.784014, 0.620742) point[0, 7].Init(0.000000, 0.664315, 0.747452) point[0, 8].Init(0.000000, 0.521831, 0.853049) point[0, 9].Init(0.000000, 0.367160, 0.930158) point[0, 10].Init(-0.000000, 0.211831, 0.977306) point[0, 11].Init(-0.000000, 0.069162, 0.997605) point[0, 12].Init(0.000000, -0.054627, 0.998507) point[0, 13].Init(-0.000000, -0.154932, 0.987925) point[0, 14].Init(0.000000, -0.221023, 0.975269) point[0, 15].Init(-0.000000, -0.154932, 0.987925) point[0, 16].Init(0.000000, -0.054627, 0.998507) point[0, 17].Init(-0.000000, 0.069162, 0.997605) point[0, 18].Init(-0.000000, 0.211831, 0.977306) point[0, 19].Init(0.000000, 0.367160, 0.930158) point[0, 20].Init(0.000000, 0.521831, 0.853049) point[0, 21].Init(0.000000, 0.664315, 0.747452) point[0, 22].Init(0.000000, 0.784014, 0.620742) point[0, 23].Init(0.000000, 0.874871, 0.484356) point[0, 24].Init(0.000000, 0.936487, 0.350702) point[0, 25].Init(0.000000, 0.973080, 0.230469) point[0, 26].Init(0.000000, 0.991307, 0.131572) point[0, 27].Init(0.000000, 0.998399, 0.056569) point[0, 28].Init(0.000000, 1.000000, -0.000000) point[1, 0].Init(-0.048990, 0.998399, -0.028285) point[1, 1].Init(-0.077757, 0.995961, 0.044893) point[1, 2].Init(-0.101182, 0.985334, 0.137398) point[1, 3].Init(-0.121577, 0.960448, 0.250516) point[1, 4].Init(-0.139000, 0.914261, 0.380533) point[1, 5].Init(-0.152516, 0.840842, 0.519349) point[1, 6].Init(-0.160861, 0.737644, 0.655747) point[1, 7].Init(-0.162931, 0.607311, 0.777577) point[1, 8].Init(-0.158176, 0.457943, 0.874796) point[1, 9].Init(-0.146728, 0.301378, 0.942148) point[1, 10].Init(-0.128930, 0.149402, 0.980335) point[1, 11].Init(-0.106630, 0.010238, 0.994246) point[1, 12].Init(-0.082096, -0.111885, 0.990324) point[1, 13].Init(-0.066067, -0.220480, 0.973151) point[1, 14].Init(0.048105, -0.229677, 0.972077) point[1, 15].Init(0.081081, -0.115864, 0.989950) point[1, 16].Init(0.106321, 0.009009, 0.994291) point[1, 17].Init(0.128888, 0.148895, 0.980417) point[1, 18].Init(0.146778, 0.301067, 0.942239) point[1, 19].Init(0.158272, 0.457703, 0.874905) point[1, 20].Init(0.163071, 0.607129, 0.777690) point[1, 21].Init(0.161030, 0.737515, 0.655851) point[1, 22].Init(0.152693, 0.840759, 0.519431) point[1, 23].Init(0.139166, 0.914213, 0.380589) point[1, 24].Init(0.121719, 0.960423, 0.250546) point[1, 25].Init(0.101292, 0.985322, 0.137405) point[1, 26].Init(0.077824, 0.995956, 0.044883) point[1, 27].Init(0.049018, 0.998397, -0.028300) point[2, 0].Init(-0.113945, 0.991307, -0.065786) point[2, 1].Init(-0.169581, 0.985334, 0.018928) point[2, 2].Init(-0.216753, 0.968172, 0.125143) point[2, 3].Init(-0.257142, 0.933392, 0.250315) point[2, 4].Init(-0.290242, 0.874377, 0.388876) point[2, 5].Init(-0.314221, 0.786440, 0.531768) point[2, 6].Init(-0.326869, 0.668951, 0.667579) point[2, 7].Init(-0.326477, 0.526592, 0.784929) point[2, 8].Init(-0.312500, 0.368931, 0.875348) point[2, 9].Init(-0.284659, 0.207071, 0.935997) point[2, 10].Init(-0.243821, 0.051782, 0.968437) point[2, 11].Init(-0.191975, -0.091384, 0.977136) point[2, 12].Init(-0.128816, -0.221749, 0.966558) point[2, 13].Init(-0.001597, -0.288439, 0.957497) point[2, 14].Init(0.124471, -0.220867, 0.967329) point[2, 15].Init(0.191008, -0.092266, 0.977243) point[2, 16].Init(0.243511, 0.051053, 0.968554) point[2, 17].Init(0.284651, 0.206488, 0.936129) point[2, 18].Init(0.312633, 0.368441, 0.875507) point[2, 19].Init(0.326696, 0.526189, 0.785108) point[2, 20].Init(0.327156, 0.668643, 0.667746) point[2, 21].Init(0.314537, 0.786221, 0.531905) point[2, 22].Init(0.290551, 0.874232, 0.388972) point[2, 23].Init(0.257415, 0.933302, 0.250368) point[2, 24].Init(0.216974, 0.968121, 0.125154) point[2, 25].Init(0.169738, 0.985308, 0.018903) point[2, 26].Init(0.114030, 0.991294, -0.065835) point[3, 0].Init(-0.199591, 0.973080, -0.115234) point[3, 1].Init(-0.277741, 0.960448, -0.019968) point[3, 2].Init(-0.345350, 0.933392, 0.097534) point[3, 3].Init(-0.402506, 0.885430, 0.232387) point[3, 4].Init(-0.447531, 0.810735, 0.377392) point[3, 5].Init(-0.477655, 0.706116, 0.522729) point[3, 6].Init(-0.489974, 0.572725, 0.657199) point[3, 7].Init(-0.482391, 0.416697, 0.770495) point[3, 8].Init(-0.453515, 0.247765, 0.856117) point[3, 9].Init(-0.402304, 0.076831, 0.912277) point[3, 10].Init(-0.328549, -0.085346, 0.940623) point[3, 11].Init(-0.230617, -0.231357, 0.945140) point[3, 12].Init(-0.088550, -0.334680, 0.938162) point[3, 13].Init(0.087116, -0.334182, 0.938474) point[3, 14].Init(0.229077, -0.231382, 0.945509) point[3, 15].Init(0.328016, -0.085969, 0.940752) point[3, 16].Init(0.402177, 0.076119, 0.912392) point[3, 17].Init(0.453616, 0.247069, 0.856265) point[3, 18].Init(0.482611, 0.416056, 0.770704) point[3, 19].Init(0.490318, 0.572216, 0.657386) point[3, 20].Init(0.478058, 0.705730, 0.522882) point[3, 21].Init(0.447940, 0.810459, 0.377498) point[3, 22].Init(0.402881, 0.885244, 0.232444) point[3, 23].Init(0.345663, 0.933275, 0.097542) point[3, 24].Init(0.277975, 0.960380, -0.020008) point[3, 25].Init(0.199737, 0.973040, -0.115318) point[4, 0].Init(-0.303716, 0.936487, -0.175351) point[4, 1].Init(-0.399051, 0.914262, -0.069889) point[4, 2].Init(-0.481897, 0.874377, 0.056920) point[4, 3].Init(-0.550596, 0.810735, 0.198878) point[4, 4].Init(-0.602318, 0.718530, 0.347748) point[4, 5].Init(-0.633502, 0.595954, 0.493471) point[4, 6].Init(-0.640569, 0.445452, 0.625495) point[4, 7].Init(-0.620500, 0.273958, 0.734798) point[4, 8].Init(-0.569830, 0.091241, 0.816682) point[4, 9].Init(-0.485719, -0.090167, 0.869452) point[4, 10].Init(-0.365861, -0.256071, 0.894748) point[4, 11].Init(-0.203237, -0.385654, 0.899981) point[4, 12].Init(-0.000300, -0.437949, 0.899000) point[4, 13].Init(0.202491, -0.385591, 0.900176) point[4, 14].Init(0.365252, -0.256439, 0.894891) point[4, 15].Init(0.485484, -0.090864, 0.869511) point[4, 16].Init(0.569854, 0.090435, 0.816755) point[4, 17].Init(0.620699, 0.273168, 0.734923) point[4, 18].Init(0.640900, 0.444764, 0.625645) point[4, 19].Init(0.633928, 0.595400, 0.493594) point[4, 20].Init(0.602771, 0.718110, 0.347830) point[4, 21].Init(0.551025, 0.810434, 0.198915) point[4, 22].Init(0.482266, 0.874174, 0.056913) point[4, 23].Init(0.399335, 0.914133, -0.069943) point[4, 24].Init(0.303899, 0.936408, -0.175456) point[5, 0].Init(-0.419463, 0.874872, -0.242177) point[5, 1].Init(-0.526027, 0.840843, -0.127591) point[5, 2].Init(-0.617635, 0.786440, 0.006240) point[5, 3].Init(-0.691524, 0.706116, 0.152297) point[5, 4].Init(-0.744110, 0.595954, 0.301893) point[5, 5].Init(-0.771151, 0.455084, 0.445224) point[5, 6].Init(-0.767991, 0.286709, 0.572702) point[5, 7].Init(-0.729461, 0.098354, 0.676915) point[5, 8].Init(-0.649434, -0.098544, 0.754006) point[5, 9].Init(-0.522934, -0.287521, 0.802416) point[5, 10].Init(-0.346212, -0.445029, 0.825885) point[5, 11].Init(-0.122550, -0.539677, 0.832905) point[5, 12].Init(0.122220, -0.539710, 0.832932) point[5, 13].Init(0.345847, -0.445268, 0.825910) point[5, 14].Init(0.522664, -0.288091, 0.802388) point[5, 15].Init(0.649360, -0.099355, 0.753963) point[5, 16].Init(0.729563, 0.097471, 0.676933) point[5, 17].Init(0.768229, 0.285870, 0.572803) point[5, 18].Init(0.771529, 0.454389, 0.445280) point[5, 19].Init(0.744541, 0.595404, 0.301914) point[5, 20].Init(0.691949, 0.705702, 0.152288) point[5, 21].Init(0.618010, 0.786146, 0.006204) point[5, 22].Init(0.526322, 0.840647, -0.127659) point[5, 23].Init(0.419657, 0.874748, -0.242289) point[6, 0].Init(-0.537578, 0.784015, -0.310371) point[6, 1].Init(-0.648324, 0.737645, -0.188563) point[6, 2].Init(-0.741574, 0.668952, -0.050713) point[6, 3].Init(-0.814138, 0.572726, 0.095730) point[6, 4].Init(-0.861979, 0.445452, 0.242001) point[6, 5].Init(-0.879970, 0.286709, 0.378749) point[6, 6].Init(-0.861638, 0.100529, 0.497467) point[6, 7].Init(-0.798817, -0.104640, 0.592403) point[6, 8].Init(-0.682539, -0.313127, 0.660373) point[6, 9].Init(-0.506393, -0.500953, 0.701863) point[6, 10].Init(-0.272604, -0.636116, 0.721834) point[6, 11].Init(-0.000077, -0.686468, 0.727160) point[6, 12].Init(0.272440, -0.636268, 0.721761) point[6, 13].Init(0.506244, -0.501283, 0.701735) point[6, 14].Init(0.682408, -0.313805, 0.660186) point[6, 15].Init(0.798805, -0.105488, 0.592269) point[6, 16].Init(0.861747, 0.099653, 0.497454) point[6, 17].Init(0.880234, 0.285941, 0.378717) point[6, 18].Init(0.862324, 0.444818, 0.241939) point[6, 19].Init(0.814498, 0.572226, 0.095654) point[6, 20].Init(0.741902, 0.668582, -0.050791) point[6, 21].Init(0.648589, 0.737391, -0.188645) point[6, 22].Init(0.537754, 0.783854, -0.310472) point[7, 0].Init(-0.647312, 0.664316, -0.373726) point[7, 1].Init(-0.754867, 0.607312, -0.247687) point[7, 2].Init(-0.843007, 0.526592, -0.109727) point[7, 3].Init(-0.908463, 0.416698, 0.032515) point[7, 4].Init(-0.946603, 0.273958, 0.169970) point[7, 5].Init(-0.950956, 0.098354, 0.293275) point[7, 6].Init(-0.912445, -0.104640, 0.395595) point[7, 7].Init(-0.819593, -0.323040, 0.473193) point[7, 8].Init(-0.661696, -0.535180, 0.525110) point[7, 9].Init(-0.435267, -0.709238, 0.554549) point[7, 10].Init(-0.152616, -0.809504, 0.566932) point[7, 11].Init(0.152586, -0.809563, 0.566856) point[7, 12].Init(0.435255, -0.709380, 0.554376) point[7, 13].Init(0.661579, -0.535610, 0.524819) point[7, 14].Init(0.819503, -0.323692, 0.472903) point[7, 15].Init(0.912447, -0.105390, 0.395390) point[7, 16].Init(0.951061, 0.097601, 0.293185) point[7, 17].Init(0.946815, 0.273308, 0.169835) point[7, 18].Init(0.908716, 0.416158, 0.032363) point[7, 19].Init(0.843248, 0.526179, -0.109856) point[7, 20].Init(0.755067, 0.607024, -0.247783) point[7, 21].Init(0.647448, 0.664140, -0.373804) point[8, 0].Init(-0.738762, 0.521831, -0.426524) point[8, 1].Init(-0.836684, 0.457943, -0.300414) point[8, 2].Init(-0.914323, 0.368932, -0.167040) point[8, 3].Init(-0.968176, 0.247766, -0.035302) point[8, 4].Init(-0.992182, 0.091242, 0.085147) point[8, 5].Init(-0.977705, -0.098544, 0.185424) point[8, 6].Init(-0.913169, -0.313127, 0.260911) point[8, 7].Init(-0.785606, -0.535180, 0.310491) point[8, 8].Init(-0.585341, -0.736999, 0.337947) point[8, 9].Init(-0.315308, -0.882042, 0.350118) point[8, 10].Init(0.000045, -0.935572, 0.353135) point[8, 11].Init(0.315390, -0.882082, 0.349943) point[8, 12].Init(0.585407, -0.737070, 0.337677) point[8, 13].Init(0.785540, -0.535487, 0.310128) point[8, 14].Init(0.913106, -0.313592, 0.260572) point[8, 15].Init(0.977700, -0.099107, 0.185149) point[8, 16].Init(0.992251, 0.090659, 0.084959) point[8, 17].Init(0.968301, 0.247248, -0.035513) point[8, 18].Init(0.914461, 0.368511, -0.167213) point[8, 19].Init(0.836805, 0.457647, -0.300526) point[8, 20].Init(0.738849, 0.521667, -0.426574) point[9, 0].Init(-0.805540, 0.367161, -0.465079) point[9, 1].Init(-0.889287, 0.301379, -0.344004) point[9, 2].Init(-0.952927, 0.207072, -0.221476) point[9, 3].Init(-0.991207, 0.076832, -0.107732) point[9, 4].Init(-0.995827, -0.090166, -0.014079) point[9, 5].Init(-0.956380, -0.287521, 0.051667) point[9, 6].Init(-0.861028, -0.500953, 0.087619) point[9, 7].Init(-0.697887, -0.709238, 0.099678) point[9, 8].Init(-0.460866, -0.882042, 0.098006) point[9, 9].Init(-0.161821, -0.982388, 0.093427) point[9, 10].Init(0.162047, -0.982359, 0.093334) point[9, 11].Init(0.461036, -0.881979, 0.097774) point[9, 12].Init(0.698006, -0.709159, 0.099397) point[9, 13].Init(0.861036, -0.500998, 0.087281) point[9, 14].Init(0.956321, -0.287785, 0.051274) point[9, 15].Init(0.995786, -0.090561, -0.014434) point[9, 16].Init(0.991213, 0.076374, -0.108000) point[9, 17].Init(0.952965, 0.206655, -0.221701) point[9, 18].Init(0.889340, 0.301082, -0.344129) point[9, 19].Init(0.805587, 0.367023, -0.465106) point[10, 0].Init(-0.846372, 0.211831, -0.488653) point[10, 1].Init(-0.913459, 0.149404, -0.378511) point[10, 2].Init(-0.960602, 0.051784, -0.273062) point[10, 3].Init(-0.978879, -0.085344, -0.185777) point[10, 4].Init(-0.957805, -0.256070, -0.130526) point[10, 5].Init(-0.888344, -0.445029, -0.113112) point[10, 6].Init(-0.761429, -0.636116, -0.124834) point[10, 7].Init(-0.567286, -0.809504, -0.151297) point[10, 8].Init(-0.305802, -0.935572, -0.176606) point[10, 9].Init(0.000194, -0.982359, -0.187004) point[10, 10].Init(0.306124, -0.935441, -0.176741) point[10, 11].Init(0.567466, -0.809338, -0.151505) point[10, 12].Init(0.761468, -0.636016, -0.125098) point[10, 13].Init(0.888290, -0.445043, -0.113476) point[10, 14].Init(0.957698, -0.256225, -0.131012) point[10, 15].Init(0.978763, -0.085696, -0.186221) point[10, 16].Init(0.960540, 0.051325, -0.273364) point[10, 17].Init(0.913460, 0.149043, -0.378651) point[10, 18].Init(0.846395, 0.211710, -0.488666) point[11, 0].Init(-0.863952, 0.069161, -0.498803) point[11, 1].Init(-0.914357, 0.010245, -0.404778) point[11, 2].Init(-0.942214, -0.091378, -0.322308) point[11, 3].Init(-0.933826, -0.231356, -0.272844) point[11, 4].Init(-0.881026, -0.385655, -0.273979) point[11, 5].Init(-0.782592, -0.539677, -0.310320) point[11, 6].Init(-0.629778, -0.686468, -0.363513) point[11, 7].Init(-0.414619, -0.809563, -0.415571) point[11, 8].Init(-0.145365, -0.882082, -0.448107) point[11, 9].Init(0.145843, -0.881978, -0.448156) point[11, 10].Init(0.414940, -0.809338, -0.415688) point[11, 11].Init(0.629891, -0.686282, -0.363668) point[11, 12].Init(0.782554, -0.539604, -0.310543) point[11, 13].Init(0.880901, -0.385631, -0.274413) point[11, 14].Init(0.933568, -0.231458, -0.273640) point[11, 15].Init(0.941981, -0.091937, -0.322831) point[11, 16].Init(0.914279, 0.009573, -0.404973) point[11, 17].Init(0.863955, 0.069105, -0.498805) point[12, 0].Init(-0.864732, -0.054634, -0.499253) point[12, 1].Init(-0.898697, -0.111854, -0.424066) point[12, 2].Init(-0.901480, -0.221739, -0.371707) point[12, 3].Init(-0.856750, -0.334681, -0.392387) point[12, 4].Init(-0.778709, -0.437948, -0.449238) point[12, 5].Init(-0.660232, -0.539709, -0.522310) point[12, 6].Init(-0.488845, -0.636267, -0.596820) point[12, 7].Init(-0.262477, -0.709380, -0.654130) point[12, 8].Init(0.000266, -0.737070, -0.675816) point[12, 9].Init(0.262923, -0.709159, -0.654190) point[12, 10].Init(0.489072, -0.636016, -0.596902) point[12, 11].Init(0.660215, -0.539604, -0.522440) point[12, 12].Init(0.778523, -0.438029, -0.449480) point[12, 13].Init(0.856453, -0.334649, -0.393062) point[12, 14].Init(0.900716, -0.221830, -0.373500) point[12, 15].Init(0.898368, -0.113855, -0.424231) point[12, 16].Init(0.864736, -0.054543, -0.499256) point[13, 0].Init(-0.855563, -0.154968, -0.493960) point[13, 1].Init(-0.875864, -0.220360, -0.429305) point[13, 2].Init(-0.830026, -0.288446, -0.477343) point[13, 3].Init(-0.769190, -0.334177, -0.544676) point[13, 4].Init(-0.678333, -0.385589, -0.625448) point[13, 5].Init(-0.542338, -0.445267, -0.712465) point[13, 6].Init(-0.354600, -0.501283, -0.789287) point[13, 7].Init(-0.123718, -0.535610, -0.835354) point[13, 8].Init(0.124191, -0.535487, -0.835362) point[13, 9].Init(0.354930, -0.500998, -0.789320) point[13, 10].Init(0.542418, -0.445043, -0.712544) point[13, 11].Init(0.678100, -0.385631, -0.625676) point[13, 12].Init(0.768629, -0.334649, -0.545179) point[13, 13].Init(0.829208, -0.288478, -0.478743) point[13, 14].Init(0.871422, -0.225189, -0.435790) point[13, 15].Init(0.855668, -0.154194, -0.494020) point[14, 0].Init(-0.844553, -0.221298, -0.487603) point[14, 1].Init(-0.817868, -0.229784, -0.527534) point[14, 2].Init(-0.775523, -0.220851, -0.591430) point[14, 3].Init(-0.704305, -0.231379, -0.671132) point[14, 4].Init(-0.592376, -0.256438, -0.763760) point[14, 5].Init(-0.433558, -0.288090, -0.853833) point[14, 6].Init(-0.230535, -0.313804, -0.921076) point[14, 7].Init(0.000205, -0.323692, -0.946162) point[14, 8].Init(0.230890, -0.313592, -0.921059) point[14, 9].Init(0.433756, -0.287785, -0.853836) point[14, 10].Init(0.592309, -0.256224, -0.763884) point[14, 11].Init(0.703763, -0.231457, -0.671673) point[14, 12].Init(0.773820, -0.221830, -0.593291) point[14, 13].Init(0.813119, -0.225191, -0.536775) point[14, 14].Init(0.845695, -0.215405, -0.488262) point[15, 0].Init(-0.855563, -0.154968, -0.493960) point[15, 1].Init(-0.816788, -0.115904, -0.565176) point[15, 2].Init(-0.750819, -0.092270, -0.654031) point[15, 3].Init(-0.650711, -0.085970, -0.754443) point[15, 4].Init(-0.510279, -0.090864, -0.855195) point[15, 5].Init(-0.328273, -0.099355, -0.939343) point[15, 6].Init(-0.113518, -0.105488, -0.987920) point[15, 7].Init(0.113805, -0.105390, -0.987897) point[15, 8].Init(0.328506, -0.099107, -0.939288) point[15, 9].Init(0.510393, -0.090560, -0.855159) point[15, 10].Init(0.650654, -0.085696, -0.754523) point[15, 11].Init(0.750570, -0.091937, -0.654364) point[15, 12].Init(0.816579, -0.113855, -0.565894) point[15, 13].Init(0.855668, -0.154194, -0.494020) point[16, 0].Init(-0.864732, -0.054634, -0.499253) point[16, 1].Init(-0.807923, 0.008998, -0.589219) point[16, 2].Init(-0.717039, 0.051050, -0.695161) point[16, 3].Init(-0.589068, 0.076118, -0.804491) point[16, 4].Init(-0.422404, 0.090435, -0.901885) point[16, 5].Init(-0.221460, 0.097471, -0.970286) point[16, 6].Init(0.000065, 0.099653, -0.995022) point[16, 7].Init(0.221624, 0.097601, -0.970235) point[16, 8].Init(0.422549, 0.090659, -0.901794) point[16, 9].Init(0.589138, 0.076374, -0.804415) point[16, 10].Init(0.717010, 0.051325, -0.695170) point[16, 11].Init(0.807856, 0.009573, -0.589302) point[16, 12].Init(0.864736, -0.054543, -0.499256) point[17, 0].Init(-0.863952, 0.069161, -0.498803) point[17, 1].Init(-0.784623, 0.148892, -0.601829) point[17, 2].Init(-0.668387, 0.206487, -0.714578) point[17, 3].Init(-0.514740, 0.247069, -0.820975) point[17, 4].Init(-0.326114, 0.273168, -0.905002) point[17, 5].Init(-0.111948, 0.285870, -0.951707) point[17, 6].Init(0.112138, 0.285941, -0.951663) point[17, 7].Init(0.326326, 0.273308, -0.904883) point[17, 8].Init(0.514906, 0.247248, -0.820817) point[17, 9].Init(0.668481, 0.206655, -0.714441) point[17, 10].Init(0.784652, 0.149043, -0.601754) point[17, 11].Init(0.863955, 0.069105, -0.498805) point[18, 0].Init(-0.846372, 0.211831, -0.488653) point[18, 1].Init(-0.742614, 0.301067, -0.598233) point[18, 2].Init(-0.601895, 0.368441, -0.708501) point[18, 3].Init(-0.426144, 0.416056, -0.803305) point[18, 4].Init(-0.221374, 0.444763, -0.867859) point[18, 5].Init(0.000140, 0.454389, -0.890803) point[18, 6].Init(0.221637, 0.444818, -0.867764) point[18, 7].Init(0.426330, 0.416159, -0.803153) point[18, 8].Init(0.602041, 0.368511, -0.708340) point[18, 9].Init(0.742694, 0.301082, -0.598127) point[18, 10].Init(0.846395, 0.211710, -0.488666) point[19, 0].Init(-0.805540, 0.367161, -0.465079) point[19, 1].Init(-0.678553, 0.457703, -0.574520) point[19, 2].Init(-0.516575, 0.526189, -0.675482) point[19, 3].Init(-0.324154, 0.572217, -0.753321) point[19, 4].Init(-0.110501, 0.595400, -0.795794) point[19, 5].Init(0.110805, 0.595404, -0.795749) point[19, 6].Init(0.324411, 0.572226, -0.753203) point[19, 7].Init(0.516761, 0.526179, -0.675346) point[19, 8].Init(0.678666, 0.457647, -0.574432) point[19, 9].Init(0.805587, 0.367023, -0.465106) point[20, 0].Init(-0.738762, 0.521831, -0.426524) point[20, 1].Init(-0.591964, 0.607129, -0.530069) point[20, 2].Init(-0.414707, 0.668644, -0.617198) point[20, 3].Init(-0.213800, 0.705730, -0.675452) point[20, 4].Init(0.000156, 0.718110, -0.695930) point[20, 5].Init(0.214089, 0.705702, -0.675389) point[20, 6].Init(0.414938, 0.668582, -0.617110) point[20, 7].Init(0.592120, 0.607024, -0.530016) point[20, 8].Init(0.738849, 0.521667, -0.426574) point[21, 0].Init(-0.647312, 0.664316, -0.373726) point[21, 1].Init(-0.487468, 0.737516, -0.467381) point[21, 2].Init(-0.303375, 0.786221, -0.538350) point[21, 3].Init(-0.102953, 0.810460, -0.576677) point[21, 4].Init(0.103247, 0.810434, -0.576660) point[21, 5].Init(0.303633, 0.786146, -0.538314) point[21, 6].Init(0.487666, 0.737391, -0.467372) point[21, 7].Init(0.647448, 0.664140, -0.373804) point[22, 0].Init(-0.537578, 0.784015, -0.310371) point[22, 1].Init(-0.373494, 0.840760, -0.391951) point[22, 2].Init(-0.191583, 0.874232, -0.446110) point[22, 3].Init(0.000138, 0.885244, -0.465127) point[22, 4].Init(0.191845, 0.874174, -0.446111) point[22, 5].Init(0.373717, 0.840647, -0.391979) point[22, 6].Init(0.537754, 0.783854, -0.310472) point[23, 0].Init(-0.419463, 0.874872, -0.242177) point[23, 1].Init(-0.260017, 0.914213, -0.310815) point[23, 2].Init(-0.088117, 0.933302, -0.348112) point[23, 3].Init(0.088358, 0.933275, -0.348124) point[23, 4].Init(0.260239, 0.914133, -0.310862) point[23, 5].Init(0.419657, 0.874748, -0.242289) point[24, 0].Init(-0.303716, 0.936487, -0.175351) point[24, 1].Init(-0.156119, 0.960423, -0.230684) point[24, 2].Init(0.000101, 0.968121, -0.250482) point[24, 3].Init(0.156315, 0.960380, -0.230729) point[24, 4].Init(0.303899, 0.936408, -0.175456) point[25, 0].Init(-0.199591, 0.973080, -0.115234) point[25, 1].Init(-0.068350, 0.985322, -0.156424) point[25, 2].Init(0.068499, 0.985308, -0.156449) point[25, 3].Init(0.199737, 0.973040, -0.115318) point[26, 0].Init(-0.113945, 0.991307, -0.065786) point[26, 1].Init(0.000042, 0.995956, -0.089839) point[26, 2].Init(0.114030, 0.991294, -0.065835) point[27, 0].Init(-0.048990, 0.998399, -0.028285) point[27, 1].Init(0.049018, 0.998397, -0.028300) point[28, 0].Init(0.000000, 1.000000, -0.000000)
Here is the inner loop: float magnitude = 1 int ij = 0
posit.x = real(zri) ; convert z to vector for ease of use posit.y = imag(zri) posit.z = zj ij = 0 repeat magnitude = posit.Dot(normals[ij]) if (magnitude > 0) ; on wrong side of triangle magnitude = posit.Magnitude() ; super simple way to get barycentric coordinates of triangle bary.z = crosses[ij*3 + 0].Dot(posit) bary.y = crosses[ij*3 + 1].Dot(posit) bary.x = crosses[ij*3 + 2].Dot(posit) if (bary.x >= 0 && bary.y >= 0 && bary.z >= 0) bary.Divide(bary.x+bary.y+bary.z) ; now we use barycentric coordinates to do interpolated table lookup float il = bary.x*28 float jl = bary.y*28 int floorI = floor(il) int floorJ = floor(jl) float fi = il - floorI float fj = jl - floorJ if (fi + fj) < 1 posit.Multiply(point[floorI, floorJ], (1 - (fi + fj))) temp1.Multiply(point[floorI, floorJ+1], fj) temp2.Multiply(point[floorI+1, floorJ], fi) else posit.Multiply(point[floorI+1, floorJ+1], (1 - ((1-fi) + (1-fj)))) temp1.Multiply(point[floorI, floorJ+1], (1-fi)) temp2.Multiply(point[floorI+1, floorJ], (1-fj)) endif posit.AddEquals(temp1) posit.AddEquals(temp2)
; Z^2 + c magnitude = magnitude*magnitude posit.MultiplyEquals(magnitude) posit.AddEquals(C) ij=10 ; break endif endif until (ij = ij+1)>=4 zri = posit.x + flip(posit.y) zj = posit.z And to get this fractal: "http://www.fractalforums.com/3d-fractal-generation/a-new-tetrahedral-mandelbulb/?action=post;quote=11415;num_replies=4;sesc=aee003da38f141169bfe35f4f08fee04" just change the last two lines to: zri = -posit.x + flip(posit.y) zj = -posit.z It would be great to see some other people's renderings of these, or any tips on how I can improve the look of my renders using UltraFractal.
Title: Re: A new 3d mandelbrot-like fractal
Post by: kram1032 on January 16, 2010, 07:14:11 PM
puh, not surprising but that looks quite a bit more complex than the spherical version... :)
Title: Re: A new 3d mandelbrot-like fractal
Post by: Tglad on January 21, 2010, 12:59:59 AM
Yes, there is almost certainly no analytical function for the mapping so the inner loop is a table lookup. Would probably need a bezier-patch interpolation for more accurate zooms.
The latest mapping is very close to optimal for a spherical mapping, and strangely it results in the fractal here (http://www.fractalforums.com/3d-fractal-generation/a-new-tetrahedral-mandelbulb/?action=post;quote=11468;num_replies=7;sesc=3eb172cbad5c958d490380638fbf323b) and the alien fractal above becoming the same thing, so if you rotate the space 180 around y each iteration you get the same shape just upside-down. Spot the difference.
Using a more accurate measure for stretch (the post-mapping long length over short length) the average stretch of this mapping is 1.5. Mandelbrot is 1, mandelbulbs are infinity.
Title: Re: A new 3d mandelbrot-like fractal
Post by: kram1032 on March 06, 2010, 02:48:25 PM
I like that surface render however I wouldn't dare walking on a planet with that structure barefeeted, :)
Title: Re: A new 3d mandelbrot-like fractal
Post by: DarkBeam on February 12, 2015, 10:28:04 AM
I wonder if is anyone able to simplify the formula a bit? For example reduce or kill lookup table :D (Or even better simplify it a lot ... :D) It's too complicated to implement for me as is :embarrass:
Title: Re: A new 3d mandelbrot-like fractal
Post by: Tglad on February 13, 2015, 03:55:26 AM
There might be a function that does such a scaling of a sphere surface triangle... possibly a holomorphic one (a complex polynomial). But I don't know what it is, if it exists.
Title: Re: A new 3d mandelbrot-like fractal
Post by: DarkBeam on February 13, 2015, 10:15:00 AM
Okay sir but then I ask you, how did you find those numbers? Are they sines of some angle? Square roots? Randoms?
Why ... point[0, 19].Init(0.000000, 0.367160, 0.930158) and is there a relation with others?
Please be patient :)
Thanks a lot :)
Title: Re: A new 3d mandelbrot-like fractal
Post by: Tglad on February 13, 2015, 11:15:29 AM
I am folding a tetrahedron (which is projected onto a sphere) onto itself (on the surface of a sphere) as shown in the video on the first page. So each of the 4 triangles (on the sphere) expand into a larger triangle 4 times the area. Since I don't know a function that does that conformally, I wrote a program that meshes such a triangle, expands it and then tries to maintain the mesh shape... so something like what would happen if the triangle was made of rubber. The program spat out the transformed mesh vertices, which approximates the transform. The main goal of the transform is to keep the expanded shape as conformal as possible.
The bigger goal was to make a sphere to sphere folding that was as conformal as possible (given that a fully conformal one is impossible). One problem is that the results are inevitably non-smooth at the triangle boundaries... though still continuous.
Title: Re: A new 3d mandelbrot-like fractal
Post by: DarkBeam on February 13, 2015, 05:59:37 PM
Ok at least now it's more clear. Thanks again :)
Title: Re: A new 3d mandelbrot-like fractal
Post by: hgjf2 on February 14, 2015, 01:43:26 PM
More patience need. The new FRACTALFORUMS competition begin may 2015, not march 2015. :canadian: :laugh:
Title: Re: A new 3d mandelbrot-like fractal
Post by: DarkBeam on February 14, 2015, 03:55:08 PM
Uh, even a lifetime won't be enough since to hardcode a 2d array (of floats!) is way beyond my assembly knowledge :D maybe doable with some dirty tricks but ehh :P
Title: Re: A new 3d mandelbrot-like fractal
Post by: 1990winfractal on April 11, 2015, 02:55:55 AM
looks cool print it in on a 3d printer then wow
|