<?xml version="1.0"?>
<!--
   Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
-->

<!--
This file is used by the maven-changes-plugin to generate the release notes.
Useful ways of finding items to add to this file are:

1.  Add items when you fix a bug or add a feature (this makes the
release process easy :-).

2.  Do a JIRA search for tickets closed since the previous release.

3.  Use the report generated by the maven-changelog-plugin to see all
SVN commits.

To generate the file RELEASE-NOTES.txt from this file:

mvn changes:announcement-generate -Prelease-notes [-Dchanges.version]

The <action> type attribute can be add,update,fix,remove.
-->

<!-- NOTE:
The description attribute entries below are specially formatted
so as to improve the layout of the generated text release notes.

The parsing process removes all line feeds, replacing them with a single space.
The Velocity template in src/changes/release-notes.vm has been enhanced to replace pairs of adjacent spaces
with a new-line in the release notes. (These spaces are ignored when displaying HTML).
If the output is not quite correct, check for invisible trailing spaces!
-->

<document xmlns="http://maven.apache.org/changes/2.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/changes/2.0.0 https://maven.apache.org/xsd/changes-2.0.0.xsd">
  <properties>
    <title>Apache Commons Geometry Release Notes</title>
  </properties>
  <body>

    <release version="1.1" date="TBD" description="
This is a minor release of Apache Commons Geometry.

Apache Commons Geometry 1.0 contains the following library modules:
  commons-geometry-core (requires Java 8+)
  commons-geometry-euclidean (requires Java 8+)
  commons-geometry-spherical (requires Java 8+)
  commons-geometry-io-core (requires Java 8+)
  commons-geometry-io-euclidean (requires Java 8+)
">
      <action dev="aherbert" type="update" due-to="Ivan Shuba">
          Fix hash code collision for Vector2D and Vector3D. Modifies the
          hashCode() method to reduce collision for non-identical instances of vectors.
      </action>
      <action dev="mattjuntunen" type="add" issue="GEOMETRY-147">
          Add line intersection methods to Bounds2D and Bounds3D.
      </action>
      <action dev="mattjuntunen" type="add" issue="GEOMETRY-146">
          Add distance ordering methods (e.g., nearest/farthest) to PointMap and PointSet.
      </action>
      <action dev="mattjuntunen" type="add" issue="GEOMETRY-142">
          Add PointMap and PointSet types that use points as keys and consider floating point
          equivalency in look ups.
      </action>
      <action dev="mattjuntunen" type="fix" issue="GEOMETRY-143" due-to="Ron Goldman">
          Fix misclassification of points near zero in AngularInterval.
      </action>
      <action dev="ggregory" type="fix">
          Bump org.apache.commons:commons-parent from 84 to 85 #256.
      </action>
    </release>

        <release version="1.0" date="2021-08-21" description="
This is the first major release of Apache Commons Geometry.

Apache Commons Geometry 1.0 contains the following library modules:
  commons-geometry-core (requires Java 8+)
  commons-geometry-euclidean (requires Java 8+)
  commons-geometry-spherical (requires Java 8+)
  commons-geometry-io-core (requires Java 8+)
  commons-geometry-io-euclidean (requires Java 8+)
">
      <action dev="mattjuntunen" type="update" issue="GEOMETRY-138">
        Do not use checked exceptions in IO modules.
      </action>
      <action dev="mattjuntunen" type="update" issue="GEOMETRY-13">
        Use Norms.EUCLIDEAN from Commons Numbers to compute 3D Euclidean norm values.
      </action>
      <action dev="mattjuntunen" type="update" issue="GEOMETRY-126">
        Replace VectorXD.linearCombination methods with VectorXD.Sum classes. Use
        Sum class from Commons Numbers for computing internal linear combinations.
      </action>
      <action dev="mattjuntunen" type="update" issue="GEOMETRY-124">
        Replace DoublePrecisionContext with Precision.DoubleEquivalence from Commons Numbers.
      </action>
      <action dev="mattjuntunen" type="add" issue="GEOMETRY-118">
        Add coordinate-specific transform methods to AffineTransformMatrixXD classes, e.g.
        "applyX", "applyY", "applyZ".
      </action>
      <action dev="mattjuntunen" type="add" issue="GEOMETRY-95">
        Add solid geometry tutorial.
      </action>
      <action dev="mattjuntunen" type="add" issue="GEOMETRY-120">
        Add SimpleTriangleMeshBuilder.addFace(int[]) method as alternative to
        addFace(int, int, int).
      </action>
      <action dev="mattjuntunen" type="add" issue="GEOMETRY-117" due-to="Christoph Läubrich">
        Add shear methods to AffineTransformMatrix2D.
      </action>
      <action dev="mattjuntunen" type="add" issue="GEOMETRY-119">
        Add VectorXD.normalizeOrNull() methods so that callers can detect normalization failures
        without needing to catch an exception.
      </action>
      <action dev="mattjuntunen" type="add" issue="GEOMETRY-115">
        Add modules for IO functionality: commons-geometry-io-core, commons-geometry-io-euclidean.
      </action>
      <action dev="mattjuntunen" type="fix" issue="GEOMETRY-116">
        Fix incorrect OSGi headers. Reported by Christoph Läubrich.
      </action>
      <action dev="mattjuntunen" type="update" issue="GEOMETRY-109">
        Rename the BoundarySourceXX.from() static factory methods to "of" to better match
        the JDK's Stream.of() method.
      </action>
      <action dev="mattjuntunen" type="add" issue="GEOMETRY-108">
        Add BoundaryList interface and implementation classes.
      </action>
      <action dev="mattjuntunen" type="update" issue="GEOMETRY-103" due-to="Arturo Bernal">
        Migrate unit tests to JUnit 5.
      </action>
    </release>

    <release version="1.0-beta1" date="2020-07-20" description="
This is a beta release of Apache Commons Geometry. No guarantees are
made regarding the stability of the API or compatibility with future
releases.

Apache Commons Geometry 1.0-beta1 contains the following library modules:
  commons-geometry-core (requires Java 8+)
  commons-geometry-euclidean (requires Java 8+)
  commons-geometry-spherical (requires Java 8+)
  commons-geometry-hull (requires Java 8+)
  commons-geometry-enclosing (requires Java 8+)
">
    </release>

  </body>
</document>
