View Javadoc
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    *      https://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  
18  /*
19   * This is not the original file distributed by the Apache Software Foundation
20   * It has been modified by the Hipparchus project
21   */
22  
23  package org.hipparchus.complex;
24  
25  import org.hipparchus.CalculusFieldElement;
26  import org.hipparchus.exception.LocalizedCoreFormats;
27  import org.hipparchus.exception.MathIllegalArgumentException;
28  import org.hipparchus.util.FastMath;
29  import org.hipparchus.util.FieldSinCos;
30  import org.hipparchus.util.SinCos;
31  
32  /**
33   * Static implementations of common {@link Complex} utilities functions.
34   */
35  public class ComplexUtils {
36  
37      /**
38       * Default constructor.
39       */
40      private ComplexUtils() {}
41  
42      /**
43       * Creates a complex number from the given polar representation.
44       * <p>
45       * The value returned is <code>r&middot;e<sup>i&middot;theta</sup></code>,
46       * computed as <code>r&middot;cos(theta) + r&middot;sin(theta)i</code>
47       * </p>
48       * <p>
49       * If either <code>r</code> or <code>theta</code> is NaN, or
50       * <code>theta</code> is infinite, {@link Complex#NaN} is returned.
51       * </p>
52       * <p>
53       * If <code>r</code> is infinite and <code>theta</code> is finite,
54       * infinite or NaN values may be returned in parts of the result, following
55       * the rules for double arithmetic.</p>
56       * <pre>
57       * Examples:
58       * <code>
59       * polar2Complex(INFINITY, &pi;/4) = INFINITY + INFINITY i
60       * polar2Complex(INFINITY, 0) = INFINITY + NaN i
61       * polar2Complex(INFINITY, -&pi;/4) = INFINITY - INFINITY i
62       * polar2Complex(INFINITY, 5&pi;/4) = -INFINITY - INFINITY i </code>
63       * </pre>
64       *
65       * @param r the modulus of the complex number to create
66       * @param theta  the argument of the complex number to create
67       * @return <code>r&middot;e<sup>i&middot;theta</sup></code>
68       * @throws MathIllegalArgumentException if {@code r} is negative.
69       */
70      public static Complex polar2Complex(double r, double theta) throws MathIllegalArgumentException {
71          if (r < 0) {
72              throw new MathIllegalArgumentException(
73                    LocalizedCoreFormats.NEGATIVE_COMPLEX_MODULE, r);
74          }
75          final SinCos sc = FastMath.sinCos(theta);
76          return new Complex(r * sc.cos(), r * sc.sin());
77      }
78  
79      /**
80       * Creates a complex number from the given polar representation.
81       * <p>
82       * The value returned is <code>r&middot;e<sup>i&middot;theta</sup></code>,
83       * computed as <code>r&middot;cos(theta) + r&middot;sin(theta)i</code>
84       * </p>
85       * <p>
86       * If either <code>r</code> or <code>theta</code> is NaN, or
87       * <code>theta</code> is infinite, {@link Complex#NaN} is returned.
88       * </p>
89       * <p>
90       * If <code>r</code> is infinite and <code>theta</code> is finite,
91       * infinite or NaN values may be returned in parts of the result, following
92       * the rules for double arithmetic.
93       * </p>
94       * <pre>
95       * Examples:
96       * <code>
97       * polar2Complex(INFINITY, &pi;/4) = INFINITY + INFINITY i
98       * polar2Complex(INFINITY, 0) = INFINITY + NaN i
99       * polar2Complex(INFINITY, -&pi;/4) = INFINITY - INFINITY i
100      * polar2Complex(INFINITY, 5&pi;/4) = -INFINITY - INFINITY i </code>
101      * </pre>
102      *
103      * @param r the modulus of the complex number to create
104      * @param theta  the argument of the complex number to create
105      * @param <T> type of the field elements
106      * @return <code>r&middot;e<sup>i&middot;theta</sup></code>
107      * @throws MathIllegalArgumentException if {@code r} is negative.
108      * @since 2.0
109      */
110     public static <T extends CalculusFieldElement<T>> FieldComplex<T> polar2Complex(T r, T theta) throws MathIllegalArgumentException {
111         if (r.getReal() < 0) {
112             throw new MathIllegalArgumentException(
113                   LocalizedCoreFormats.NEGATIVE_COMPLEX_MODULE, r);
114         }
115         final FieldSinCos<T> sc = FastMath.sinCos(theta);
116         return new FieldComplex<>(r.multiply(sc.cos()), r.multiply(sc.sin()));
117     }
118 
119     /**
120      * Convert an array of primitive doubles to an array of {@code Complex} objects.
121      *
122      * @param real Array of numbers to be converted to their {@code Complex} equivalent.
123      * @return an array of {@code Complex} objects.
124      */
125     public static Complex[] convertToComplex(double[] real) {
126         final Complex[] c = new Complex[real.length];
127         for (int i = 0; i < real.length; i++) {
128             c[i] = new Complex(real[i], 0);
129         }
130 
131         return c;
132     }
133 
134 }