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.geometry.euclidean.twod;
18
19 import java.util.Iterator;
20 import java.util.stream.Stream;
21
22 /** Class used to construct {@link Bounds2D} instances representing the min and
23 * max points present in a {@link BoundarySource2D}. The implementation examines
24 * the vertices of each boundary in turn. Null is returned if any boundaries are
25 * infinite or no vertices are present.
26 */
27 final class BoundarySourceBoundsBuilder2D {
28
29 /** Get a {@link Bounds2D} instance containing all vertices in the given boundary source.
30 * Null is returned if any encountered boundaries were not finite or no vertices were found.
31 * @param src boundary source to compute the bounds of
32 * @return the bounds of the argument or null if no valid bounds could be determined
33 */
34 public Bounds2D getBounds(final BoundarySource2D src) {
35
36 final Bounds2D.Builder builder = Bounds2D.builder();
37
38 try (Stream<LineConvexSubset> stream = src.boundaryStream()) {
39 final Iterator<LineConvexSubset> it = stream.iterator();
40
41 LineConvexSubset boundary;
42 while (it.hasNext()) {
43 boundary = it.next();
44
45 if (boundary.isInfinite()) {
46 return null; // break out early
47 }
48
49 builder.add(boundary.getStartPoint());
50 builder.add(boundary.getEndPoint());
51 }
52 }
53
54 return builder.hasBounds() ?
55 builder.build() :
56 null;
57 }
58 }