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 }