Prosolve Pattern

someone has succeeded in writing an algorithm to do this pattern? can you help me? This is driving me crazy. I got some progress, but I am still far from the solution

FivePattern.ByPlaneRadius.dyf (12.3 KB)

ProsolvePattern-v02.dyf (28.8 KB)

1 Like

Hi Ricardo,

The polygonal pattern underpinning your image appears to be a Rhombus Penrose tiling (P3):

There are a variety of ways to construct these tilings; many of the easiest ways use some kind of substitution scheme, like L-systems.

I have been meaning to write a Dynamo wrapper for my C++ L-systems library; your post may finally spur me to do it!

Depending on what your ultimate goal is and how quickly you need to do it, I could help brainstorm some possible directions to go. The geometric approach you’re starting out with is possible, but as the tiling is aperiodic, it’ll be challenging. You could also use an existing L-systems tool like the one in Inkscape to produce an SVG version of the pattern, and then bring it into Dynamo with SVG import.

Good luck!
Mike

Hello Michael,
really it is a Penrose tiling, however a variation. And because of that, it was a little complicated for me.

First I tried this aproach
http://preshing.com/20110831/penrose-tiling-explained/

It seemed quite simple, even for already be in Python. But the result did not go as expected.

After a little more research, I found this other possibility. I’m trying to implement it. I’m actually trying to understand it first … LOL

The Google Translator has been my friend in this case … LOL

http://www.wissenschaft-online.de/spektrum/projekt/quasi12.htm

Thank you for your attention and your help will be very welcome.

1 Like

I got the grid algorithm in the latter approach.

penrose-v00.dyn (21.6 KB)

This looks like fun! Here’s a DesignScript translation of the python example you posted above:

def sub1(tri:var[]){
col = tri[0];
a = tri[1].AsVector();
b = tri[2].AsVector();
c = tri[3].AsVector();
return = [Imperative]{
    if (col == 0){
        p = a.Add(b.Subtract(a).Scale(1/Math.GoldenRatio) ).AsPoint();
        a = a.AsPoint();
        b = b.AsPoint();
        c = c.AsPoint();
        return = {{0, c, p, b}, {1, p, c, a}};
    }
    else {
        q = b.Add(a.Subtract(b).Scale(1/Math.GoldenRatio) ).AsPoint();
        r = b.Add(c.Subtract(b).Scale(1/Math.GoldenRatio) ).AsPoint();
        a = a.AsPoint();
        b = b.AsPoint();
        c = c.AsPoint();
        return = {{1, r, c, a}, {1, q, r, b}, {0, r, q, a}};
    }
}};

def sub2(tri:var[][], n){
return = [Imperative]{
    for (i in 1..n){
        tri = List.Flatten(sub1(tri), 1);
    }
    return = tri;
}};

def surf1(tri:var[]){
sf = Surface.ByPerimeterPoints(List.RestOfItems(tri) );
red = Color.ByARGB(255,255,55,55);
blue = Color.ByARGB(255,55,55,255);
return = tri[0] == 0 ? Display.ByGeometryColor(sf, red) :
         Display.ByGeometryColor(sf, blue);
};

Calculating past 5 subdivisions gets progressively slower… You can also vary the circle divisions to deform the pattern. After 25 divisions, the stars start to look really psychedelic :smiley:

10 Likes

Pretty awesome Dimitar. I’ll try it. Thank you!