Moore curve drawn with epicycles

  • 7 Replies
  • 792 Views

0 Members and 1 Guest are viewing this topic.

Offline Fraktalist

  • *
  • Administrator
  • *******
  • Strange Attractor
  • Posts: 1160
« on: August 18, 2017, 12:48:45 PM »



Linkback: https://fractalforums.org/share-a-fractal/22/moore-curve-drawn-with-epicycles/109/
« Last Edit: August 18, 2017, 01:46:55 PM by Frank Fraktalist »

Offline Softology

  • *
  • Fractal Phenom
  • ****
  • Posts: 44
« Reply #1 on: September 02, 2017, 10:25:52 PM »
Interesting.  Previously I have seen the "Fractal Spirographs", ie

https://softologyblog.wordpress.com/2017/02/27/fractal-spirographs/

https://youtu.be/OV_Yoqv9B-4

Your example seems to vary the direction of rotation between circles for different results.  Any more info on these?

Offline Fraktalist

  • *
  • Administrator
  • *******
  • Strange Attractor
  • Posts: 1160
« Reply #2 on: September 02, 2017, 10:31:00 PM »
nope - nothing, I just stumbled upon that gif at reddit...

nice avatar btw!

Offline RedshiftRider

  • *
  • Global Moderator
  • *******
  • Dendritic Entity
  • Posts: 180
  • Dagomar Schreuder
    • Youtube
« Reply #3 on: September 03, 2017, 11:37:32 AM »
Cool

Offline claude

  • *
  • 3f
  • ******
  • Posts: 1342
    • mathr.co.uk
« Reply #4 on: September 22, 2017, 12:28:08 PM »
I had a go at something inspired by this, animated gif:



Code: [Select]
#include <complex.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <fftw3.h>

int main()
{
  int width = 0, height = 0;
  scanf("P6\n%d %d\n255", &width, &height);
  if ('\n' != getchar()) return 1;
  int bytes = 3 * width * height;
  unsigned char *img = malloc(bytes);
  fread(img, bytes, 1, stdin);
  int x, y;
  for (y = 0; y < height; ++y)
  {
    for (x = 0; x < width; ++x)
      if (! img[((width * y) + x) * 3]) break;
    if (! img[((width * y) + x) * 3]) break;
  }
  int x0 = x, y0 = y;
  const int d[8][2] = { { -1, 0 }, { -1, -1 }, { 0, -1 }, { 1, -1 }, { 1, 0 }, { 1, 1 }, { 0, 1 }, { -1, 1 } };
  int dir = 0;
  double _Complex *fin = fftw_malloc(width * height * sizeof(*fin));
  int n = 0;
  do
  {
    for (int ddir = 0; ddir < 8; ++ddir)
    {
      int dd = (dir + ddir) & 7;
      int x1 = x + d[dd][0];
      int y1 = y + d[dd][1];
      int k = ((width * y1) + x1) * 3;
      if (img[k] < 0xFF && img[k+1] < 0xFF)
      {
        img[k] = 0xFF;
        dir = (dd + 5) & 7;
        x = x1;
        y = y1;
        fin[n++] = x + I * y;
        break;
      }
    }
  } while (x != x0 || y != y0);
  double _Complex *fout = fftw_malloc(n * sizeof *fout);
  double _Complex *iin  = fftw_malloc(n * sizeof *iin);
  double _Complex *iout = fftw_malloc(n * sizeof *iout);
  fftw_plan pf = fftw_plan_dft_1d(n, fin, fout, FFTW_FORWARD, FFTW_ESTIMATE);
  fftw_plan pi = fftw_plan_dft_1d(n, iin, iout, FFTW_BACKWARD, FFTW_MEASURE);
  fftw_execute(pf);
  int k = 0;
  for (double m = 1; m <= n/2; m *= pow(2, 1.0/12.0))
  {
    memset(iin, 0, n * sizeof(*iin));
    for (int j = 0; j < m ; ++j)
    {
      iin[j] = fout[j];
      if (j > 0) iin[n-j] = fout[n-j];
    }
    fftw_execute(pi);
    for (int j = 0; j < n ; ++j)
    {
      iout[j] /= n;
    }
    char filename[100];
    snprintf(filename, 100, "%05d.svg", k++);
    FILE *s = fopen(filename, "wb");
    fprintf(s, "<?xml version='1.0' encoding='UTF-8'?><!DOCTYPE svg PUBLIC '-//W3C//DTD SVG 1.1//EN' 'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'><svg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' width='%d' height='%d' viewBox='0 0 %d %d'><rect x='0' y='0' width='%d' height='%d' stroke='none' fill='white' /><path stroke='black' stroke-width='1' fill='none' d='M %f %f L ", width, height, width, height, width, height, creal(iout[0]), cimag(iout[0]));
    for (int j = 1; j < n; ++j)
      fprintf(s, "%f %f ", creal(iout[j]), cimag(iout[j]));
    fprintf(s, "%f %f Z'/></svg>\n", creal(iout[0]), cimag(iout[0]));
    fclose(s);
  }
  printf("P6\n%d %d\n255\n", width, height);
  fwrite(img, bytes, 1, stdout);
  fflush(stdout);
  free(img);
  return 0;
}

EDIT: seems animgif no worky in the forum (preview is a jpeg, view image in lightbox shows only the first frame in a tiny gif)  so I detached the image

Offline v

  • *
  • Fractal Fanatic
  • ***
  • Posts: 35
« Reply #5 on: November 01, 2017, 05:28:52 PM »
Nice, I think just about any curve can be interpolated with a parametrization consisting of a finite (or infinite) sum of sinusoids.  The author probably has an expression that takes the order of the curve and gives you an expression for a sum of sinusoids with a number of terms corresponding to the order of the fractal, which would be interesting to see.  This begs the question, is the fourier series a fractal in some way?


Offline Fraktalist

  • *
  • Administrator
  • *******
  • Strange Attractor
  • Posts: 1160
« Reply #6 on: November 01, 2017, 08:58:01 PM »
hm. I only know fourier synthesis from music, synthesizers. You use many sinewaves and modify each frequencies volume to simulate certain sounds, even speech.
for those who never heard of this https://www.youtube.com/watch?v=NaVkEvA0g-k

In my understanding it does the same thing. Different sized circles(sine waves) create different frequencies. As long as every circle has the same volume it is very much like that hilbert-curve (just visualized differently).
But it adds another parameter, volume(circle size) that is changing over time.

Interesting, never thought of it that way.

Offline Bill Snowzell

  • *
  • Fractal Feline
  • **
  • Posts: 155
« Reply #7 on: November 11, 2017, 01:27:56 PM »
All the rage in the mid to late 60's...yes I am that old.   :))


http://nathanfriend.io/inspirograph/


xx
Elliptic curve group operator

Started by gornvix on Fractal Mathematics And New Theories

0 Replies
230 Views
Last post December 31, 2017, 07:03:09 PM
by gornvix
xx
HLF ? Math ⇔ Art exhibition - altenerate ways to display Gosper Curve

Started by kram1032 on Share a fractal

1 Replies
583 Views
Last post September 30, 2018, 05:55:38 PM
by Kalter Rauch