Discussion:
Inverse IFS/deep zooming
(too old to reply)
dave
2005-10-04 10:10:05 UTC
Permalink
Hi all,

Anyone interested in Inverse IFS may wish to view the
two pics I just posted to alt.binaries.pictures.fractals
in the message:
"Two views of the Levy Dragon using Inverse IFS"

bye
Dave

http://website.lineone.net/~dave_makin/
http://www.ultrafractal.org/tiki-browse_gallery.php?galleryId=58
dave
2005-10-04 10:13:11 UTC
Permalink
Hi all,

I don't know why but it got delete from my ABPF news,
so if you wanna look you may need to go to alt.fractals.pictures
instead.

bye
Dave
dave
2005-10-06 13:43:00 UTC
Permalink
Any comments/feedback appreciated :-)
Post by dave
Hi all,
Anyone interested in Inverse IFS may wish to view the
two pics I just posted to alt.binaries.pictures.fractals
"Two views of the Levy Dragon using Inverse IFS"
bye
Dave
http://website.lineone.net/~dave_makin/
http://www.ultrafractal.org/tiki-browse_gallery.php?galleryId=58
Roger Bagula
2005-10-06 15:18:55 UTC
Permalink
My personal comment besides not being able to find your pictures
is that you haven't given any indications of what you mean by Inverse
IFS in the post.
We have people wanting just basic information
and you have failed to give any "real" information.
A pretty picture as the "Threshold" pseudo-fractal shows is not always
a real fractal.
Post by dave
Any comments/feedback appreciated :-)
Post by dave
Hi all,
Anyone interested in Inverse IFS may wish to view the
two pics I just posted to alt.binaries.pictures.fractals
"Two views of the Levy Dragon using Inverse IFS"
bye
Dave
http://website.lineone.net/~dave_makin/
http://www.ultrafractal.org/tiki-browse_gallery.php?galleryId=58
dave
2005-10-06 15:59:19 UTC
Permalink
Hi Roger,

I don't know why you can't see the images - they're on A.B.P.F.
on Usenet Replayer plain as anything :-)

I realise that any generated image is only an approximation, but to me
getting an (at least visually accurate) >*1,125,000 zoom into the Levy
Dragon using IFS in 1min 24s for a 640*480 was new; maybe it's not
to anyone else (that's mainly what I was wondering) ?

The pictures were generated using a modification of the standard
Inverse IFS (bailout) algorithm widely available for/in many fractal
image generating programs such as Fractint, the original versions I
found of it weren't capable of deep-zooming mainly due to the time
taken but also due to inherent inaccuracy caused in a way by doing
too much :-)

I'm just finishing off some odds and ends in the formula for Ultrafractal
that I used to create the image before I release the beta3 version of it.
The beta2 version (which doesn't have correct complete RIFS or the
new fast Inverse algorithm) is MMF4_beta2 here:
http://www.ultrafractal.org/tiki-list_file_gallery.php?galleryId=4

I've managed to get it generating Recurrent IFS using either a modified
Random (chaos game) method, the Deterministic method or using the
Inverse method that generated the Levy Dragon zoom.

bye
Dave
Post by Roger Bagula
My personal comment besides not being able to find your pictures
is that you haven't given any indications of what you mean by Inverse
IFS in the post.
We have people wanting just basic information
and you have failed to give any "real" information.
A pretty picture as the "Threshold" pseudo-fractal shows is not always
a real fractal.
Post by dave
Any comments/feedback appreciated :-)
Post by dave
Hi all,
Anyone interested in Inverse IFS may wish to view the
two pics I just posted to alt.binaries.pictures.fractals
"Two views of the Levy Dragon using Inverse IFS"
bye
Dave
http://website.lineone.net/~dave_makin/
http://www.ultrafractal.org/tiki-browse_gallery.php?galleryId=58
legalize+ (Richard)
2005-10-06 20:35:01 UTC
Permalink
[Please do not mail me a copy of your followup]
Post by dave
I don't know why you can't see the images - they're on A.B.P.F.
on Usenet Replayer plain as anything :-)
Try
<http://www.usenet-replayer.com/groups/alt%2Ebinaries%2Epictures%2Efractals.html>

or the particular images:

<Loading Image...>
<Loading Image...>
--
"The Direct3D Graphics Pipeline"-- code samples, sample chapter, FAQ:
<http://www.xmission.com/~legalize/book/>
Pilgrimage: Utah's annual demoparty
<http://pilgrimage.scene.org>
legalize+ (Richard)
2005-10-06 20:38:53 UTC
Permalink
[Please do not mail me a copy of your followup]
Post by dave
The pictures were generated using a modification of the standard
Inverse IFS (bailout) algorithm widely available for/in many fractal
image generating programs such as Fractint, the original versions I
found of it weren't capable of deep-zooming mainly due to the time
taken but also due to inherent inaccuracy caused in a way by doing
too much :-)
I'm not sure if you're saying that the algorithm is supposed to be an
inverse IFS algorithm, or that you're only changing the bailout
computation. Inserse IFS algorithms have the problem that going
backwards generates multiple results and you have to pick one, IIRC.
--
"The Direct3D Graphics Pipeline"-- code samples, sample chapter, FAQ:
<http://www.xmission.com/~legalize/book/>
Pilgrimage: Utah's annual demoparty
<http://pilgrimage.scene.org>
dave
2005-10-07 09:39:28 UTC
Permalink
Hi Richard and all,

"Inverse IFS algorithms have the problem that going
backwards generates multiple results and you have to pick one, IIRC."

First of all to make sure of no confsion -

I am not referring to Inverse IFS in the sense of finding the
IFS or RIFS to generate a given picture.

I am simply talking about an inverse algorithm in the sense
of the inverse method of generating an image from a known
IFS or RIFS.

If that was already clear then in response to your comment:
Are you referring to the fact that when using non-affine
functions there's no one-to-one (and hence multiple inverses)
or the fact that the standard bailout inverse method only takes
the best matching transform from each iteration ?

If the first, then it's irrelevant for the Levy Dragon since the transforms
are affine, if the second then I've adapted the algorithm, it's no longer
using iterations, it does the full tree but culls branches according
to certain conditions as soon as possible.

I sort of started developing it when suncode posted some messages
relating to the (bailout) inverse IFS algorithm - I pointed out then that
the accuracy of the algorithm would be improved by stepping down
the tree to a second (or greater) depth on each iteration before deciding
which of the first depth transforms to pass to the next iteration.
Since then I wondered about doing a full-depth version of inverse IFS
and the algorithm I used to produce the zoom of the Levy Dragon is
the result.
Another important change I made was changing the value used for
the distance test - insead of mag(x,y) I use mag(x-pixelx,y-pixely)
since if (pixelx,pixely) is on the fractal then there will be a set
of transforms taking the point back to itself :-)

I'm just tinkering with it when I get time, the beta 3 version of the
formula for Ultrafractal which includes the fast version of the inverse
IFS algorithm will be made available when I've improved
a couple of imperfections :-)

For anyone who doesn't want to use the alt.binaries.pictures.fractals
group, I've uploaded the views of the Levy Dragon here:

http://www.ultrafractal.org/tiki-browse_gallery.php?galleryId=58

bye
Dave
Post by legalize+ (Richard)
[Please do not mail me a copy of your followup]
Post by dave
The pictures were generated using a modification of the standard
Inverse IFS (bailout) algorithm widely available for/in many fractal
image generating programs such as Fractint, the original versions I
found of it weren't capable of deep-zooming mainly due to the time
taken but also due to inherent inaccuracy caused in a way by doing
too much :-)
I'm not sure if you're saying that the algorithm is supposed to be an
inverse IFS algorithm, or that you're only changing the bailout
computation. Inserse IFS algorithms have the problem that going
backwards generates multiple results and you have to pick one, IIRC.
--
<http://www.xmission.com/~legalize/book/>
Pilgrimage: Utah's annual demoparty
<http://pilgrimage.scene.org>
legalize+ (Richard)
2005-10-07 16:01:26 UTC
Permalink
[Please do not mail me a copy of your followup]

Sorry, scratch that. I was thinking of the Inverse Iteration Method
for computing Julia sets. That's the one that gives you multiple
"roots" in the iteration and you have to pick one to follow (or
attempt to follow them all, but that becomes combinatorially
silly :).
--
"The Direct3D Graphics Pipeline"-- code samples, sample chapter, FAQ:
<http://www.xmission.com/~legalize/book/>
Pilgrimage: Utah's annual demoparty
<http://pilgrimage.scene.org>
dave
2005-10-07 10:20:28 UTC
Permalink
Hi Roger and all,

A question just struck me:

If IFSs produce an attractor given that the functions are
(at least overall) contracting, when using Inverse IFS
(ie. using the expanding inverse functions) is it correct to
say that the inverse IFS algorithm will produce an attractor
if the functions are (at least overall) expanding ?

My maths isn't up to the answer :-)

bye
Dave
Post by Roger Bagula
My personal comment besides not being able to find your pictures
is that you haven't given any indications of what you mean by Inverse
IFS in the post.
We have people wanting just basic information
and you have failed to give any "real" information.
A pretty picture as the "Threshold" pseudo-fractal shows is not always
a real fractal.
Post by dave
Any comments/feedback appreciated :-)
Post by dave
Hi all,
Anyone interested in Inverse IFS may wish to view the
two pics I just posted to alt.binaries.pictures.fractals
"Two views of the Levy Dragon using Inverse IFS"
bye
Dave
http://website.lineone.net/~dave_makin/
http://www.ultrafractal.org/tiki-browse_gallery.php?galleryId=58
dave
2005-10-07 13:25:57 UTC
Permalink
Post by dave
Hi Roger and all,
If IFSs produce an attractor given that the functions are
(at least overall) contracting, when using Inverse IFS
(ie. using the expanding inverse functions) is it correct to
say that the inverse IFS algorithm will produce an attractor
if the functions are (at least overall) expanding ?
My maths isn't up to the answer :-)
bye
Dave
If the answer is yes, or yes but with conditions then maybe we should
be looking for expanding functions that will reproduce a set of data
(at least to a given tolerance) using the inverse IFS algorithm instead
of contractive functions that reproduce the data using the random or
deterministic methods ?
dave
2005-10-07 15:25:31 UTC
Permalink
Also, on a more philosophical level, doesn't it make more
sense that the functions used to convert "compressed data"
in the form of IFS/RIFS should be converted to the "expanded
data" using expanding functions rather than contractive ones ?
Post by dave
Post by dave
Hi Roger and all,
If IFSs produce an attractor given that the functions are
(at least overall) contracting, when using Inverse IFS
(ie. using the expanding inverse functions) is it correct to
say that the inverse IFS algorithm will produce an attractor
if the functions are (at least overall) expanding ?
My maths isn't up to the answer :-)
bye
Dave
If the answer is yes, or yes but with conditions then maybe we should
be looking for expanding functions that will reproduce a set of data
(at least to a given tolerance) using the inverse IFS algorithm instead
of contractive functions that reproduce the data using the random or
deterministic methods ?
Roger Bagula
2005-10-07 16:30:32 UTC
Permalink
Well, you finally said what you are using.
There is some confusion about "inverse" IFS
as there are several types of inverses on a complex plane
( notabably people do an "Inside -Out" inverse algorithm.
A lot of tiling affines are defined in the formal papers by their
"expanding" form using a matrix inverse of the affine matrices.
Dr. Veerman and Dr. Yang do that.
In that type of IFS you will have problems unless
you place a limit on your allowed domain in many cases ( an escape
radius for instance).
The determinant of the affine matrix in your method is greater than one,
where in the Barnsley type of affine IFS it is less than one.
Lets put that in a clearer math form as a map/ affine ( here i is the
number of transforms used):
x'=a(i)*x+b(i)*y+c(i)
y'=d(i)*x+e(i)*y+f(i)
Det=a(i)*e(i)-b(i)*d(i)>=1 ( for Inverse IFS)
One way to limit expansion is to begin again randomly
after abs(x)>xlimit or abs(y)>ylimit
which will give a square output picture.
In a converging IFS with Det<=1 that kind of limit isn't necessary.
Post by dave
Hi Roger and all,
If IFSs produce an attractor given that the functions are
(at least overall) contracting, when using Inverse IFS
(ie. using the expanding inverse functions) is it correct to
say that the inverse IFS algorithm will produce an attractor
if the functions are (at least overall) expanding ?
My maths isn't up to the answer :-)
bye
Dave
Post by Roger Bagula
My personal comment besides not being able to find your pictures
is that you haven't given any indications of what you mean by Inverse
IFS in the post.
We have people wanting just basic information
and you have failed to give any "real" information.
A pretty picture as the "Threshold" pseudo-fractal shows is not always
a real fractal.
Post by dave
Any comments/feedback appreciated :-)
Post by dave
Hi all,
Anyone interested in Inverse IFS may wish to view the
two pics I just posted to alt.binaries.pictures.fractals
"Two views of the Levy Dragon using Inverse IFS"
bye
Dave
http://website.lineone.net/~dave_makin/
http://www.ultrafractal.org/tiki-browse_gallery.php?galleryId=58
dave
2005-10-07 16:28:46 UTC
Permalink
Hi Roger,

The algorithm I've implimented has an initial radius (or tolerance)
if any transform produces a new point such that the distance from
the initial point exceeds that tolerance then that branch of the tree
is discarded.
The initial tolerance value required using this method has a given minimum
to produce correct results - this minimum depends (in affine systems at
least)
on the largest area covered by one of the original contractive transforms
genetically speaking - in practice for Ultrafractal purposes the user
specifies the start value of the tolerance using a user parameter.

Otherwise (if the distance is less than the tolerance) the distance
is used as the new tolerance throughout the rest of the tree.

If (after reaching a certain depth in the tree) the final tolerance is
less than a given value then the original point is considered "on" the
fractal,
this position can of course be reached by more than one genetic path
in some cases and, as written at the moment the algorithm is written to,
and seems to, find them all (eg. overlapping section of fern fronds).

bye
Dave
Post by Roger Bagula
Well, you finally said what you are using.
There is some confusion about "inverse" IFS
as there are several types of inverses on a complex plane
( notabably people do an "Inside -Out" inverse algorithm.
A lot of tiling affines are defined in the formal papers by their
"expanding" form using a matrix inverse of the affine matrices.
Dr. Veerman and Dr. Yang do that.
In that type of IFS you will have problems unless
you place a limit on your allowed domain in many cases ( an escape
radius for instance).
The determinant of the affine matrix in your method is greater than one,
where in the Barnsley type of affine IFS it is less than one.
Lets put that in a clearer math form as a map/ affine ( here i is the
x'=a(i)*x+b(i)*y+c(i)
y'=d(i)*x+e(i)*y+f(i)
Det=a(i)*e(i)-b(i)*d(i)>=1 ( for Inverse IFS)
One way to limit expansion is to begin again randomly
after abs(x)>xlimit or abs(y)>ylimit
which will give a square output picture.
In a converging IFS with Det<=1 that kind of limit isn't necessary.
Post by dave
Hi Roger and all,
If IFSs produce an attractor given that the functions are
(at least overall) contracting, when using Inverse IFS
(ie. using the expanding inverse functions) is it correct to
say that the inverse IFS algorithm will produce an attractor
if the functions are (at least overall) expanding ?
My maths isn't up to the answer :-)
bye
Dave
Post by Roger Bagula
My personal comment besides not being able to find your pictures
is that you haven't given any indications of what you mean by Inverse
IFS in the post.
We have people wanting just basic information
and you have failed to give any "real" information.
A pretty picture as the "Threshold" pseudo-fractal shows is not always
a real fractal.
Post by dave
Any comments/feedback appreciated :-)
Post by dave
Hi all,
Anyone interested in Inverse IFS may wish to view the
two pics I just posted to alt.binaries.pictures.fractals
"Two views of the Levy Dragon using Inverse IFS"
bye
Dave
http://website.lineone.net/~dave_makin/
http://www.ultrafractal.org/tiki-browse_gallery.php?galleryId=58
dave
2005-10-10 14:40:17 UTC
Permalink
Hi all,

Wondered if anyone could supply a solution to an issue with
the inverse IFS algorithm I'm using:

As I said the algorithm uses a tolerance test at each stage in the tree
- at the moment the tolerance test value is simply reduced to the lesser
value each time the tolerance test is passed, otherwise the same test
value is used for all the transforms in the tree.
This works great on many fractals, including rep-tiles, a fern and
regular 2D objects, but if applied to an IFS with the "main" transforms
notably different in shape, eg. the square generated by three transforms
having scales 0.75/0.75 0.25/0.75 and 1.0/0.25, it has the
problem of finding some pixels that should not be "on" the fractal.
I solved this to a certain extent by applying the genetic code found
to the pixel using the contractive mappings and testing how close the
result was to the original pixel, this helps but is not a perfect solution.
I'm assuming that the problem means that the tolerance test must somehow
be adjusted to take into consideration the shape and maybe scale of each
transform - is this correct ? if so how exactly ? Maybe by testing an
x-distance
and y-distance separately ? (As I may have mentioned my maths ended at
"A" level so I'm not really qualified to work out the answer using high
level
maths, only by trial and error :-)

bye
Dave
Post by dave
Hi Roger,
The algorithm I've implimented has an initial radius (or tolerance)
if any transform produces a new point such that the distance from
the initial point exceeds that tolerance then that branch of the tree
is discarded.
The initial tolerance value required using this method has a given minimum
to produce correct results - this minimum depends (in affine systems at
least)
on the largest area covered by one of the original contractive transforms
genetically speaking - in practice for Ultrafractal purposes the user
specifies the start value of the tolerance using a user parameter.
Otherwise (if the distance is less than the tolerance) the distance
is used as the new tolerance throughout the rest of the tree.
If (after reaching a certain depth in the tree) the final tolerance is
less than a given value then the original point is considered "on" the
fractal,
this position can of course be reached by more than one genetic path
in some cases and, as written at the moment the algorithm is written to,
and seems to, find them all (eg. overlapping section of fern fronds).
bye
Dave
dave
2005-10-13 12:47:07 UTC
Permalink
Hi Roger and all,

The full beta3 version of my IFS/RIFS formula
for Ultrafractal can now be downloaded here:

http://www.ultrafractal.org/tiki-list_file_gallery.php?galleryId=4

The zipfile includes a quick text document giving the
changes from the beta 2 version and there are example
Ultrafractal parameter files using the formula.

The formula/parameters will work un UF3 as well as UF4.

Enjoy !

bye
Dave

http://website.lineone.net/~dave_makin/
dave
2005-10-13 13:06:21 UTC
Permalink
Note that it IS BETA, those of you on the Ultrafractal
mailing list please do NOT yet share parameters
using the formula on the list until I release the
"finished" version in the UF formula database.
Post by dave
Hi Roger and all,
The full beta3 version of my IFS/RIFS formula
http://www.ultrafractal.org/tiki-list_file_gallery.php?galleryId=4
The zipfile includes a quick text document giving the
changes from the beta 2 version and there are example
Ultrafractal parameter files using the formula.
The formula/parameters will work un UF3 as well as UF4.
Enjoy !
bye
Dave
http://website.lineone.net/~dave_makin/
dave
2005-10-07 16:35:12 UTC
Permalink
Hi again,

"Dr. Veerman and Dr. Yang do that."

Any idea if/where/how a "layman" can get hold of
their published docs/research or whatever (preferably
in lower-level maths/algorithmic terms) ?

(I'm not part of academia in any way, as you may have guessed :-)

bye
Dave

http://website.lineone.net/~dave_makin/
Roger Bagula
2005-10-08 15:18:50 UTC
Permalink
Dr. Yang Wang's site is:
http://www.math.gatech.edu/~wang/
His work with J. C. Lagarias has some
of these definitions. Swelf -Affine Tiles in R^n
Another page that might have papers you'll be interested in:
http://www.math.washington.edu/~solomyak/personal.html
Dr. P. Veerman:
http://www.mth.pdx.edu/~veerman/publications.html
Some Remarks on Affine Tilings
D. Hacon, N. C. Saldanha, J. J. P. Veerman,
Experim. Math. 3, 317-327, 1995.
(postscript version)
Hausdorff Dimension of Boundaries of Self-Affine Tiles in R^n
J. J. P. Veerman,
Bol. Soc. Mex. Mat. 3, Vol 4, No 2, 1998, 159-182.
(postscript version)
2-Reptiles in the Plane
S. -M. Ngai, V. F. Sirvent, J. J. P. Veerman, Y. Wang,
Geometriae Dedicata, 82, No 1-3, 325-344, 2000.
(postscript version)
Hi again,
"Dr. Veerman and Dr. Yang do that."
Any idea if/where/how a "layman" can get hold of
their published docs/research or whatever (preferably
in lower-level maths/algorithmic terms) ?
(I'm not part of academia in any way, as you may have guessed :-)
bye
Dave
http://website.lineone.net/~dave_makin/
David Makin
2005-10-08 20:21:58 UTC
Permalink
Thanks Roger, I'll take a look :-)
Post by Roger Bagula
http://www.math.gatech.edu/~wang/
His work with J. C. Lagarias has some
of these definitions. Swelf -Affine Tiles in R^n
http://www.math.washington.edu/~solomyak/personal.html
http://www.mth.pdx.edu/~veerman/publications.html
Some Remarks on Affine Tilings
D. Hacon, N. C. Saldanha, J. J. P. Veerman,
Experim. Math. 3, 317-327, 1995.
(postscript version)
Hausdorff Dimension of Boundaries of Self-Affine Tiles in R^n
J. J. P. Veerman,
Bol. Soc. Mex. Mat. 3, Vol 4, No 2, 1998, 159-182.
(postscript version)
2-Reptiles in the Plane
S. -M. Ngai, V. F. Sirvent, J. J. P. Veerman, Y. Wang,
Geometriae Dedicata, 82, No 1-3, 325-344, 2000.
(postscript version)
Hi again,
"Dr. Veerman and Dr. Yang do that."
Any idea if/where/how a "layman" can get hold of
their published docs/research or whatever (preferably
in lower-level maths/algorithmic terms) ?
(I'm not part of academia in any way, as you may have guessed :-)
bye
Dave
http://website.lineone.net/~dave_makin/
David Makin
2005-10-07 19:54:32 UTC
Permalink
Hi all,

Roger, your reply has made me realise
(for some reason) that exactly the same
tolerance distance testing I've applied
in the inverse IFS method can be applied
in the same manner to the normal Deterministic
method ie. it can be modified to say "is
this pixel on the fractal" rather than used
the standard way of generating the entire
tree based on a start value on the fractal,
hence enabling deep zooming using the original
contractive functions.
I hadn't read anything so far that said that
was possible :-)

bye
Dave
Post by Roger Bagula
Well, you finally said what you are using.
There is some confusion about "inverse" IFS
as there are several types of inverses on a complex plane
( notabably people do an "Inside -Out" inverse algorithm.
A lot of tiling affines are defined in the formal papers by their
"expanding" form using a matrix inverse of the affine matrices.
Dr. Veerman and Dr. Yang do that.
In that type of IFS you will have problems unless
you place a limit on your allowed domain in many cases ( an escape
radius for instance).
The determinant of the affine matrix in your method is greater than one,
where in the Barnsley type of affine IFS it is less than one.
Lets put that in a clearer math form as a map/ affine ( here i is the
x'=a(i)*x+b(i)*y+c(i)
y'=d(i)*x+e(i)*y+f(i)
Det=a(i)*e(i)-b(i)*d(i)>=1 ( for Inverse IFS)
One way to limit expansion is to begin again randomly
after abs(x)>xlimit or abs(y)>ylimit
which will give a square output picture.
In a converging IFS with Det<=1 that kind of limit isn't necessary.
Post by dave
Hi Roger and all,
If IFSs produce an attractor given that the functions are
(at least overall) contracting, when using Inverse IFS
(ie. using the expanding inverse functions) is it correct to
say that the inverse IFS algorithm will produce an attractor
if the functions are (at least overall) expanding ?
My maths isn't up to the answer :-)
bye
Dave
Post by Roger Bagula
My personal comment besides not being able to find your pictures
is that you haven't given any indications of what you mean by Inverse
IFS in the post.
We have people wanting just basic information
and you have failed to give any "real" information.
A pretty picture as the "Threshold" pseudo-fractal shows is not always
a real fractal.
Post by dave
Any comments/feedback appreciated :-)
Post by dave
Hi all,
Anyone interested in Inverse IFS may wish to view the
two pics I just posted to alt.binaries.pictures.fractals
"Two views of the Levy Dragon using Inverse IFS"
bye
Dave
http://website.lineone.net/~dave_makin/
http://www.ultrafractal.org/tiki-browse_gallery.php?galleryId=58
David Makin
2005-10-08 02:23:31 UTC
Permalink
Scratch that - make that a <reverse> deterministic
method ie. apply contractive transforms in front
of current overall transform as you go down the tree,
remembering the overall transform at each depth node
as you traverse the tree - apply same tolerance
testing as in the inverse algorithm to cull branches
and reduce tolerance value.
2 drawbacks:
1. Only efficient/applicable for affine IFS
2. Must do 4* as much calculation per node in tree
(and store 3* the data)
1 benefit:
should be much more accurate than the inverse method ?

Haven't tried it yet - am still tinkering with
the colouring algorithms in the formula for Ultrafractal.
Post by dave
Hi all,
Roger, your reply has made me realise
(for some reason) that exactly the same
tolerance distance testing I've applied
in the inverse IFS method can be applied
in the same manner to the normal Deterministic
method ie. it can be modified to say "is
this pixel on the fractal" rather than used
the standard way of generating the entire
tree based on a start value on the fractal,
hence enabling deep zooming using the original
contractive functions.
I hadn't read anything so far that said that
was possible :-)
bye
Dave
Post by Roger Bagula
Well, you finally said what you are using.
There is some confusion about "inverse" IFS
as there are several types of inverses on a complex plane
( notabably people do an "Inside -Out" inverse algorithm.
A lot of tiling affines are defined in the formal papers by their
"expanding" form using a matrix inverse of the affine matrices.
Dr. Veerman and Dr. Yang do that.
In that type of IFS you will have problems unless
you place a limit on your allowed domain in many cases ( an escape
radius for instance).
The determinant of the affine matrix in your method is greater than one,
where in the Barnsley type of affine IFS it is less than one.
Lets put that in a clearer math form as a map/ affine ( here i is the
x'=a(i)*x+b(i)*y+c(i)
y'=d(i)*x+e(i)*y+f(i)
Det=a(i)*e(i)-b(i)*d(i)>=1 ( for Inverse IFS)
One way to limit expansion is to begin again randomly
after abs(x)>xlimit or abs(y)>ylimit
which will give a square output picture.
In a converging IFS with Det<=1 that kind of limit isn't necessary.
Post by dave
Hi Roger and all,
If IFSs produce an attractor given that the functions are
(at least overall) contracting, when using Inverse IFS
(ie. using the expanding inverse functions) is it correct to
say that the inverse IFS algorithm will produce an attractor
if the functions are (at least overall) expanding ?
My maths isn't up to the answer :-)
bye
Dave
Post by Roger Bagula
My personal comment besides not being able to find your pictures
is that you haven't given any indications of what you mean by Inverse
IFS in the post.
We have people wanting just basic information
and you have failed to give any "real" information.
A pretty picture as the "Threshold" pseudo-fractal shows is not always
a real fractal.
Post by dave
Any comments/feedback appreciated :-)
Post by dave
Hi all,
Anyone interested in Inverse IFS may wish to view the
two pics I just posted to alt.binaries.pictures.fractals
"Two views of the Levy Dragon using Inverse IFS"
bye
Dave
http://website.lineone.net/~dave_makin/
http://www.ultrafractal.org/tiki-browse_gallery.php?galleryId=58
Roger Bagula
2005-10-10 15:30:59 UTC
Permalink
Here is an Lapin/ Inside Out type algorithm for an von Koch IFS:
PRINT "input level:3 for Lauwerier's von Koch "
LET M=3
SET MODE "color"
SET WINDOW 0,1920,0,1024
SET BACKGROUND COLOR "white"
LET x=1
LET y=1
LET a=0
LET b =0
LET s1=40
LET s2 =s1*1024/1920
RANDOMIZE
PRINT" Lauwerier von Koch I.F.S. AS LAPIN"
PRINT"from page 98-99 of 'fractals'"
PRINT"BY R.L.BAGULA 19 JULY 2003 ©"

LET a1=1/(4*sin((m-2)*pi/(2*m)))
LET b1=1/(4*cos((m-2)*pi/(2*m)))
FOR n= 1 TO 3000000
LET a =RND
LET X0=X/(X*X+Y*Y)
LET Y0=-Y/(X*X+Y*Y)
IF a <= 1/2 THEN
LET x1=(a1*x0+y0*b1)+0.01
LET y1=(b1*x0-a1*y0)
END IF
IF a<= 1 AND a>1/2 THEN
LET x1=(a1*x0-b1*y0)+a1
LET y1=(-b1*x0-a1*y0)+b1
END IF
SET COLOR 255-128*mod(int(2*a),2)
LET x=x1/(X1*X1+Y1*Y1)
LET y=-y1/(X1*X1+Y1*Y1)
IF n>10 THEN PLOT 1920/2+s1*x-900 ,1024/2+s2*y+75*2
NEXT n
END
Post by dave
Hi all,
Anyone interested in Inverse IFS may wish to view the
two pics I just posted to alt.binaries.pictures.fractals
"Two views of the Levy Dragon using Inverse IFS"
bye
Dave
http://website.lineone.net/~dave_makin/
http://www.ultrafractal.org/tiki-browse_gallery.php?galleryId=58
Roger Bagula
2005-10-11 07:05:20 UTC
Permalink
Roger Bagula wrote:

I think I gave you a wrong steer here.
The fudge flake tile and the twin dragon tile both work better than the
von Koch does as a Lapin.
Post by Roger Bagula
PRINT "input level:3 for Lauwerier's von Koch "
LET M=3
SET MODE "color"
SET WINDOW 0,1920,0,1024
SET BACKGROUND COLOR "white"
LET x=1
LET y=1
LET a=0
LET b =0
LET s1=40
LET s2 =s1*1024/1920
RANDOMIZE
PRINT" Lauwerier von Koch I.F.S. AS LAPIN"
PRINT"from page 98-99 of 'fractals'"
PRINT"BY R.L.BAGULA 19 JULY 2003 ©"
LET a1=1/(4*sin((m-2)*pi/(2*m)))
LET b1=1/(4*cos((m-2)*pi/(2*m)))
FOR n= 1 TO 3000000
LET a =RND
LET X0=X/(X*X+Y*Y)
LET Y0=-Y/(X*X+Y*Y)
IF a <= 1/2 THEN
LET x1=(a1*x0+y0*b1)+0.01
LET y1=(b1*x0-a1*y0)
END IF
IF a<= 1 AND a>1/2 THEN
LET x1=(a1*x0-b1*y0)+a1
LET y1=(-b1*x0-a1*y0)+b1
END IF
SET COLOR 255-128*mod(int(2*a),2)
LET x=x1/(X1*X1+Y1*Y1)
LET y=-y1/(X1*X1+Y1*Y1)
IF n>10 THEN PLOT 1920/2+s1*x-900 ,1024/2+s2*y+75*2
NEXT n
END
Post by dave
Hi all,
Anyone interested in Inverse IFS may wish to view the
two pics I just posted to alt.binaries.pictures.fractals
"Two views of the Levy Dragon using Inverse IFS"
bye
Dave
http://website.lineone.net/~dave_makin/
http://www.ultrafractal.org/tiki-browse_gallery.php?galleryId=58
dave
2005-10-12 14:51:44 UTC
Permalink
Hi Roger and all,

Here's the the main part of the Inverse IFS algorithm
as I've implimented it in Ultrafractal (somewhat abbreviated
and not 100% documented but the general idea should be transparent):

PER PIXEL:

bool f
int xs=round(real(#screenpixel)*@os)
int ys=round(imag(#screenpixel)*@os)
complex zz[@igen] ; @igen is the maximum depth we want to go down
the tree
complex zo[@igen]
complex fz[@igen]
complex zt
complex z2
complex sz
complex tz
float x
float y
float x1
float y1
float m
float fc=-1.0
float fc1=-1.0
float c=0.0
float c1=0.0
float s[@igen]
float mm[@igen]
float ss
float s1
float fm=2.0*@bailout ; @bailout is the tolerance test value
int fn=-1
int i[@igen]
int j
int k
int l

tz=sz=z=#pixel
if @itest==0
tz=(0,0)
endif
k=i[0]=gnt-1 ; number of transforms
j=0
m=mm[0]=@bailout
ss=1.0
repeat
k=i[j]
zo[j]=z

(Here calculate new z using transform k)

zz[j]=z
x=|tz-z|
s[j]=ss=ss*gt[k,6] ; gt[k,6] is the scale of the original contractive
transform
if (j=j+1)==@igen || ss<gs2 ; gs2 is a precalculated figure based on
the required detail
j=j-1
if x<m
; The errfix is an attempt at correcting the algorithm on some fractals
; where points get found/coloured that should not be on the fractal.
; Only works with affine systems.
if @errfix>0.0
k=j
c=0
y=0
repeat
l=i[k]
ss=c
c=c*gt[l,0]+y*gt[l,2]+gt[l,4] ; Perform full contraction
using original
y=ss*gt[l,1]+y*gt[l,3]+gt[l,5] ; contractive functions
based on found genetics
k=k-1
until k<0
endif
if @errfix==0.0 || |sz-c-flip(y)|<gc2 ; if not error checking or
within limits of error check
if @orbits
if x<fm
fm=x
k=fn=j
repeat
fz[k]=zz[k]-tz
k=k-1
until k<0
endif
else
if @colour!=3
k=(gn+@older)%(j+1)
c=0.0
l=gn
repeat
c=i[k]*gs1+c*gc1 ; gs1 and gc1 are precalculated values
so that the genetic code is packed into an Ultrafractal float with the most
important genetic code as the most significant position
if (k=k-1)<0
k=j
endif
l=l-1
until l<0
if c>fc
fc=c
fm=x
endif
endif
if @lighting>0
k=(gn+@olderl)%(j+1)
c1=0.0
l=gn
repeat
c1=i[k]*gs1+c1*gc1
if (k=k-1)<0
k=j
endif
l=l-1
until l<0
if c1>fc1
fc1=c1
fm=x
endif
endif
if @colour==3 && @lighting==0
fm=x
endif
endif
if @errfix1==1 ; errfix1 dictates at what point we accept a
found point, if 1 we take the first found
j=-1
endif
m=x
endif
endif
if j>=0
f=false ; here we check for disallowed combinations
(limited RIFS) (gf[] flags)
repeat
if (i[j]=i[j]-1)<0
if (j=j-1)<0
f=true
endif
elseif j>0
f=gf[i[j],i[j-1]+9]
else
f=true
endif
until f
if j==0
z=sz
ss=1.0
if @errfix1==2
m=mm[0]
endif
elseif j>0
z=zz[j-1]
ss=s[j-1]
if @errfix1==2
m=mm[j]
endif
endif
endif
elseif x>m
j=j-1 ; again check for limited RIFS
f=false
repeat
if (i[j]=i[j]-1)<0
if (j=j-1)<0
f=true
endif
elseif j>0
f=gf[i[j],i[j-1]+9]
else
f=true
endif
until f
if j==0
z=sz
ss=1.0
if @errfix1==2
m=mm[0]
endif
elseif j>0
z=zz[j-1]
ss=s[j-1]
if @errfix1==2
m=mm[j]
endif
endif
else
k=k+9
l=gnt
f=false
repeat
if (l=l-1)>=0
f=gf[l,k]
endif
until f || l<0
if l<0
j=j-1
f=false ; again check for limited RIFS
repeat
if (i[j]=i[j]-1)<0
if (j=j-1)<0
f=true
endif
elseif j>0
f=gf[i[j],i[j-1]+9]
else
f=true
endif
until f
if j==0
z=sz
ss=1.0
if @errfix1==2
m=mm[0]
endif
elseif j>0
z=zz[j-1]
ss=s[j-1]
if @errfix1==2
m=mm[j]
endif
endif
else
i[j]=l
if @errfix1==2
mm[j]=m
endif
endif
endif
until j<0

Note that the RIFS checks check that a given transform may be preceded by
another since the original forwards RIFS algorithm checks for transforms
that may follow another.

Now we have all necessary values to colour the point if it was on the
fractal using either the genetics or the orbital path as dictated by
the genetic sequence.

The algorithm needs considerable improvement for doing some sets,
for example quadratic Julia's by inverse IFS but for higher powers
the rate of divergence is such that branches of the tree for points
off the fractal are culled quickly, in fact I also found that if you set
a 2 transform IFS such that the 2 transforms are standard quadratic
Julia transforms but for different Julia seeds the results are also
reasonably
fast.

bye
Dave

http://website.lineone.net/~dave_makin/
http://www.ultrafractal.org/tiki-browse_gallery.php?galleryId=58
Roger Bagula
2005-10-12 16:28:05 UTC
Permalink
Dear Dave,
I want to thank you for making your code available.
You might want to look into Dr. Frame's idea of driven IFS.
It is at the Mandelbrot -Frame site at Yale
available from their undergraduate course there.
Post by dave
Hi Roger and all,
Here's the the main part of the Inverse IFS algorithm
as I've implimented it in Ultrafractal (somewhat abbreviated
bool f
the tree
complex zt
complex z2
complex sz
complex tz
float x
float y
float x1
float y1
float m
float fc=-1.0
float fc1=-1.0
float c=0.0
float c1=0.0
float ss
float s1
int fn=-1
int j
int k
int l
tz=sz=z=#pixel
tz=(0,0)
endif
k=i[0]=gnt-1 ; number of transforms
j=0
ss=1.0
repeat
k=i[j]
zo[j]=z
(Here calculate new z using transform k)
zz[j]=z
x=|tz-z|
s[j]=ss=ss*gt[k,6] ; gt[k,6] is the scale of the original contractive
transform
the required detail
j=j-1
if x<m
; The errfix is an attempt at correcting the algorithm on some fractals
; where points get found/coloured that should not be on the fractal.
; Only works with affine systems.
k=j
c=0
y=0
repeat
l=i[k]
ss=c
c=c*gt[l,0]+y*gt[l,2]+gt[l,4] ; Perform full contraction
using original
y=ss*gt[l,1]+y*gt[l,3]+gt[l,5] ; contractive functions
based on found genetics
k=k-1
until k<0
endif
within limits of error check
if x<fm
fm=x
k=fn=j
repeat
fz[k]=zz[k]-tz
k=k-1
until k<0
endif
else
c=0.0
l=gn
repeat
c=i[k]*gs1+c*gc1 ; gs1 and gc1 are precalculated values
so that the genetic code is packed into an Ultrafractal float with the most
important genetic code as the most significant position
if (k=k-1)<0
k=j
endif
l=l-1
until l<0
if c>fc
fc=c
fm=x
endif
endif
c1=0.0
l=gn
repeat
c1=i[k]*gs1+c1*gc1
if (k=k-1)<0
k=j
endif
l=l-1
until l<0
if c1>fc1
fc1=c1
fm=x
endif
endif
fm=x
endif
endif
found point, if 1 we take the first found
j=-1
endif
m=x
endif
endif
if j>=0
f=false ; here we check for disallowed combinations
(limited RIFS) (gf[] flags)
repeat
if (i[j]=i[j]-1)<0
if (j=j-1)<0
f=true
endif
elseif j>0
f=gf[i[j],i[j-1]+9]
else
f=true
endif
until f
if j==0
z=sz
ss=1.0
m=mm[0]
endif
elseif j>0
z=zz[j-1]
ss=s[j-1]
m=mm[j]
endif
endif
endif
elseif x>m
j=j-1 ; again check for limited RIFS
f=false
repeat
if (i[j]=i[j]-1)<0
if (j=j-1)<0
f=true
endif
elseif j>0
f=gf[i[j],i[j-1]+9]
else
f=true
endif
until f
if j==0
z=sz
ss=1.0
m=mm[0]
endif
elseif j>0
z=zz[j-1]
ss=s[j-1]
m=mm[j]
endif
endif
else
k=k+9
l=gnt
f=false
repeat
if (l=l-1)>=0
f=gf[l,k]
endif
until f || l<0
if l<0
j=j-1
f=false ; again check for limited RIFS
repeat
if (i[j]=i[j]-1)<0
if (j=j-1)<0
f=true
endif
elseif j>0
f=gf[i[j],i[j-1]+9]
else
f=true
endif
until f
if j==0
z=sz
ss=1.0
m=mm[0]
endif
elseif j>0
z=zz[j-1]
ss=s[j-1]
m=mm[j]
endif
endif
else
i[j]=l
mm[j]=m
endif
endif
endif
until j<0
Note that the RIFS checks check that a given transform may be preceded by
another since the original forwards RIFS algorithm checks for transforms
that may follow another.
Now we have all necessary values to colour the point if it was on the
fractal using either the genetics or the orbital path as dictated by
the genetic sequence.
The algorithm needs considerable improvement for doing some sets,
for example quadratic Julia's by inverse IFS but for higher powers
the rate of divergence is such that branches of the tree for points
off the fractal are culled quickly, in fact I also found that if you set
a 2 transform IFS such that the 2 transforms are standard quadratic
Julia transforms but for different Julia seeds the results are also
reasonably
fast.
bye
Dave
http://website.lineone.net/~dave_makin/
http://www.ultrafractal.org/tiki-browse_gallery.php?galleryId=58
dave
2005-10-12 16:45:10 UTC
Permalink
Hi Roger,

I'm not sure about looking into driven IFS, I'm more interested
in IFS systems you can zoom into - unles Dr. Frame's version
of driven IFS allows you to say "is this pixel on the fractal
and if so by how much ?" rather than having to generate the
entire fractal using the usual driven random method ?

bye
Dave
Post by Roger Bagula
Dear Dave,
I want to thank you for making your code available.
You might want to look into Dr. Frame's idea of driven IFS.
It is at the Mandelbrot -Frame site at Yale
available from their undergraduate course there.
Post by dave
Hi Roger and all,
Here's the the main part of the Inverse IFS algorithm
as I've implimented it in Ultrafractal (somewhat abbreviated
bool f
the tree
complex zt
complex z2
complex sz
complex tz
float x
float y
float x1
float y1
float m
float fc=-1.0
float fc1=-1.0
float c=0.0
float c1=0.0
float ss
float s1
int fn=-1
int j
int k
int l
tz=sz=z=#pixel
tz=(0,0)
endif
k=i[0]=gnt-1 ; number of transforms
j=0
ss=1.0
repeat
k=i[j]
zo[j]=z
(Here calculate new z using transform k)
zz[j]=z
x=|tz-z|
s[j]=ss=ss*gt[k,6] ; gt[k,6] is the scale of the original contractive
transform
the required detail
j=j-1
if x<m
; The errfix is an attempt at correcting the algorithm on some fractals
; where points get found/coloured that should not be on the fractal.
; Only works with affine systems.
k=j
c=0
y=0
repeat
l=i[k]
ss=c
c=c*gt[l,0]+y*gt[l,2]+gt[l,4] ; Perform full contraction
using original
y=ss*gt[l,1]+y*gt[l,3]+gt[l,5] ; contractive functions
based on found genetics
k=k-1
until k<0
endif
within limits of error check
if x<fm
fm=x
k=fn=j
repeat
fz[k]=zz[k]-tz
k=k-1
until k<0
endif
else
c=0.0
l=gn
repeat
c=i[k]*gs1+c*gc1 ; gs1 and gc1 are precalculated values
so that the genetic code is packed into an Ultrafractal float with the most
important genetic code as the most significant position
if (k=k-1)<0
k=j
endif
l=l-1
until l<0
if c>fc
fc=c
fm=x
endif
endif
c1=0.0
l=gn
repeat
c1=i[k]*gs1+c1*gc1
if (k=k-1)<0
k=j
endif
l=l-1
until l<0
if c1>fc1
fc1=c1
fm=x
endif
endif
fm=x
endif
endif
found point, if 1 we take the first found
j=-1
endif
m=x
endif
endif
if j>=0
f=false ; here we check for disallowed combinations
(limited RIFS) (gf[] flags)
repeat
if (i[j]=i[j]-1)<0
if (j=j-1)<0
f=true
endif
elseif j>0
f=gf[i[j],i[j-1]+9]
else
f=true
endif
until f
if j==0
z=sz
ss=1.0
m=mm[0]
endif
elseif j>0
z=zz[j-1]
ss=s[j-1]
m=mm[j]
endif
endif
endif
elseif x>m
j=j-1 ; again check for limited RIFS
f=false
repeat
if (i[j]=i[j]-1)<0
if (j=j-1)<0
f=true
endif
elseif j>0
f=gf[i[j],i[j-1]+9]
else
f=true
endif
until f
if j==0
z=sz
ss=1.0
m=mm[0]
endif
elseif j>0
z=zz[j-1]
ss=s[j-1]
m=mm[j]
endif
endif
else
k=k+9
l=gnt
f=false
repeat
if (l=l-1)>=0
f=gf[l,k]
endif
until f || l<0
if l<0
j=j-1
f=false ; again check for limited RIFS
repeat
if (i[j]=i[j]-1)<0
if (j=j-1)<0
f=true
endif
elseif j>0
f=gf[i[j],i[j-1]+9]
else
f=true
endif
until f
if j==0
z=sz
ss=1.0
m=mm[0]
endif
elseif j>0
z=zz[j-1]
ss=s[j-1]
m=mm[j]
endif
endif
else
i[j]=l
mm[j]=m
endif
endif
endif
until j<0
Note that the RIFS checks check that a given transform may be preceded by
another since the original forwards RIFS algorithm checks for transforms
that may follow another.
Now we have all necessary values to colour the point if it was on the
fractal using either the genetics or the orbital path as dictated by
the genetic sequence.
The algorithm needs considerable improvement for doing some sets,
for example quadratic Julia's by inverse IFS but for higher powers
the rate of divergence is such that branches of the tree for points
off the fractal are culled quickly, in fact I also found that if you set
a 2 transform IFS such that the 2 transforms are standard quadratic
Julia transforms but for different Julia seeds the results are also
reasonably
fast.
bye
Dave
http://website.lineone.net/~dave_makin/
http://www.ultrafractal.org/tiki-browse_gallery.php?galleryId=58
Roger Bagula
2005-10-12 19:51:33 UTC
Permalink
There is an "equivalence" of L-systems with IFS ( Dr. McWorter is very
good at converting one to the other)
and substitution groups used to produce fractals are deterministic:
that is they only produce the points of the fractal.
I said "driven" IFS as I have found that fractals produced
deterministically/ parametrically by a Mandelbrot function/
Besicovitch-Ursell function method
behave more like driven IFS than ordinary affine IFS.
I think that approaching/(going at) it the way you are may be
"the hard way".
Post by dave
Hi Roger,
I'm not sure about looking into driven IFS, I'm more interested
in IFS systems you can zoom into - unles Dr. Frame's version
of driven IFS allows you to say "is this pixel on the fractal
and if so by how much ?" rather than having to generate the
entire fractal using the usual driven random method ?
bye
Dave
dave
2005-10-13 12:38:28 UTC
Permalink
Hi Roger,

It may be "the hard way" but I'm approaching fractals from
the point of view of generating fractal art rather than from a
strictly mathematical point of view and as such a scanline
algorithm that lets you zoom into a fractal is of great benefit :-)
(And has possibilities with respect to rendering 3D/3D+ fractals)

bye
Dave
Post by Roger Bagula
There is an "equivalence" of L-systems with IFS ( Dr. McWorter is very
good at converting one to the other)
that is they only produce the points of the fractal.
I said "driven" IFS as I have found that fractals produced
deterministically/ parametrically by a Mandelbrot function/
Besicovitch-Ursell function method
behave more like driven IFS than ordinary affine IFS.
I think that approaching/(going at) it the way you are may be
"the hard way".
dave
2005-10-11 13:43:41 UTC
Permalink
Hi Roger,

That looks like a standard random IFS routine ?

bye
Dave
Post by Roger Bagula
PRINT "input level:3 for Lauwerier's von Koch "
LET M=3
SET MODE "color"
SET WINDOW 0,1920,0,1024
SET BACKGROUND COLOR "white"
LET x=1
LET y=1
LET a=0
LET b =0
LET s1=40
LET s2 =s1*1024/1920
RANDOMIZE
PRINT" Lauwerier von Koch I.F.S. AS LAPIN"
PRINT"from page 98-99 of 'fractals'"
PRINT"BY R.L.BAGULA 19 JULY 2003 ©"
LET a1=1/(4*sin((m-2)*pi/(2*m)))
LET b1=1/(4*cos((m-2)*pi/(2*m)))
FOR n= 1 TO 3000000
LET a =RND
LET X0=X/(X*X+Y*Y)
LET Y0=-Y/(X*X+Y*Y)
IF a <= 1/2 THEN
LET x1=(a1*x0+y0*b1)+0.01
LET y1=(b1*x0-a1*y0)
END IF
IF a<= 1 AND a>1/2 THEN
LET x1=(a1*x0-b1*y0)+a1
LET y1=(-b1*x0-a1*y0)+b1
END IF
SET COLOR 255-128*mod(int(2*a),2)
LET x=x1/(X1*X1+Y1*Y1)
LET y=-y1/(X1*X1+Y1*Y1)
IF n>10 THEN PLOT 1920/2+s1*x-900 ,1024/2+s2*y+75*2
NEXT n
END
Post by dave
Hi all,
Anyone interested in Inverse IFS may wish to view the
two pics I just posted to alt.binaries.pictures.fractals
"Two views of the Levy Dragon using Inverse IFS"
bye
Dave
http://website.lineone.net/~dave_makin/
http://www.ultrafractal.org/tiki-browse_gallery.php?galleryId=58
Loading...