1 /*
2 * Licensed to the Apache Software Foundation (ASF) under one or more
3 * contributor license agreements. See the NOTICE file distributed with
4 * this work for additional information regarding copyright ownership.
5 * The ASF licenses this file to You under the Apache License, Version 2.0
6 * (the "License"); you may not use this file except in compliance with
7 * the License. You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17 package org.apache.commons.math4.legacy.analysis.interpolation;
18
19 import org.apache.commons.math4.core.jdkmath.JdkMath;
20
21 /**
22 * Utility class for the {@link MicrosphereProjectionInterpolator} algorithm.
23 * For 2D interpolation, this class constructs the microsphere as a series of
24 * evenly spaced facets (rather than generating random normals as in the
25 * base implementation).
26 *
27 * @since 4.0
28 */
29 public class InterpolatingMicrosphere2D extends InterpolatingMicrosphere {
30 /** Space dimension. */
31 private static final int DIMENSION = 2;
32
33 /**
34 * Create a sphere from vectors regularly sampled around a circle.
35 *
36 * @param size Number of surface elements of the sphere.
37 * @param maxDarkFraction Maximum fraction of the facets that can be dark.
38 * If the fraction of "non-illuminated" facets is larger, no estimation
39 * of the value will be performed, and the {@code background} value will
40 * be returned instead.
41 * @param darkThreshold Value of the illumination below which a facet is
42 * considered dark.
43 * @param background Value returned when the {@code maxDarkFraction}
44 * threshold is exceeded.
45 * @throws org.apache.commons.math4.legacy.exception.NotStrictlyPositiveException
46 * if {@code size <= 0}.
47 * @throws org.apache.commons.math4.legacy.exception.NotPositiveException if
48 * {@code darkThreshold < 0}.
49 * @throws org.apache.commons.math4.legacy.exception.OutOfRangeException if
50 * {@code maxDarkFraction} does not belong to the interval {@code [0, 1]}.
51 */
52 public InterpolatingMicrosphere2D(int size,
53 double maxDarkFraction,
54 double darkThreshold,
55 double background) {
56 super(DIMENSION, size, maxDarkFraction, darkThreshold, background);
57
58 // Generate the microsphere normals.
59 final double twopi = 2 * Math.PI;
60 for (int i = 0; i < size; i++) {
61 final double angle = i * twopi / size;
62
63 add(new double[] { JdkMath.cos(angle),
64 JdkMath.sin(angle) },
65 false);
66 }
67 }
68
69 /**
70 * Copy constructor.
71 *
72 * @param other Instance to copy.
73 */
74 protected InterpolatingMicrosphere2D(InterpolatingMicrosphere2D other) {
75 super(other);
76 }
77
78 /**
79 * Perform a copy.
80 *
81 * @return a copy of this instance.
82 */
83 @Override
84 public InterpolatingMicrosphere2D copy() {
85 return new InterpolatingMicrosphere2D(this);
86 }
87 }