colin shuker

Ranch Hand

Posts: 750

posted 12 years ago

hmmmmmm,

That solution is even worse really.

Basically, I'm trying to draw a Mandelbrot set.

And I need to plot a few hundred thousand points,

after testing them to see if they satisfy:

P[^n](0) -/-> infinity as n->infinity,

where P(z)=z^2+c, and c is the point (x,y)=x+iy.

I think g.drawLine(x,y,x,y) will be quicker

than filling in an oval.

I'm shocked that java wont let you plot a point.

Why isn't there a method plotPoint(x,y) or something???

I think I'll have to stick with drawLine for now.

That solution is even worse really.

Basically, I'm trying to draw a Mandelbrot set.

And I need to plot a few hundred thousand points,

after testing them to see if they satisfy:

P[^n](0) -/-> infinity as n->infinity,

where P(z)=z^2+c, and c is the point (x,y)=x+iy.

I think g.drawLine(x,y,x,y) will be quicker

than filling in an oval.

I'm shocked that java wont let you plot a point.

Why isn't there a method plotPoint(x,y) or something???

I think I'll have to stick with drawLine for now.

Ryan McGuire

Ranch Hand

Posts: 1143

9

posted 12 years ago

I don't know what your overall architecture is, but let me run this past you.

How about making an BufferedImage in memory, and then just displying it in one big kachunk?

How about making an BufferedImage in memory, and then just displying it in one big kachunk?

John M. Gabriele

Ranch Hand

Posts: 232

posted 12 years ago

Colin, to help other folks who might be following this discussion, it's best to keep your reply in the original thread. When I first started reading your thread, it starts right in with "That solution is even worse", but I didn't know what "that solution" was.

That said, here we are now, and you're trying to plot points with Java Swing/AWT. I'm about to be trying the same thing. What Ryan suggests is all I can find for the moment, so that's what I'm going to try soon too.

If it works out for you, please post some sample code for us.

That said, here we are now, and you're trying to plot points with Java Swing/AWT. I'm about to be trying the same thing. What Ryan suggests is all I can find for the moment, so that's what I'm going to try soon too.

If it works out for you, please post some sample code for us.

Carl Pettersson

Ranch Hand

Posts: 73

posted 12 years ago

I've done a bit of fractal drawing using the BufferedImage method setRGB(), doing and after the iteration is done draw it onscreen with Graphics.drawImage().

Ryan McGuire

Ranch Hand

Posts: 1143

9

posted 12 years ago

Would this be a reasonable forum to discuss (language independent) Mandlebrot Set program issues? I could ramble on for hours.

Ryan

Originally posted by colin shuker:

Basically, I'm trying to draw a Mandelbrot set.

And I need to plot a few hundred thousand points,

after testing them to see if they satisfy:

P[^n](0) -/-> infinity as n->infinity,

where P(z)=z^2+c, and c is the point (x,y)=x+iy.

Would this be a reasonable forum to discuss (language independent) Mandlebrot Set program issues? I could ramble on for hours.

Ryan

Rob Ross

Bartender

Posts: 2205

posted 12 years ago

One reason may be that in Java 2D, points are infinitely small. They have no spatial extent. A *range* of points, however, can be rendered, such as a line, or a rectangle.

Just my quick 2 cents.

[ June 25, 2005: Message edited by: Rob Ross ]

Originally posted by colin shuker:

I'm shocked that java wont let you plot a point.

Why isn't there a method plotPoint(x,y) or something???

One reason may be that in Java 2D, points are infinitely small. They have no spatial extent. A *range* of points, however, can be rendered, such as a line, or a rectangle.

Just my quick 2 cents.

[ June 25, 2005: Message edited by: Rob Ross ]

Rob

SCJP 1.4

Ryan McGuire

Ranch Hand

Posts: 1143

9

posted 12 years ago

But lines are infinitely narrow, so you shouldn't be able to see them either. You should need some type of area fill before you can see anything.

(I'm not saying you're wrong, just that Java is goofy.)

Ryan

Originally posted by Rob Ross:

One reason may be that in Java 2D, points are infinitely small. They have no spatial extent. A *range* of points, however, can be rendered, such as a line, or a rectangle.

But lines are infinitely narrow, so you shouldn't be able to see them either. You should need some type of area fill before you can see anything.

(I'm not saying you're wrong, just that Java is goofy.)

Ryan

Timmy Marks

Ranch Hand

Posts: 226

Ulf Dittmer

Rancher

Posts: 42972

73

posted 12 years ago

Can't pass up tooting my own horn: at http://www.ulfdittmer.com/simplemandel/index.html is an applet (with source code) that draws the Mandelbrot set for various exponents, and lets you zoom in and out. It has 12 built-in colors (the ones from java.awt.Color), but you can change those to any color sequence you like.

Ryan McGuire

Ranch Hand

Posts: 1143

9

posted 12 years ago

I like it. I especially like the optimation you made where you draw the outline of a rectangle first to see if all the border values are to be drawn black and then filling in the iterior if it is. I think I'm going to "steal" that for my version.

Ryan

Originally posted by Ulf Dittmer:

Can't pass up tooting my own horn: at http://www.ulfdittmer.com/simplemandel/index.html is an applet (with source code) ...

I like it. I especially like the optimation you made where you draw the outline of a rectangle first to see if all the border values are to be drawn black and then filling in the iterior if it is. I think I'm going to "steal" that for my version.

Ryan

Layne Lund

Ranch Hand

Posts: 3061

posted 12 years ago

I like it. Especially the optimizations as Ryan pointed out. My previous attempts at drawing the Mandlebrot set were much slower, mostly because I calculated each pixel rather than trying to come up with some scheme to draw a bounding rectangle.

So is it always true that if all the points along the border of a bounding rectangle converge then all the points on the interior also converge? Has this been proved mathematically?

Layne

Originally posted by Ulf Dittmer:

Can't pass up tooting my own horn: at http://www.ulfdittmer.com/simplemandel/index.html is an applet (with source code) that draws the Mandelbrot set for various exponents, and lets you zoom in and out. It has 12 built-in colors (the ones from java.awt.Color), but you can change those to any color sequence you like.

I like it. Especially the optimizations as Ryan pointed out. My previous attempts at drawing the Mandlebrot set were much slower, mostly because I calculated each pixel rather than trying to come up with some scheme to draw a bounding rectangle.

So is it always true that if all the points along the border of a bounding rectangle converge then all the points on the interior also converge? Has this been proved mathematically?

Layne

Timmy Marks

Ranch Hand

Posts: 226

posted 12 years ago

Well, according to this page, the Mandelbrot Set is simply connected. I don't have the math to understand the argument for it, but it should be enough to answer your first question in the affirmative.

So is it always true that if all the points along the border of a bounding rectangle converge then all the points on the interior also converge? Has this been proved mathematically?

Well, according to this page, the Mandelbrot Set is simply connected. I don't have the math to understand the argument for it, but it should be enough to answer your first question in the affirmative.

Ryan McGuire

Ranch Hand

Posts: 1143

9

posted 12 years ago

Yes but...

Now that I think about it, Ulfs code doesn't really check the entire border. It merely checks the border points at the pixel locations. A non-trivial "finger" of non-converging points might squeeze into the rectangle between two border points that get calculated as convergers.

I guess that makes the "rectangle trick" a "heuristic" instead of an "optimization".

Ryan

Originally posted by Timmy Marks:

Well, according to this page, the Mandelbrot Set is simply connected.

Yes but...

Now that I think about it, Ulfs code doesn't really check the entire border. It merely checks the border points at the pixel locations. A non-trivial "finger" of non-converging points might squeeze into the rectangle between two border points that get calculated as convergers.

I guess that makes the "rectangle trick" a "heuristic" instead of an "optimization".

Ryan

Ryan McGuire

Ranch Hand

Posts: 1143

9

posted 12 years ago

Ok, you asked for it.

Since both c and z are complex numbers the function to determine what color to draw each pixel is a four-paramter function:

public Color colorForPoint(double zReal, double zImag, double cReal, double cImag)

Or you could say that colorForPoint() defines a function in 4D space. It's just that for Mandlebrot set, you're rendering the 2D slice of that 4D space where zReal=0 and zImag=0.

When you hold cReal=0 and cImag=0 and vary z, you end up with what's called a Julia set.

What if you included a way to render ANY 2D slice through that 4D space? You could get some seriously funky pictures. My first shot at this (written in C back in the '80s some time) allowed you pick two of the paramters to hold constant, the constant values for those two and the limits for the other two (varying) variables. So the setup for a Mandlebrot set would be something like (zReal, 0, zImag, 0, cReal, -2, 2, cImag, -2, 2)

BUT...

A way that would be even more flexible to define your favorite slice through 4 space would be to use a matrix to define a couple parametric equations to tell what 4-space point corresponds to each 2-space pixel. Since all the relationships are linear, coming up with the matrix coefficients shouldn't be too hard.

Example (mandlebrot): Your image coordinates are 0<=X<=100 and 0<=Y<=100. You want (0,0) to show colorForPoint(0, 0, -1, 1). (100, 0) ==> (0, 0, 1, 1). (0, 100) ==> (0, 0, -1, -1). Apply a little linear algebra and we find that zReal = 0X + 0Y + 0; zImag = 0X + 0Y + 0; cReal = .02X + 0Y - 1; cImag = 0X - .02Y + 1.

In matrix form, that's

The only piece I'm missing is an intuitively obvious user interface that allows the user to specify the parameters using simple mouse/keyboard gestures. Dragging on one image to zoom in on a specific section is obvious, but what gestures could be used to rotate the image plane into/out of the current plane? ...especially when there are TWO other dimensions to rotate through? I'm working on some custom Swing widgets for it.

If anyone sees any problem with my math, please let me know.

Ryan

[ July 11, 2005: Message edited by: Ryan McGuire ]

Originally posted by Timmy Marks:

Please feel free to ramble.

Ok, you asked for it.

Since both c and z are complex numbers the function to determine what color to draw each pixel is a four-paramter function:

public Color colorForPoint(double zReal, double zImag, double cReal, double cImag)

Or you could say that colorForPoint() defines a function in 4D space. It's just that for Mandlebrot set, you're rendering the 2D slice of that 4D space where zReal=0 and zImag=0.

When you hold cReal=0 and cImag=0 and vary z, you end up with what's called a Julia set.

What if you included a way to render ANY 2D slice through that 4D space? You could get some seriously funky pictures. My first shot at this (written in C back in the '80s some time) allowed you pick two of the paramters to hold constant, the constant values for those two and the limits for the other two (varying) variables. So the setup for a Mandlebrot set would be something like (zReal, 0, zImag, 0, cReal, -2, 2, cImag, -2, 2)

BUT...

A way that would be even more flexible to define your favorite slice through 4 space would be to use a matrix to define a couple parametric equations to tell what 4-space point corresponds to each 2-space pixel. Since all the relationships are linear, coming up with the matrix coefficients shouldn't be too hard.

Example (mandlebrot): Your image coordinates are 0<=X<=100 and 0<=Y<=100. You want (0,0) to show colorForPoint(0, 0, -1, 1). (100, 0) ==> (0, 0, 1, 1). (0, 100) ==> (0, 0, -1, -1). Apply a little linear algebra and we find that zReal = 0X + 0Y + 0; zImag = 0X + 0Y + 0; cReal = .02X + 0Y - 1; cImag = 0X - .02Y + 1.

In matrix form, that's

The only piece I'm missing is an intuitively obvious user interface that allows the user to specify the parameters using simple mouse/keyboard gestures. Dragging on one image to zoom in on a specific section is obvious, but what gestures could be used to rotate the image plane into/out of the current plane? ...especially when there are TWO other dimensions to rotate through? I'm working on some custom Swing widgets for it.

If anyone sees any problem with my math, please let me know.

Ryan

[ July 11, 2005: Message edited by: Ryan McGuire ]