/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.analytics.math.surface;
/**
* Given a surface and some form of shift, return a shifted surface (where the shift can be defined in several ways).
* @param <T> The type of the surface
*/
public interface SurfaceShiftFunction<T extends Surface<Double, Double, Double>> {
/**
* Returns a new surface shifted by a constant <i>z</i> amount (i.e. a parallel shift). The name of the new surface will be automatically generated.
* @param surface The surface, not null
* @param shift The amount to shift
* @return The shifted surface
*/
T evaluate(T surface, double shift);
/**
* Returns a new surface shifted by a constant <i>z</i> amount (i.e. a parallel shift). The name of the new surface is supplied.
* @param surface The surface, not null
* @param shift The amount to shift
* @param newName The name for the shifted surface
* @return The shifted surface
*/
T evaluate(T surface, double shift, String newName);
/**
* Returns a new surface shifted by an amount <i>z</i> at the point <i>(x, y)</i>. The name of the new surface will be automatically generated.
* @param surface The surface, not null
* @param x The <i>x</i> location of the shift
* @param y The <i>y</i> location of the shift
* @param shift The amount to shift
* @return The shifted surface
*/
T evaluate(T surface, double x, double y, double shift);
/**
* Returns a new surface shifted by an amount <i>z</i> at the point <i>(x, y)</i>. The name of the new surface is supplied.
* @param surface The surface, not null
* @param x The <i>x</i> location of the shift
* @param y The <i>y</i> location of the shift
* @param shift The amount to shift
* @param newName The name for the shifted surface
* @return The shifted surface
*/
T evaluate(T surface, double x, double y, double shift, String newName);
/**
* Returns a new surface shifted by amounts <i>z</i> at points <i>(x, y)</i>. The name of the new surface will
* be automatically generated.
* @param surface The surface, not null
* @param xShift An array of <i>x</i> values of the points to be shifted, not null. If this array is empty a new surface identical to the original
* will be returned
* @param yShift An array of <i>x</i> values of the points to be shifted, not null. Must contain the same number of points as the array of <i>x</i> values
* @param shift The amounts to shift the surface at each <i>(x, y)</i> value, not null, must contain the same number of points as the array of <i>x</i> values
* @return A shifted surface
*/
T evaluate(T surface, double[] xShift, double[] yShift, double[] shift);
/**
* Returns a new surface shifted by amounts <i>z</i> at points <i>(x, y)</i>. The name of the new surface is supplied.
* @param surface The surface, not null
* @param xShift An array of <i>x</i> values of the points to be shifted, not null. If this array is empty a new surface identical to the original
* will be returned
* @param yShift An array of <i>x</i> values of the points to be shifted, not null. Must contain the same number of points as the array of <i>x</i> values
* @param shift The amounts to shift the surface at each <i>(x, y)</i> value, not null, must contain the same number of points as the array of <i>x</i> values
* @param newName The name of the shifted surface
* @return A shifted surface
*/
T evaluate(T surface, double[] xShift, double[] yShift, double[] shift, String newName);
}