Pretty sure I'm done with triangle. Changelog next

This commit is contained in:
That_One_Nerd 2023-08-28 12:46:35 -04:00
parent 63631632fe
commit 0e0922e236
4 changed files with 32 additions and 4 deletions

View File

@ -30,6 +30,7 @@ Here's the full changelog:
+ : IIndexRangeAll<Float3>
+ : ISplittable<Line, (Float3[] As, Float3[] Bs)>
+ IWithinRange<Float3, float>
+ Angle
+ Slope
+ Line()
+ ToFloatArrayAll(params Line[])

View File

@ -52,11 +52,15 @@ public struct Angle : IAbsolute<Angle>, IAverage<Angle>, IClamp<Angle>, ICloneab
_ => throw new ArgumentException("Unknown type.", nameof(valueType)),
};
public static Angle FromVerts(Float3 endA, Float3 middleB, Float3 endC)
public static Angle FromLines(Line ab, Line bc)
{
if (ab.b != bc.a) throw new DisconnectedLinesException(ab, bc);
return FromPoints(ab.a, ab.b, bc.b);
}
public static Angle FromPoints(Float3 endA, Float3 middleB, Float3 endC)
{
endA -= middleB;
endC -= middleB;
float dot = Float3.Dot(endA, endC);
return Mathf.ArcCos(dot * endA.InverseMagnitude * endC.InverseMagnitude);
}

View File

@ -16,6 +16,7 @@ public class Line : IAverage<Line>, IClosestTo<Float3>, IContains<Float3>, IEqua
public static Line One => (Float3.Zero, Float3.One);
public static Line Zero => (Float3.Zero, Float3.Zero);
public Angle Angle => Mathf.ArcTan(Slope);
public float Length => (b - a).Magnitude;
public Float3 Midpoint => (a + b) / 2;
public float Slope => (b.y - a.y) / (b.x - a.x);
@ -253,5 +254,5 @@ public class Line : IAverage<Line>, IClosestTo<Float3>, IContains<Float3>, IEqua
public static implicit operator Line(Fill<Int3> fill) => new(fill);
public static implicit operator Line(Fill<float> fill) => new(fill);
public static implicit operator Line(Fill<int> fill) => new(fill);
public static implicit operator Line((Float3 a, Float3 b) tuple) => (tuple.a, tuple.b);
public static implicit operator Line((Float3 a, Float3 b) tuple) => new(tuple.a, tuple.b);
}

View File

@ -45,6 +45,10 @@ public class Triangle : IClosestTo<Float3>, IContains<Float3>,
}
}
public Angle AngleABC => Angle.FromPoints(a, b, c);
public Angle AngleBCA => Angle.FromPoints(b, c, a);
public Angle AngleCAB => Angle.FromPoints(c, a, b);
public Float3 a, b, c;
public Triangle() : this(Float3.Zero, Float3.Zero, Float3.Zero) { }
@ -176,6 +180,24 @@ public class Triangle : IClosestTo<Float3>, IContains<Float3>,
return result;
}
public Float3 ClosestTo(Float3 point)
{
Float3 abClosest = AB.ClosestTo(point),
bcClosest = BC.ClosestTo(point),
caClosest = CA.ClosestTo(point);
// Very inefficient way to select the closest point.
float abDist = (abClosest - point).Magnitude,
bcDist = (bcClosest - point).Magnitude,
caDist = (caClosest - point).Magnitude;
float min = Mathf.Min(abDist, bcDist, caDist);
if (abDist == min) return abClosest;
else if (bcDist == min) return bcClosest;
else return caClosest;
}
public bool Equals(Triangle? other) => other is not null && a == other.a
&& b == other.b && c == other.c;
public override bool Equals(object? obj)
@ -191,7 +213,7 @@ public class Triangle : IClosestTo<Float3>, IContains<Float3>,
Triangle pab = (point, a, b),
pbc = (point, b, c),
pca = (point, c, a);
return Mathf.Absolute(Area - (pab.Area + pbc.Area + pca.Area)) < 0.025f;
return Mathf.Absolute(Area - (pab.Area + pbc.Area + pca.Area)) < 0.05f;
}
public Float3[] GetAllVerts() => new[] { a, b, c };