From 55e38d49f4f0efbf9baf96c23278e19add3f02dc Mon Sep 17 00:00:00 2001 From: MarcUs7i <96580944+MarcUs7i@users.noreply.github.com> Date: Wed, 9 Oct 2024 08:33:24 +0200 Subject: [PATCH] modified from side drawing to point drawing --- PinwheelTiling/PinwheelTilingPath.cs | 96 +++++++++++++++++++++++++--- 1 file changed, 88 insertions(+), 8 deletions(-) diff --git a/PinwheelTiling/PinwheelTilingPath.cs b/PinwheelTiling/PinwheelTilingPath.cs index b26b9e7..01ff6ec 100644 --- a/PinwheelTiling/PinwheelTilingPath.cs +++ b/PinwheelTiling/PinwheelTilingPath.cs @@ -1,4 +1,5 @@ -using Avalonia.Controls.Selection; +using System.Reflection.Metadata; +using Avalonia.Controls.Selection; using LeoTurtle; namespace PinwheelTiling; @@ -23,27 +24,106 @@ public static class PinwheelTilingPath const double sideA = 40.0D; const double sideB = 80.0D; double sideC = CalculateHyptonuse(sideA, sideB); - MakeTriangle(turtle, sideA, sideB, sideC); + + _endPoint = new Point(_startPoint.X + sideB, _startPoint.Y + sideA); + Triangle triangle = MakeTriangle(_startPoint, _endPoint); + Triangle[] subdivision = GetSubdivision(triangle); + + DrawSubdivision(turtle, subdivision); } - // TODO - implement your algorithm - private static void MakeTriangle(SmartTurtle turtle, double sideA, double sideB, double sideC) + private static Triangle MakeTriangle(Point startingPoint, + Point endingPoint) { + Point pointA = startingPoint; + Point pointB = endingPoint; + Point pointC = new Point(endingPoint.X, startingPoint.Y); + + return new Triangle(pointA, pointB, pointC); + } + + private static Triangle[] GetSubdivision(Triangle triangle) + { + double sideA = triangle.B.Y - triangle.C.Y; + double sideB = triangle.C.X - triangle.A.X; + double sideC = CalculateHyptonuse(sideA, sideB); + Point startingPoint = new Point(triangle.A.X, triangle.A.Y); + Point endingPoint = new Point(triangle.B.X, triangle.B.Y); + + //calculate parent sides double height = CalculateHeight(sideA, sideB, sideC); double sideE = height / 2; - double sideF = CalculateHyptonuse(sideE, height); - _endPoint = new Point(_startPoint.X + sideB, _startPoint.Y + sideA); + //double sideF = CalculateHyptonuse(sideE, height); - //Draw it now - DrawTriangle(turtle, sideA, sideB, sideC, height, sideE, sideF); + //calculate additional sides that are part of the parent triangle + double sideB1 = sideB / 2; + double sideC1 = Math.Sqrt(Math.Pow(sideA, 2) - Math.Pow(height, 2)); + //double sideC2; + double sideC3 = Math.Sqrt(Math.Pow(sideB1, 2) - Math.Pow(sideE, 2)); + + //calculate additional sides that are |not part/not important at all| for the parent triangle + double heightOfTriangle0 = CalculateHeight(sideC1, height, sideA); + double heightOfTriangle1 = CalculateHeight(sideE, height, sideB1); + double heightOfTriangle2 = CalculateHeight(sideE, sideC3, sideB1); + double sideB1SegmentOfTriangle1 = Math.Sqrt(Math.Pow(sideE, 2) - Math.Pow(heightOfTriangle1, 2)); + double sideB1SegmentOfTriangle2 = Math.Sqrt(Math.Pow(sideE, 2) - Math.Pow(heightOfTriangle2, 2)); + double heightOfAllExceptTriangle0 = CalculateHeight(height, sideC - sideC1, sideB); + double sideB1SegmentOfAllTrianglesExcept0 + = Math.Sqrt(Math.Pow(sideC - sideC1, 2) - Math.Pow(heightOfAllExceptTriangle0, 2)); + + //create Points + Point pointA = startingPoint; + Point pointB = endingPoint; + Point pointC = new Point(endingPoint.X, startingPoint.Y); + Point pointD = new Point(startingPoint.X + sideB1SegmentOfAllTrianglesExcept0, startingPoint.Y + heightOfAllExceptTriangle0); + Point pointE = new Point(startingPoint.X + sideB1 - sideB1SegmentOfTriangle2, startingPoint.Y + heightOfTriangle2); + Point pointF = new Point(startingPoint.X + sideB1, startingPoint.Y); + Point pointH = new Point(startingPoint.X + sideB - sideB1SegmentOfTriangle1, startingPoint.Y + heightOfTriangle1); + + Triangle triangle0 = new Triangle(pointC, pointB, pointD); + Triangle triangle1 = new Triangle(pointF, pointC, pointH); + Triangle triangle2 = new Triangle(pointA, pointF, pointE); + Triangle triangle3 = new Triangle(pointF, pointD, pointH); + Triangle triangle4 = new Triangle(pointD, pointF, pointE); + + Triangle[] subdivisionTriangles = { triangle0, triangle1, triangle2, triangle3, triangle4 }; + + return subdivisionTriangles; double CalculateHeight(double a, double b, double c) { + //using Heron's formula double s = (a + b + c) / 2; return (2 / c) * Math.Sqrt(s * (s - a) * (s - b) * (s - c)); } } + private static void DrawSubdivision(SmartTurtle turtle, Triangle[] subdivision) + { + foreach (var triangle in subdivision) + { + DrawSimpleTriangle(turtle, triangle); + } + } + + private static void DrawSimpleTriangle(SmartTurtle turtle, Triangle triangle) + { + turtle.Teleport(triangle.A.X, triangle.A.Y); + + double sideAB = DistanceBetweenPoints(triangle.A, triangle.B); + double sideBC = DistanceBetweenPoints(triangle.B, triangle.C); + double sideCA = DistanceBetweenPoints(triangle.C, triangle.A); + + turtle.LookAt(triangle.B.X, triangle.B.Y); + turtle.MoveForward(sideAB); + + turtle.LookAt(triangle.C.X, triangle.C.Y); + turtle.MoveForward(sideBC); + + turtle.LookAt(triangle.A.X, triangle.A.Y); + turtle.MoveForward(sideCA); + } + private static void DrawTriangle(SmartTurtle turtle, double a, double b, double c, double h, double e, double f) { //Draw base triangle