
Show HN: A WebGL-based Complex Expression Parser and Plotter - brandonpelfrey
https://github.com/brandonpelfrey/complex-function-plot
======
Keyframe
Heh nice, here's a rotozoomer: [http://brandonpelfrey.github.io/complex-
function-plot/?expre...](http://brandonpelfrey.github.io/complex-function-
plot/?expression=eippXigxK3QpK3oqdA==)

edit: a nicer rotozoom: [http://brandonpelfrey.github.io/complex-function-
plot/?expre...](http://brandonpelfrey.github.io/complex-function-
plot/?expression=KHoqNCkqaV4oMSt0KSsoeipwaSkqdA==)

------
BenoitP
Very nice!

I have spend the last hour trying to display the Poincaré disk[1], but to no
avail.

I have z * ( cos(1.57 * (a^2+b^2+1)^(1/2)) / sin(1.57 * (a^2+b^2+1)^(1/2)) ),
which project the coordinates to the infinite on a circle. But this is only a
fancy zoom, straight lines are not projected to circles.

[1][https://en.wikipedia.org/wiki/Poincar%C3%A9_disk_model](https://en.wikipedia.org/wiki/Poincar%C3%A9_disk_model)

~~~
marcosscriven
From the docs:

"It's important to note that When rendering with these infinitely-tiled
images, the mapping that is rendered is actually the inverse of the function
given. This is because it is prohibitively expensive to compute images of the
function itself. (In fact, we are rendering a kind of "pull-back".)
Specifically, when rendering a pixel in the image, the location of that pixel
in the complex plane is passed to your function, which produces a complex
value. That transformed value specifies a location in the original image. This
procedure is fast, but plots the inverse of the function given. So, if you
want to plot e.g. log(z), then you should instead put in e^z."

~~~
brandonpelfrey
Yeah, this seemed kind of "unfortunate" when I started this project, but it
still turned out to be an interesting/fun toy.

The issue is that when you compute where f(z) sends each point in the complex
plane to, you would need to color in the pixel corresponding to that
transformed point. f() is user-defined, so it could be a very weird function
that could cover some portions of the image we're trying to draw but not
others, etc. Moreover, even if I had some kind of procedure for determining
which x's to sample so f(x) lay inside the image we're trying to draw, it's
not amenable to GLSL. This is typically referred to scatter vs. gather-type
operations.

------
arcatek
Note that you can apparently use the `t` variable to express time.

Ex: t*z

~~~
brandonpelfrey
I should probably try to find a way to make it clearer what all can be done,
or make it more obvious where the documentation is ("t" is mentioned there.)

------
VikingCoder
z ^ z

I love thinking about this, as it goes negative.

