diff --git a/Bowerbird/CurveOnSurface/CurveOnSurface.cs b/Bowerbird/CurveOnSurface/CurveOnSurface.cs index b959179..93284f9 100644 --- a/Bowerbird/CurveOnSurface/CurveOnSurface.cs +++ b/Bowerbird/CurveOnSurface/CurveOnSurface.cs @@ -239,5 +239,22 @@ public IOrientableCurve Morph(SpaceMorph xmorph) xmorph.Morph(surface); return Create(surface, Curve); } + + public double Ds(double t) + { + var uv = Curve.DerivativeAt(t, 2); + var u = uv[0].X; + var v = uv[0].Y; + var u1 = uv[1].X; + var v1 = uv[1].Y; + + Surface.Evaluate(u, v, 1, out var _, out var xyz); + var s10 = xyz[0]; + var s01 = xyz[1]; + + var x1 = u1 * s10 + v1 * s01; + + return x1.Length; + } } } diff --git a/Bowerbird/CurveOnSurface/IOrientableCurve.cs b/Bowerbird/CurveOnSurface/IOrientableCurve.cs index 12f6c6c..9651c41 100644 --- a/Bowerbird/CurveOnSurface/IOrientableCurve.cs +++ b/Bowerbird/CurveOnSurface/IOrientableCurve.cs @@ -10,6 +10,8 @@ public interface IOrientableCurve Vector3d TangentAt(double t); + double Ds(double t); + Vector3d NormalAt(double t); Vector3d BinormalAt(double t); diff --git a/Bowerbird/CurveOnSurface/IntegrateComponent.cs b/Bowerbird/CurveOnSurface/IntegrateComponent.cs index 75764d3..170e2b5 100644 --- a/Bowerbird/CurveOnSurface/IntegrateComponent.cs +++ b/Bowerbird/CurveOnSurface/IntegrateComponent.cs @@ -39,11 +39,11 @@ Func Evaluate(IOrientableCurve curve, bool squared) switch (ValueType) { case ValueTypes.NormalCurvature: - return o => curve.NormalCurvatureAt(o).Length; + return o => curve.NormalCurvatureAt(o).Length * curve.Ds(o); case ValueTypes.GeodesicCurvature: - return o => curve.GeodesicCurvatureAt(o).Length; + return o => curve.GeodesicCurvatureAt(o).Length * curve.Ds(o); case ValueTypes.GeodesicTorsion: - return o => curve.GeodesicTorsionAt(o).Length; + return o => curve.GeodesicTorsionAt(o).Length * curve.Ds(o); default: throw new Exception(); } @@ -53,11 +53,11 @@ Func Evaluate(IOrientableCurve curve, bool squared) switch (ValueType) { case ValueTypes.NormalCurvature: - return o => curve.NormalCurvatureAt(o).SquareLength; + return o => curve.NormalCurvatureAt(o).SquareLength * curve.Ds(o); case ValueTypes.GeodesicCurvature: - return o => curve.GeodesicCurvatureAt(o).SquareLength; + return o => curve.GeodesicCurvatureAt(o).SquareLength * curve.Ds(o); case ValueTypes.GeodesicTorsion: - return o => curve.GeodesicTorsionAt(o).SquareLength; + return o => curve.GeodesicTorsionAt(o).SquareLength * curve.Ds(o); default: throw new Exception(); } diff --git a/Bowerbird/CurveOnSurface/ZeroTwistingCurve.cs b/Bowerbird/CurveOnSurface/ZeroTwistingCurve.cs index 5ff9ba6..9192f0d 100644 --- a/Bowerbird/CurveOnSurface/ZeroTwistingCurve.cs +++ b/Bowerbird/CurveOnSurface/ZeroTwistingCurve.cs @@ -190,5 +190,10 @@ public IOrientableCurve Morph(SpaceMorph xmorph) xmorph.Morph(curve); return Create(curve); } + + public double Ds(double t) + { + return Curve.DerivativeAt(t, 1)[1].Length; + } } }