Hola, Fellow Phractophiles, There was a brief murmur of interest in triternions when Tim Wegner broached the subject on 12/9/02, which was about as much as the concept, then embryonic, warranted at the time. Its evolved some since then, and the Tsets now offer more opportunity for exploration; so I thought I put the latest formulas out there and see what happens next. TMan { c1=real(pixel),c2=imag(pixel),c3=p1 z1=z2=z3=0: t1=z1*z1+2*z2*z3 t2=z3*z3+2*z1*z2 t3=z2*z2+2*z3*z1 z1=t1+c1,z2=t2-c2*c2,z3=t3+c3 z=z1+z2+z3 |z| < 8 } There is, I believe, a rather nice rendition of this set on page 12 of http://fibonacci-arrays.com/Triternions.pdf The formula is a 2-D slice (in the X,Y plane) of a 3-D object at whatever value is chosen for p1. In appendix #2 of the paper, some variations are explored. Ive also noticed that sign changes may have nice effects. E.g., z1=-t1+c1,z2=t2+c2*c2,z3=t3+c3, t3=-z2*z2+2*z3*z1, and so forth. It seems a bit challenging to define a Julia set version of the TMan; Maybe someone can see a way to go with that. I'm looking forward, eventually, to seeing these objects in full-on 3-D. Ciao, Russell Russ Walsmith russw@lycos.com _____________________________________________________________ Get 25MB, POP3, Spam Filtering with LYCOS MAIL PLUS for $19.95/year. http://login.mail.lycos.com/brandPage.shtml?pageId=plus&ref=lmtplus
Russell Walsmith wrote:
TMan { c1=real(pixel),c2=imag(pixel),c3=p1 z1=z2=z3=0: t1=z1*z1+2*z2*z3 t2=z3*z3+2*z1*z2 t3=z2*z2+2*z3*z1 z1=t1+c1,z2=t2-c2*c2,z3=t3+c3 z=z1+z2+z3 |z| < 8 }
It seems a bit challenging to define a Julia set version of the TMan; Maybe someone can see a way to go with that. I'm looking forward, eventually, to seeing these objects in full-on 3-D.
I note that by allowing c3 to be complex, TMan is in fact four-dimensional, not three. While I don't understand the development behind TMan well enough to figure out what its Julia sets would look like (historically, the Julia sets came first, and then Mandelbrot came along several decades later to summarise them) the D3_Man set I gave on 2002-05-20: D3_Man { c1=real(pixel),c2=imag(pixel),c3=0 z1=z2=z3=0: nz1=z1*z1+z2*z3+z3*z2+c1 nz2=z1*z2+z2*z1+z3*z3+c2 nz3=z1*z3+z2*z2+z3*z1+c3 z1=nz1,z2=nz2,z3=nz3 z=nz1+flip(nz2) |z-pixel| < 100 } Has a straightforward Julia: D3_Jul { z1=real(pixel),z2=imag(pixel),z3=0 c1=real(p1),c2=imag(p1),c3=real(p2): nz1=z1*z1+z2*z3+z3*z2+c1 nz2=z1*z2+z2*z1+z3*z3+c2 nz3=z1*z3+z2*z2+z3*z1+c3 z1=nz1,z2=nz2,z3=nz3 z=nz1+flip(nz2) |z-pixel| < 100 } (The critical point is still at the origin.) I don't know why I used the bailout conditions I did: I wrote these things a long time ago, and didn't comment them. A more sensible bailout condition would be |z|+sqr(nz3) < 100. (I.e., bail out if the point gets at least 10 away from the origin in 3-space). As well as fudging the constant c (e.g., replacing c2 by -c2*c2) before it is used, slices parallel to the three coordinate planes can be found by permuting the initialisers, using some number other than 0, and/or using other components in the definition of z. More useful though would be a generalisation in which an arbitrary plane in 3-space can be specified which serves as the cutting plane through the M-Set/J-Sets. If Gerald K. Dobiasovsky could work his magic (hint, hint) on these numbers, we could have a two-dimensional projection of the entire three-dimensional set. Morgan L. Owens "Meanwhile, Canberra burns."
Morgan L. Owens wrote:
D3_Man { c1=real(pixel),c2=imag(pixel),c3=0 z1=z2=z3=0: nz1=z1*z1+z2*z3+z3*z2+c1 nz2=z1*z2+z2*z1+z3*z3+c2 nz3=z1*z3+z2*z2+z3*z1+c3 z1=nz1,z2=nz2,z3=nz3 z=nz1+flip(nz2) |z-pixel| < 100 }
Has a straightforward Julia:
D3_Jul { z1=real(pixel),z2=imag(pixel),z3=0 c1=real(p1),c2=imag(p1),c3=real(p2): nz1=z1*z1+z2*z3+z3*z2+c1 nz2=z1*z2+z2*z1+z3*z3+c2 nz3=z1*z3+z2*z2+z3*z1+c3 z1=nz1,z2=nz2,z3=nz3 z=nz1+flip(nz2) |z-pixel| < 100 }
[...]
If Gerald K. Dobiasovsky could work his magic (hint, hint) on these numbers, we could have a two-dimensional projection of the entire three-dimensional set.
Quite a career, I'd say, to be considered an expert on 3d-rendering in Fractint after posting a single par on that matter :-) Sadly D3_Man/Jul sets turn out to be cylinders with quadratic Mandelbrots/Julias as their cross-section. The 2d images look skewed because the cylinder's axis is not parallel to any coordinate axis. But teke a look yourself (Hint: It's enough to run these in a small view-window): ----------------------- Begin PAR ---------------------------- D3_Jul3d { reset=2002 type=formula formulafile=gkd.frm formulaname=Rot3d_D3_Jul corners=-1.64/1.64/-1.23/1.23 params=0/0/-1.5/1.5/-0.75/0/0/4/50/253 float=y maxiter=1000000000 outside=summ periodicity=0 colors=@altern.map } D3_Man3d { reset=2002 type=formula formulafile=gkd.frm formulaname=Rot3d_D3_Man corners=-2.102784/0.6012163/-1.25159/0.77641 params=0/0/-1/1/0/0/0/4/50/253 float=y maxiter=1000000000 outside=summ periodicity=0 colors=@altern.map } frm:Rot3d_D3_Jul {;periodicity=no, outside=summ ;maxit > p5real*(p5imag+1) ; ;p1real: Rotation about x-axis (1st rotation) ;p1imag: Rotation about y-axis (2nd rotation) ;p2real: Far clipping plane ;p2imag: Near clipping plane ;p3real: cx ;p3imag: cy ;p4real: cz ;p4imag: Bailout ;p5real: Maxiter per slice ;p5imag: Number of slices - 1 ; bailout = imag(p4), tiefnum = imag(p5) delta = (real(p2)-imag(p2))/tiefnum tmp = pi/180 rotXax = exp(flip(real(p1)*tmp)) rotYax = exp(flip(imag(p1)*tmp)) ; HPixXY = rotYax VPixZ = real(rotXax) VPixXY = flip(conj(rotYax)) NXY = VPixZ*VPixXY NZ = imag(conj(rotXax)) VPixXY = -NZ*VPixXY ; xy = xy0 = NXY*imag(p2) + HPixXY*real(pixel)\ + VPixXY*imag(pixel) zz = zz0 = NZ*imag(p2) + HPixZ*real(pixel)\ + VPixZ*imag(pixel) dxy = NXY*delta, dzz = NZ*delta j = m = i = 0: w1 = real(xy), w2 = imag(xy), w3 = zz xy = sqr(w1) + 2*w2*w3 xy = xy + flip(sqr(w3)+2*w1*w2) + p3 zz = sqr(w2) + 2*w1*w3 + real(p4) IF (bailout >= |xy|+sqr(zz)) i = i + 1 ELSE i = 0 m = m + 1 xy = xy0 = xy0 + dxy zz = zz0 = zz0 + dzz ENDIF z = m - j j = j + 1 tiefnum >= m && p5 >= i } frm:Rot3d_D3_Man {;periodicity=no, outside=summ ;maxit > p5real*(p5imag+1) ; ;p1real: Rotation about x-axis (1st rotation) ;p1imag: Rotation about y-axis (2nd rotation) ;p2real: Far clipping plane ;p2imag: Near clipping plane ;p3real: x(0) ;p3imag: y(0) ;p4real: z(0) ;p4imag: Bailout ;p5real: Maxiter per slice ;p5imag: Number of slices - 1 ; bailout = imag(p4), tiefnum = imag(p5) delta = (real(p2)-imag(p2))/tiefnum tmp = pi/180 rotXax = exp(flip(real(p1)*tmp)) rotYax = exp(flip(imag(p1)*tmp)) ; HPixXY = rotYax VPixZ = real(rotXax) VPixXY = flip(conj(rotYax)) NXY = VPixZ*VPixXY NZ = imag(conj(rotXax)) VPixXY = -NZ*VPixXY ; cxy = cxy0 = NXY*imag(p2) + HPixXY*real(pixel)\ + VPixXY*imag(pixel) cz = cz0 = NZ*imag(p2) + HPixZ*real(pixel)\ + VPixZ*imag(pixel) dcxy = NXY*delta, dcz = NZ*delta xy = p3, zz = real(p4) j = m = i = 0: w1 = real(xy), w2 = imag(xy), w3 = zz xy = sqr(w1) + 2*w2*w3 xy = xy + flip(sqr(w3)+2*w1*w2) + cxy zz = sqr(w2) + 2*w1*w3 + cz IF (bailout >= |xy|+sqr(zz)) i = i + 1 ELSE i = 0 m = m + 1 cxy = cxy0 = cxy0 + dcxy cz = cz0 = cz0 + dcz xy = p3, zz = real(p4) ENDIF z = m - j j = j + 1 tiefnum >= m && p5 >= i } ------------------------ End PAR ----------------------------- Regards, Gerald
Gerald K. Dobiasovsky wrote:
Quite a career, I'd say, to be considered an expert on 3d-rendering in Fractint after posting a single par on that matter :-)
Sadly D3_Man/Jul sets turn out to be cylinders with quadratic Mandelbrots/Julias as their cross-section. The 2d images look skewed because the cylinder's axis is not parallel to any coordinate axis.
I was half-and-half expecting this (no, I don't do medical ultrasounds, either); the skewness is visible in the 2d-slices, and since the quaternion mandelbrot is a hypersurface of rotation I kind of hypothesised. I'm just impressed how you can get from t1=z1*z1+2*z2*z3+c1 t2=z3*z3+2*z1*z2+c2 t3=z2*z2+2*z3*z1+c3 z1=t1 z2=t2 z3=t3 to
w1 = real(xy), w2 = imag(xy), w3 = zz xy = sqr(w1) + 2*w2*w3 xy = xy + flip(sqr(w3)+2*w1*w2) + p3 zz = sqr(w2) + 2*w1*w3 + real(p4)
without appearing to break into a sweat. I'm trying to reverse-engineer the process now. Lessee ... reals t1 and t2 are folded into the complex xy, with t3 going in zz; they're broken back out into w1..3 for the triternion quadratic map, and then it's back into xy and zz... and a 30W lightbulb goes on. Russ Walsmith's interpretation seems the more fecund (though I still say TMan and TJul need a little prophylactic code to stop them from spilling out into six dimensions - unless that's desirable); mainly from the line z=z1+z2+z3. Lessee, to convert Rot3d_D3_Man to Rot_TMan would entail adding (after the above section) the line zt = real(xy)+imag(xy)+zz ; transformed z and changing the bailout condition to check the magnitude of zt instead of xy/zz. Maybe fiddle the initialiser, too. Um ... ooh. Add the value of TMan's p3 parameter to cz and cz0? Morgan L. Owens "Dim, and with no discernable function."
Morgan L. Owens wrote:
I'm just impressed how you can get from
t1=z1*z1+2*z2*z3+c1 t2=z3*z3+2*z1*z2+c2 t3=z2*z2+2*z3*z1+c3 z1=t1 z2=t2 z3=t3
to
w1 = real(xy), w2 = imag(xy), w3 = zz xy = sqr(w1) + 2*w2*w3 xy = xy + flip(sqr(w3)+2*w1*w2) + p3 zz = sqr(w2) + 2*w1*w3 + real(p4)
without appearing to break into a sweat.
What you so courteously describe as a virtue is in fact a combination of lazyness, bad programming habits and Fractint parser "legacy code" (my first attempts to mimic Fractint's julibrot type where done without if-then-else-logic available and with a far smaller number of operations allowed per formula). With statements like A = B*c + D*e +..., where, say, lowercase variables represent real-only values, one is able to process two calculations in a single line by putting two real values in each complex variable (the uppercase ones). But this doesn't really happen in the above example, where (as you noted) I am constantly switching back and forth between real and pseudeo-complex number storing and nothing else - which only obfuscates what's going on. (Ha! Found an excuse for the old, ugly code: It seems to run a tiny bit faster than the new one :-)) Following are the two formulas (slightly) cleaned up. Regards, Gerald ----------------------- begin FRM ----------------------------- Rot3d_D3_Jul {;periodicity=no, outside=summ ;maxit > p5real*(p5imag+1) ; ;p1real: Rotation about x-axis (1st rotation) ;p1imag: Rotation about y-axis (2nd rotation) ;p2real: Far clipping plane ;p2imag: Near clipping plane ;p3real: cx ;p3imag: cy ;p4real: cz ;p4imag: Bailout ;p5real: Maxiter per slice ;p5imag: Number of slices - 1 ; bailout = imag(p4), tiefnum = imag(p5) delta = (real(p2)-imag(p2))/tiefnum tmp = pi/180 rotXax = exp(flip(real(p1)*tmp)), rotYax = exp(flip(imag(p1)*tmp)) ; HPixXY = rotYax VPixZ = real(rotXax) VPixXY = flip(conj(rotYax)) NXY = VPixZ*VPixXY NZ = imag(conj(rotXax)) VPixXY = -NZ*VPixXY ; tmp = NXY*imag(p2) + HPixXY*real(pixel) + VPixXY*imag(pixel) x1 = x0 = real(tmp), y1 = y0 = imag(tmp) z1 = z0 = NZ*imag(p2) + HPixZ*real(pixel) + VPixZ*imag(pixel) tmp = NXY*delta dx = real(tmp), dy = imag(tmp) dz = NZ*delta cx = real(p3), cy = imag(p3), cz = real(p4) sqx = sqr(x1), sqy = sqr(y1), sqz = sqr(z1) j = m = i = 0: w1 = x1, w2 = y1, w3 = z1 x1 = sqx + 2*w2*w3 + cx y1 = sqz + 2*w1*w2 + cy z1 = sqy + 2*w1*w3 + cz sqx = sqr(x1), sqy = sqr(y1), sqz = sqr(z1) IF (bailout >= sqx+sqy+sqz) i = i + 1 ELSE i = 0 m = m + 1 x1 = x0 = x0 + dx y1 = y0 = y0 + dy z1 = z0 = z0 + dz sqx = sqr(x1), sqy = sqr(y1), sqz = sqr(z1) ENDIF z = m - j j = j + 1 tiefnum >= m && p5 >= i } Rot3d_D3_Man {;periodicity=no, outside=summ ;maxit > p5real*(p5imag+1) ; ;p1real: Rotation about x-axis (1st rotation) ;p1imag: Rotation about y-axis (2nd rotation) ;p2real: Far clipping plane ;p2imag: Near clipping plane ;p3real: x(0) ;p3imag: y(0) ;p4real: z(0) ;p4imag: Bailout ;p5real: Maxiter per slice ;p5imag: Number of slices - 1 ; bailout = imag(p4), tiefnum = imag(p5) delta = (real(p2)-imag(p2))/tiefnum tmp = pi/180 rotXax = exp(flip(real(p1)*tmp)), rotYax = exp(flip(imag(p1)*tmp)) ; HPixXY = rotYax VPixZ = real(rotXax) VPixXY = flip(conj(rotYax)) NXY = VPixZ*VPixXY NZ = imag(conj(rotXax)) VPixXY = -NZ*VPixXY ; tmp = cxy0 = NXY*imag(p2) + HPixXY*real(pixel) + VPixXY*imag(pixel) cx = cx0 = real(tmp), cy = cy0 = imag(tmp) cz = cz0 = NZ*imag(p2) + HPixZ*real(pixel) + VPixZ*imag(pixel) tmp = NXY*delta, dcx = real(tmp), dcy = imag(tmp) dcz = NZ*delta x1 = real(p3), y1 = imag(p3), z1 = real(p4) sqx = sqr(x1), sqy = sqr(y1), sqz = sqr(z1) j = m = i = 0: w1 = x1, w2 = y1, w3 = z1 x1 = sqx + 2*w2*w3 + cx y1 = sqz + 2*w1*w2 + cy z1 = sqy + 2*w1*w3 + cz sqx = sqr(x1), sqy = sqr(y1), sqz = sqr(z1) IF (bailout >= sqx+sqy+sqz) i = i + 1 ELSE i = 0 m = m + 1 cx = cx0 = cx0 + dcx cy = cy0 = cy0 + dcy cz = cz0 = cz0 + dcz x1 = real(p3), y1 = imag(p3), z1 = real(p4) sqx = sqr(x1), sqy = sqr(y1), sqz = sqr(z1) ENDIF z = m - j j = j + 1 tiefnum >= m && p5 >= i } ------------------------ end FRM ------------------------------
participants (3)
-
Gerald K. Dobiasovsky -
Morgan L. Owens -
Russell Walsmith