From 5374c80b1563bf351eacf62d70b54b4114e8dab5 Mon Sep 17 00:00:00 2001
From: Christopher Diggins <cdiggins@gmail.com>
Date: Thu, 21 Mar 2024 20:25:33 -0400
Subject: [PATCH] Resolved all of the remaining symbol resolution errors.

---
 PlatoCompiler/Symbols/TypeExpression.cs          |  2 +-
 PlatoStandardLibrary/std.angles.library.plato    |  8 ++++----
 PlatoStandardLibrary/std.geometry.concepts.plato | 11 +++++++++--
 PlatoStandardLibrary/std.geometry.types.plato    | 13 ++++++-------
 PlatoStandardLibrary/std.measures.library.plato  |  2 +-
 PlatoStandardLibrary/std.numerics.library.plato  |  5 ++++-
 PlatoStandardLibrary/std.types.plato             | 12 ++++++++++++
 7 files changed, 37 insertions(+), 16 deletions(-)

diff --git a/PlatoCompiler/Symbols/TypeExpression.cs b/PlatoCompiler/Symbols/TypeExpression.cs
index 0572380..ae22e32 100644
--- a/PlatoCompiler/Symbols/TypeExpression.cs
+++ b/PlatoCompiler/Symbols/TypeExpression.cs
@@ -8,7 +8,7 @@ namespace Plato.Compiler.Symbols
 {
     public class TypeExpression : Symbol
     {
-        public override string Name => Definition?.Name ?? throw new Exception("Unresolved");
+        public override string Name => Definition?.Name ?? "_untyped_";
         public TypeDefinition Definition { get; }
         public IReadOnlyList<TypeExpression> TypeArgs { get; }
             
diff --git a/PlatoStandardLibrary/std.angles.library.plato b/PlatoStandardLibrary/std.angles.library.plato
index 8e00745..c57eb1e 100644
--- a/PlatoStandardLibrary/std.angles.library.plato
+++ b/PlatoStandardLibrary/std.angles.library.plato
@@ -69,9 +69,9 @@ library Angles
     //==
     // Complex plane trig: https://en.wikipedia.org/wiki/Trigonometric_functions#In_the_complex_plane
 
-    Sin(x: Complex): Complex
-        => (x.Sin * y.Cosh, x.Cos * y.Sinh);
+    Sin(c: Complex): Complex
+        => (c.X.Sin * c.Y.Cosh, c.X.Cos * c.Y.Sinh);
 
-    Cos(x: Complex): Complex
-        => (x.Cos * y.Cosh, x.Sin * y.Sinh);
+    Cos(c: Complex): Complex
+        => (c.X.Cos * c.Y.Cosh, c.X.Sin * c.Y.Sinh);
 }
diff --git a/PlatoStandardLibrary/std.geometry.concepts.plato b/PlatoStandardLibrary/std.geometry.concepts.plato
index 08d05c0..919fb97 100644
--- a/PlatoStandardLibrary/std.geometry.concepts.plato
+++ b/PlatoStandardLibrary/std.geometry.concepts.plato
@@ -223,6 +223,13 @@ concept ImplicitVolume
     inherits Geometry3D, ImplicitProcedural<Point3D>
 { }
 
+// Any geometrical concept defined by a finite number of points 
+concept Points2D
+    inherits Geometry2D
+{ 
+    Points(x: Self): Array<Point2D>;
+}
+
 // Any geometrical concept defined by a finite number of points 
 concept Points3D
     inherits Geometry3D
@@ -232,13 +239,13 @@ concept Points3D
 
 // https://en.wikipedia.org/wiki/B%C3%A9zier_surface
 concept BezierPatch
-    inherits Points3D, Surface3D, Array2D<Point3D>    
+    inherits Points3D, Surface, Array2D<Point3D>    
 { }
 
 // A grid of bezier patches  
 // https://en.wikipedia.org/wiki/B%C3%A9zier_surface
 concept BezierSurface
-    inherits Points3D, Surface3D, Array2D<BicubicBezierPatch>    
+    inherits Points3D, Surface, Array2D<BicubicBezierPatch>    
 { }
 
 // https://en.wikipedia.org/wiki/Polyhedron
diff --git a/PlatoStandardLibrary/std.geometry.types.plato b/PlatoStandardLibrary/std.geometry.types.plato
index 1c1674a..36ec502 100644
--- a/PlatoStandardLibrary/std.geometry.types.plato
+++ b/PlatoStandardLibrary/std.geometry.types.plato
@@ -10,7 +10,7 @@ type Point2D
 }
 
 type Line2D
-    implements OpenPolygon2D
+    implements PolygonalChain2D
 {
     A: Point2D;
     B: Point2D;
@@ -147,7 +147,7 @@ type Point3D
 }
 
 type Line3D
-    implements OpenPolygon3D
+    implements PolygonalChain3D
 {
     A: Point3D;
     B: Point3D;
@@ -221,10 +221,9 @@ type BicubicBezierPatch
     K22: Point3D;
 }
 
-
 // https://en.wikipedia.org/wiki/B%C3%A9zier_curve    
 type CubicBezier2D
-    implements PointsGeometry2D
+    implements Points2D
 {
     A: Point2D;
     B: Point2D;
@@ -234,7 +233,7 @@ type CubicBezier2D
 
 // https://en.wikipedia.org/wiki/B%C3%A9zier_curve
 type CubicBezier3D
-    implements PointsGeometry3D
+    implements Points3D
 {
     A: Point3D;
     B: Point3D;
@@ -244,7 +243,7 @@ type CubicBezier3D
 
 // https://en.wikipedia.org/wiki/B%C3%A9zier_curve
 type QuadraticBezier2D
-    implements PointsGeometry2D
+    implements Points2D
 {
     A: Point2D;
     B: Point2D;
@@ -253,7 +252,7 @@ type QuadraticBezier2D
 
 // https://en.wikipedia.org/wiki/B%C3%A9zier_curve
 type QuadraticBezier3D
-    implements PointsGeometry3D
+    implements Points3D
 {
     A: Point3D;
     B: Point3D;
diff --git a/PlatoStandardLibrary/std.measures.library.plato b/PlatoStandardLibrary/std.measures.library.plato
index 94da076..d32f295 100644
--- a/PlatoStandardLibrary/std.measures.library.plato
+++ b/PlatoStandardLibrary/std.measures.library.plato
@@ -211,6 +211,6 @@ library Measures
         => length.Meters / Constants.MetersPerAU;
     
     HubbleLength(length: Length): Number 
-        => value.Meters / 1.HubbleLength.Meters;
+        => length.Meters / 1.HubbleLength.Meters;
 }
     
diff --git a/PlatoStandardLibrary/std.numerics.library.plato b/PlatoStandardLibrary/std.numerics.library.plato
index 6a505f5..b2dcec3 100644
--- a/PlatoStandardLibrary/std.numerics.library.plato
+++ b/PlatoStandardLibrary/std.numerics.library.plato
@@ -104,7 +104,10 @@ library Numerical
         => (x-y).Abs <= x.MultiplyEpsilon(y);
 
     AlmostZero(x: Number): Boolean
-        => x.Abs < Epsilon; 
+        => x.Abs < Epsilon;
+
+    AlmostZeroOrOne(x: Number): Boolean
+        => AlmostEqual(x, 0) || AlmostEqual(x, 1);
 
     Lerp(a: ScalarArithmetic, b: ScalarArithmetic, t: Number): ScalarArithmetic
         => a * t.FromOne + b * t;
diff --git a/PlatoStandardLibrary/std.types.plato b/PlatoStandardLibrary/std.types.plato
index d4a62bb..440d59b 100644
--- a/PlatoStandardLibrary/std.types.plato
+++ b/PlatoStandardLibrary/std.types.plato
@@ -435,6 +435,18 @@ type NumberInterval
     Max: Number;
 }
 
+// Affine 2D transformation matrix 
+// https://en.wikipedia.org/wiki/Transformation_matrix#Affine_transformations
+type Matrix2D 
+    implements Value, Vector
+{
+    Column1: Vector3D;   
+    Column2: Vector3D;   
+    Column3: Vector3D;   
+}
+
+// Affine 3D transformation matrix 
+// https://en.wikipedia.org/wiki/Transformation_matrix#Affine_transformations
 // https://mindcontrol.org/~hplus/graphics/matrix-layout.html
 // Column major layout in memory 
 // Translation component is in Column4.XYZ