Java tutorial
/** * Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.analytics.math.surface; import java.util.Arrays; import org.apache.commons.lang.Validate; import com.opengamma.util.tuple.Pair; /** * A surface that is defined by a set of nodal points (i.e. <i>(x, y, z)</i> data). Any attempt to find a <i>z</i> value * for which there is no <i>(x, y)</i> nodal point will result in failure. * @param <T> The type of the x-axis data * @param <U> The type of the y-axis data * @param <V> The type of the z-axis data */ public class NodalObjectsSurface<T, U, V> extends ObjectsSurface<T, U, V> { /** * @param xData An array of <i>x</i> data points, not null * @param yData An array of <i>y</i> data points, not null, contains same number of entries as <i>x</i> * @param zData An array of <i>z</i> data points, not null, contains same number of entries as <i>x</i> * @param <T> The type of the x-axis data * @param <U> The type of the y-axis data * @param <V> The type of the z-axis data * @return A nodal surface with automatically-generated name */ public static <T, U, V> NodalObjectsSurface<T, U, V> from(final T[] xData, final U[] yData, final V[] zData) { return new NodalObjectsSurface<T, U, V>(xData, yData, zData); } /** * @param xData An array of <i>x</i> data points, not null * @param yData An array of <i>y</i> data points, not null, contains same number of entries as <i>x</i> * @param zData An array of <i>z</i> data points, not null, contains same number of entries as <i>x</i> * @param <T> The type of the x-axis data * @param <U> The type of the y-axis data * @param <V> The type of the z-axis data * @param name The name of the surface * @return A nodal surface with automatically-generated name */ public static <T, U, V> NodalObjectsSurface<T, U, V> from(final T[] xData, final U[] yData, final V[] zData, final String name) { return new NodalObjectsSurface<T, U, V>(xData, yData, zData, name); } /** * @param xData An array of <i>x</i> data points, not null * @param yData An array of <i>y</i> data points, not null, contains same number of entries as <i>x</i> * @param zData An array of <i>z</i> data points, not null, contains same number of entries as <i>x</i> */ public NodalObjectsSurface(final T[] xData, final U[] yData, final V[] zData) { super(xData, yData, zData); } /** * @param xData An array of <i>x</i> data points, not null * @param yData An array of <i>y</i> data points, not null, contains same number of entries as <i>x</i> * @param zData An array of <i>z</i> data points, not null, contains same number of entries as <i>x</i> * @param name The name of the surface */ public NodalObjectsSurface(final T[] xData, final U[] yData, final V[] zData, final String name) { super(xData, yData, zData, name); } /** * {@inheritDoc} * @throws IllegalArgumentException If the <i>(x, y)</i> value is not a nodal point */ @Override public V getZValue(final T x, final U y) { Validate.notNull(x, "x"); Validate.notNull(y, "y"); final T[] xArray = getXData(); final int index = Arrays.binarySearch(xArray, x); if (index < 0) { throw new IllegalArgumentException("No x-y-z data in surface for (" + x + ", " + y + ")"); } final U[] yArray = getYData(); if (yArray[index].equals(y)) { final V[] zArray = getZData(); return zArray[index]; } throw new IllegalArgumentException("No x-y-z data in surface for (" + x + ", " + y + ")"); } /** * {@inheritDoc} * @throws IllegalArgumentException If the <i>(x, y)</i> value is not a nodal point */ @Override public V getZValue(final Pair<T, U> xy) { Validate.notNull(xy, "x-y pair"); return getZValue(xy.getFirst(), xy.getSecond()); } }