001    /*
002     * MitchellFilter
003     * 
004     * Copyright (c) 2002, 2003 Marco Schmidt.
005     * All rights reserved.
006     */
007    
008    package net.sourceforge.jiu.geometry;
009    
010    /**
011     * The Mitchell resample filter.
012     * @author Marco Schmidt
013     * @since 0.10.0
014     * @see Resample
015     * @see ResampleFilter
016     */
017    public class MitchellFilter extends ResampleFilter
018    {
019            private final float B = 1.0f / 3.0f;
020            private final float C = 1.0f / 3.0f;
021    
022            public float apply(float value)
023            {
024                    if (value < 0.0f)
025                    {
026                            value = -value;
027                    }
028                    float tt = value * value;
029                    if (value < 1.0f)
030                    {
031                            value = (((12.0f - 9.0f * B - 6.0f * C) * (value * tt))
032                            + ((-18.0f + 12.0f * B + 6.0f * C) * tt)
033                            + (6.0f - 2f * B));
034                            return value / 6.0f;
035                    }
036                    else
037                    if (value < 2.0f)
038                    {
039                            value = (((-1.0f * B - 6.0f * C) * (value * tt))
040                            + ((6.0f * B + 30.0f * C) * tt)
041                            + ((-12.0f * B - 48.0f * C) * value)
042                            + (8.0f * B + 24 * C));
043                            return value / 6.0f;
044                    }
045                    else
046                    {
047                            return 0.0f;
048                    }
049            }
050    
051            public String getName()
052            {
053                    return "Mitchell";
054            }
055    
056            public float getRecommendedSamplingRadius()
057            {
058                    return 2.0f;
059            }
060    }