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 package org.hipparchus.optim.nonlinear.vector.leastsquares;
23
24 import org.hipparchus.geometry.euclidean.twod.Vector2D;
25 import org.hipparchus.random.RandomDataGenerator;
26 import org.hipparchus.util.FastMath;
27 import org.hipparchus.util.MathUtils;
28
29 /**
30 * Factory for generating a cloud of points that approximate a circle.
31 */
32 public class RandomCirclePointGenerator {
33 /** Radius of the circle. */
34 private final double radius;
35 /** Random data generator */
36 private final RandomDataGenerator randomDataGenerator;
37 /** Error on the x-coordinate of the circumference points. */
38 private final double xSigma;
39 /** Error on the y-coordinate of the circumference points. */
40 private final double ySigma;
41 /** Abscissa of the circle center. */
42 private final double x;
43 /** Ordinate of the circle center. */
44 private final double y;
45
46
47 /**
48 * @param x Abscissa of the circle center.
49 * @param y Ordinate of the circle center.
50 * @param radius Radius of the circle.
51 * @param xSigma Error on the x-coordinate of the circumference points.
52 * @param ySigma Error on the y-coordinate of the circumference points.
53 * @param seed RNG seed.
54 */
55 public RandomCirclePointGenerator(double x,
56 double y,
57 double radius,
58 double xSigma,
59 double ySigma,
60 long seed) {
61 randomDataGenerator = new RandomDataGenerator(seed);
62 this.radius = radius;
63 this.xSigma = xSigma;
64 this.ySigma = ySigma;
65 this.x = x;
66 this.y = y;
67 }
68
69 /**
70 * Point generator.
71 *
72 * @param n Number of points to create.
73 * @return the cloud of {@code n} points.
74 */
75 public Vector2D[] generate(int n) {
76 final Vector2D[] cloud = new Vector2D[n];
77 for (int i = 0; i < n; i++) {
78 cloud[i] = create();
79 }
80 return cloud;
81 }
82
83 /**
84 * Create one point.
85 *
86 * @return a point.
87 */
88 private Vector2D create() {
89 final double t = randomDataGenerator.nextUniform(0, MathUtils.TWO_PI);
90 final double pX = randomDataGenerator.nextNormal(x, xSigma) + radius * FastMath.cos(t);
91 final double pY = randomDataGenerator.nextNormal(y, ySigma) + radius * FastMath.sin(t);
92
93 return new Vector2D(pX, pY);
94 }
95 }