# Koch Star

![T-Spine visualization of Koch curve structure](https://1430428134-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ld8QK19sjP1I9rhLouo%2F-Ml8OgfMNKjTIa58Qnqb%2F-Ml8OvtgRWDXhwMFx-1N%2Fkoch_2021-10-04_08-56-34.png?alt=media\&token=9a78cac8-494e-4cb1-be43-456fb45047c0)

```
def k1 (p:var[]..[])
{
	v1 = Vector.ByTwoPoints(p[0],p[1]).Normalized();
	d1 = p[0].DistanceTo(p[1]);
	p1 = p[0].Translate(v1,d1/3);
	v2 = v1.Rotate(Vector.ZAxis(),60);
	p2 = p1.Translate(v2,d1/3);
	p3 = p1.Translate(v1,d1/3);
	return [p[0],p1,p2,p3,p[1]];
};
```

![](https://1430428134-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ld8QK19sjP1I9rhLouo%2F-MlA7MxcugdJlBYcyfTy%2F-MlA9LDroo3GpXvf3Ahq%2Fkoch2_2021-10-04_05-23-49.png?alt=media\&token=c8c2f850-9536-48ea-ab14-d1b93bf5652a)

With Loops

```

def k2 (pts:var[]..[])
{
	p1 = List.DropItems(List.Sublists(pts,0..1,1),-1);
	p2 = k1(p1<1>);
	p3 = Point.PruneDuplicates(List.Flatten(p2,-1),0.1);
	return List.AddItemToEnd(p3[0],p3);
};

def k3 (pt:var[]..[],it:int)
{
	a = [Imperative]
	{
		c = 0;
		b = [];
		while (c < it)
		{
			b = k2(pt);
			pt = b;
			c = c + 1;
		}
		return b;
	}
	return a;
};
```

![](https://1430428134-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ld8QK19sjP1I9rhLouo%2F-MlA7MxcugdJlBYcyfTy%2F-MlA9QuB3m0dnPiwNZVA%2Fkoch2_2021-10-04_05-21-10.png?alt=media\&token=9c5f709e-6069-4abd-a5ff-d34b85f87e2e)

With Recursion

```

def k2(pts:var[]..[],n:int[]..[])
{
	a = [Imperative]
	{
		if (List.Count(pts)>=Math.Pow(5,n))
			return pts;
		else
		{
			b = [Associative]
			{
				p1 = List.DropItems(List.Sublists(pts,0..1,1),-1);
				p2 = k1(p1<1>);
				p3 = List.Flatten(p2,-1);
				return p3;
			}
			return Point.PruneDuplicates(k2(b,n),0.1);
		}
	}
	b = List.Clean(List.Flatten(a,-1),false);
	return List.AddItemToEnd(List.FirstItem(b),b);
};
```

![](https://1430428134-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ld8QK19sjP1I9rhLouo%2F-MlA7MxcugdJlBYcyfTy%2F-MlA9dNoDk0amjQ3LurK%2Fkoch2_2021-10-04_05-19-54.png?alt=media\&token=b1120bb8-b332-489a-9e0c-3df3ea07b944)

Visualization with T-Splines

```
// T Spline Visualization
p001 = List.Transpose(Circle.ByCenterPointRadius(Point.Origin(),
[50,35,25,5])<1>.PointAtParameter((1..0..#4)<2>));
p002 = k2(p001<1>,2).Translate(Vector.ZAxis(),[0,10,15,60]);
pc01 = PolyCurve.ByPoints(List.Transpose(p002));
pc02 = PolyCurve.ByPoints(pc01.PointAtParameter((0..1..#10)<1>));
ts01 = TSplineSurface.BuildPipes(List.Flatten(pc01.Explode(),-1),
1.5,0.1,3,true,false,0,0,1,0.3,1,1,true);
ts02 = TSplineSurface.BuildPipes(pc02.Explode(),2..0.2..#10,
2..0.2..#10,3,true,false,0,0,1,0.3,1,1,true);
ts03 = TSplineSurface.ByCombinedTSplineSurfaces
(List.Flatten([ts01,ts02],-1)).Translate(150,0,0);
```

{% file src="<https://1430428134-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-Ld8QK19sjP1I9rhLouo%2Fuploads%2F3iWq7g088tWCMwklmLRg%2Fkoch.stl?alt=media&token=46e6215f-26ee-4eff-b7da-1e68a5c18f9d>" %}
STL file
{% endfile %}
