using System; using System.Collections.Generic; using System.Linq; using System.Numerics; using System.Text; using System.Threading.Tasks; namespace NaturalNeighbor.Internal { abstract class InterpolationEvaluator { public InterpolationEvaluator(ISharedMethods sharedMethods, SearchContext context) { Context = context; SharedMethods = sharedMethods; } public abstract float Evaluate(float x, float y); protected SearchContext Context { get; } protected ISharedMethods SharedMethods { get; } public abstract InterpolationEvaluator Clone(); } sealed class NearestNeighborEvaluator : InterpolationEvaluator { public NearestNeighborEvaluator(ISharedMethods sharedMethods, SearchContext context) : base(sharedMethods, context) { } public override float Evaluate(float x, float y) { return SharedMethods.LookupNearest(x, y, Context); } public override InterpolationEvaluator Clone() { return new NearestNeighborEvaluator(this.SharedMethods, new SearchContext()); } } sealed class PiecewiseLinearEvaluator : InterpolationEvaluator { public PiecewiseLinearEvaluator(ISharedMethods sharedMethods, SearchContext context) : base(sharedMethods, context) { } public override float Evaluate(float x, float y) { return SharedMethods.LookupLinear(x, y, Context); } public override InterpolationEvaluator Clone() { return new PiecewiseLinearEvaluator(this.SharedMethods, new SearchContext()); } } sealed class NaturalNeighborEvaluator : InterpolationEvaluator { public NaturalNeighborEvaluator(ISharedMethods sharedMethods, SearchContext context) : base(sharedMethods, context) { } public override float Evaluate(float x, float y) { float result = SharedMethods.LookupNatural(x, y, Context); return result; } public override InterpolationEvaluator Clone() { return new NaturalNeighborEvaluator(SharedMethods, new SearchContext()); } } interface ISharedMethods { float LookupNearest(float x, float y, SearchContext context); float LookupLinear(float x, float y, SearchContext context); float LookupNatural(float x, float y, SearchContext context); } }