2017-01-23 2 views
0

Ich versuche, das Spiralmuster in dem abgebildeten Bild für ein neurowissenschaftliches Experiment zu rekonstruieren. Grundsätzlich hat das Muster die folgenden Eigenschaften:Funktion zum Erstellen von Spiralstreifen mit 45 Grad Orientierung zu Radial?

1) Jeder Teil der Spirale hat eine lokale Ausrichtung von 45 Grad nach radial 2) Die Dicke jedes Arms der Spirale steigt in direktem Verhältnis zum Radius.

Idealerweise möchte ich in der Lage sein, die Anzahl der Arme der Spirale nach Bedarf parametrisch zu variieren. Sie können den leeren Kreis in der Mitte und die kreisförmigen Grenzen ignorieren, diese sind sehr einfach hinzuzufügen.

Weiß jemand, ob es eine Funktion in Bezug auf die Anzahl der Spiralarme und die lokale Ausrichtung gibt, die dieses Spiralmuster rekonstruieren könnte? Für das, was es wert ist, bin ich in Matlab, obwohl, wenn jemand die mathematische Formel hat, kann ich es selbst kein Problem implementieren.

Red Spiral

+0

Eigenschaften 1 und 2 haben eine Lösung, die als logarithmische Spirale, aber das sieht anders aus auf Ihre Bild - also muss eine weitere fehlende Eigenschaft vorhanden sein. Die logarithmische Spirale hat "gerade" Arme (die konform denken), aber deine sieht gekrümmter aus, also ist vielleicht die fehlende Eigenschaft über die Krümmung? – Claude

Antwort

1

Ihr Bild Spirale nicht erfüllt Ihre Eigenschaft 1, wie durch die über die Spirale mit einer blätterte Kopie (die Winkel an der Außenkante sind senkrecht zur radialen Richtung als 45deg gesehen werden kann, und parallel an der Innenkante):

spiral not satisfying properties

Wie ich kommentierte eine logarithmische Spirale beiden Eigenschaften erfüllen kann. Ich setzte es in GLSL Fragmentarium verwenden, hier ist der Code:

#include "Progressive2D.frag" 

#group Spiral 
uniform int Stripes; slider[1,20,100] 

const float pi = 3.141592653589793; 

vec2 cLog(vec2 z) 
{ 
    return vec2(log(length(z)), atan(z.y, z.x)); 
} 

vec3 color(vec2 p) 
{ 
    float t = radians(45.0); 
    float c = cos(t); 
    float s = sin(t); 
    mat2 m = mat2(c, -s, s, c); 
    vec2 q = m * cLog(p); 
    return vec3(float 
    ( mod(float(Stripes) * q.y/(sqrt(2.0) * pi), 1.0) < 0.5 
    || length(p) < 0.125 
    || length(p) > 0.875 
    )); 
} 

Und die Ausgabe:

spiral satisfying properties