Hi.

Le sam. 18 janv. 2020 à 23:14, Matt Juntunen
<matt.juntu...@hotmail.com> a écrit :
>
> Gilles,
>
> >> There, we can simply sample the user-defined function
> > I'm not sure I understand.
>
> Just an implementation detail. We need to pass some sample points through the 
> user-defined function in order to construct an equivalent matrix.
>
> > Throwing an exception if the transform does not abide by
> > the requirements?
>
> Yes.
>
> I just submitted a PR on Github with these changes. I also realized that the 
> EuclideanTransform class as discussed exactly matches the definition of an 
> affine transform so I renamed it to AffineTransform. No other names were 
> changed.

I had a (quick) look; is it necessary to split functionality among "Transform"
(in "core") and its subinterfaces/classes in other modules?  IOW, if "Transform"
can only be affine, it looks strange to have "AffineTransform" (re)defined.

I'm also a bit puzzled by the "AbstractAffineTransformMatrix" that seems to
only contain convenience methods for internal use (whereas having them
"protected" put them in the public API).

Regards,
Gilles

>
> -Matt
> ________________________________
> From: Gilles Sadowski <gillese...@gmail.com>
> Sent: Saturday, January 18, 2020 1:40 PM
> To: Commons Developers List <dev@commons.apache.org>
> Subject: Re: [geometry] Rename Transform to AffineTransform
>
> Hello.
>
> 2020-01-18 15:40 UTC+01:00, Matt Juntunen <matt.juntu...@hotmail.com>:
> > Gilles,
> >
> >> If the "Transform" is intimately related to the "core" and there is a
> >> single
> >> set of properties that make it "affine" (and work correctly), I'd tend to
> >> keep the name "Transform".
> >
> > So, if I'm understanding you correctly, you're saying that since the
> > partitioning code in the library only works with these types of
> > parallelism-preserving transforms, it can be safely assumed that
> > o.a.c.geometry.core.Transform represents such a transform. Is this correct?
>
> Indeed.
>
> > One thing that's causing some issues with the implementation here is that
> > the Euclidean TransformXD interfaces have static "from(UnaryOperator<X>)"
> > methods that allow users to wrap their own, arbitrary vector operations as
> > Transform instances. We don't (and really can't) do any validation on these
> > user-defined functions to ensure that they meet the library requirements. It
> > is therefore easy for users to pass in invalid operators. To avoid this, I'm
> > thinking of removing the TransformXD interfaces completely and moving the
> > "from(UnaryOperator<X>)" methods into the AffineTransformMatrixXD classes.
>
> +1
> It is generally good to prevent the creation of invalid objects.
>
> > There, we can simply sample the user-defined function
>
> I'm not sure I understand.
>
> > as needed and produce
> > matrices that are guaranteed to be affine.
>
> Throwing an exception if the transform does not abide by
> the requirements?
>
> > Following the above, the class hierarchy would then be as below, which is
> > basically what it was before I added the TransformXD interfaces.
> >
> > commons-geometry-core
> >    Transform
> >
> > commons-geometry-euclidean
> >     EuclideanTransform extends Transform
> >     AffineTransformMatrixXD implements EuclideanTransform
> >     Rotation3D extends EuclideanTransform
> >     QuaternionRotation implements Rotation3D
> >
> > commons-geometry-spherical
> >     Transform1S implements Transform
> >     Transform2S implements Transform
> >
> > WDYT?
>
> +1
>
> Best,
> Gilles
>
> >
> > -Matt
> >
> >
> > ________________________________
> > From: Gilles Sadowski <gillese...@gmail.com>
> > Sent: Monday, January 13, 2020 8:03 PM
> > To: Commons Developers List <dev@commons.apache.org>
> > Subject: Re: [geometry] Rename Transform to AffineTransform
> >
> > Hi.
> >
> > Le lun. 13 janv. 2020 à 04:39, Matt Juntunen
> > <matt.juntu...@hotmail.com> a écrit :
> >>
> >> Gilles,
> >>
> >> > How about keeping "Transform" for the interface name and define a method
> >> > ... boolean isAffine();
> >>
> >> I would prefer to have separate types for each kind of transform.
> >> This would make the API clear and would avoid numerous checks in the code
> >> in order to see if a particular transform instance is supported. The
> >> transform types also generally have an "is-a" relationship with each
> >> other, which seems like a perfect fit for inheritance. [1]
> >>
> >> > I don't get that it is an "accuracy" issue. If some requirement is not
> >> > met,
> >> results will be plain wrong
> >>
> >> Yes, you are correct. I was not very clear in what I wrote. The results
> >> will be completely unusable if the transform does not meet the
> >> requirements.
> >>
> >> > I wonder why the documented requirement that an "inverse transform
> >> must exist" does not translate into a method ... getInverse();
> >>
> >> Good point. All current implementations are able to provide an inverse so
> >> that method should be present on the interface.
> >>
> >> In regard to renaming the Transform interface, I had another idea. The
> >> main purpose of that interface is to provide a way for the partitioning
> >> code in the core module to implement generic transforms of BSP trees (see
> >> AbstractBSPTree.transform()). This is what leads to the requirement that
> >> the transform preserve parallelism, since otherwise, the represented
> >> region may be warped in such a way as to make the tree invalid. However,
> >> as far as I can tell, there is not a general mathematical term for this
> >> type of transform that applies to Euclidean and non-Euclidean geometries.
> >> So, my thought is to move the Transform interface to the "partitioning"
> >> package to indicate its relationship to those classes and simply name it
> >> something descriptive like "ParallelismPreservingTransform" ("parallelism"
> >> since that is the more generic, non-Euclidean form of the concept of
> >> "parallel"). The Euclidean module could then provide a true
> >> "AffineTransform" interface that extends "ParallelismPreservingTransform".
> >> The spherical module transforms would directly inherit from
> >> "ParallelismPreservingTransform" and thus avoid any incorrect usage of the
> >> term "affine". The class hierarchy would then look like this:
> >>
> >> commons-geometry-core
> >>    ParallelismPreservingTransform
> >>
> >> commons-geometry-euclidean
> >>     AffineTransform extends ParallelismPreservingTransform
> >>     AffineTransformXD extends AffineTransform
> >>     AffineTransformMatrixXD implements AffineTransformXD
> >>     Rotation3D extends AffineTransform3D
> >>     QuaternionRotation implements Rotation3D
> >>
> >> commons-geometry-spherical
> >>     Transform1S implements ParallelismPreservingTransform<Point1S>
> >>     Transform2S implements ParallelismPreservingTransform<Point2S>
> >>
> >> I think the type names here are much more descriptive and mathematically
> >> accurate. WDYT?
> >
> > I'm not convinced that such a hierarchy would enhance clarity.
> > If the "Transform" is intimately related to the "core" and there is a
> > single
> > set of properties that make it "affine" (and work correctly), I'd tend to
> > keep the name "Transform".  [As long as unit tests ensure that concrete
> > implementations possess the expected properties, we are safe.]
> >
> > Regards,
> > Gilles
> >
> >> -Matt
> >>
> >>
> >> [1] https://en.wikipedia.org/wiki/Geometric_transformation
> >>
> >> ________________________________
> >> From: Gilles Sadowski <gillese...@gmail.com>
> >> Sent: Wednesday, January 8, 2020 8:16 AM
> >> To: Commons Developers List <dev@commons.apache.org>
> >> Subject: Re: [geometry] Rename Transform to AffineTransform
> >>
> >> Hi.
> >>
> >> Le mer. 8 janv. 2020 à 04:39, Matt Juntunen
> >> <matt.juntu...@hotmail.com> a écrit :
> >> >
> >> > Gilles,
> >> >
> >> > > I thought that the question was how to replace "transform"...
> >> >
> >> > I should probably clarify. I want to change the name of the Transform
> >> > class to make it clear that it only represents transforms that preserve
> >> > parallelism (eg, affine transforms). The most obvious name would be
> >> > AffineTransform
> >>
> >> How about keeping "Transform" for the interface name and define a method
> >> ---CUT---
> >> /**
> >>  * Move here the doc explaining under what conditions this method can
> >> return "true".
> >>  */
> >> boolean isAffine();
> >> ---CUT---
> >> ?
> >>
> >> Gilles
> >>
> >> > like I suggested but I want to make sure that no one objects to this for
> >> > design or mathematical reasons.
> >> >
> >> > > Anyways, what would be the issue(s) of a non-affine transform?
> >> > > IOW why should implementations of "Transfrom" be restricted to affine
> >> > > transform?
> >> >
> >> > Instances of Transform are used to transform hyperplanes and
> >> > hyperplane-bounded regions. If the transform is not affine, then the
> >> > computed results will not be accurate.
> >>
> >> I don't get that it is an "accuracy" issue. If some requirement is not
> >> met,
> >> results will be plain wrong; so it depends on usage: when the transform
> >> must be affine, the code being passed that instance should be able to
> >> check whether it can use it for the intended purpose.
> >>
> >> I wonder why the documented requirement that an "inverse transform
> >> must exist" does not translate into a method
> >> ---CUT---
> >> Transform<P> getInverse();
> >> ---CUT---
> >>
> >> Regards,
> >> Gilles
> >>
> >> > -Matt
> >> > ________________________________
> >> > From: Gilles Sadowski <gillese...@gmail.com>
> >> > Sent: Tuesday, January 7, 2020 6:41 PM
> >> > To: Commons Developers List <dev@commons.apache.org>
> >> > Subject: Re: [geometry] Rename Transform to AffineTransform
> >> >
> >> > Le mar. 7 janv. 2020 à 17:55, Matt Juntunen
> >> > <matt.juntu...@hotmail.com> a écrit :
> >> > >
> >> > > Gilles,
> >> > >
> >> > > > "AffineMap" (?)
> >> > >
> >> > > I think any name that doesn't include the word "transform" somehow
> >> > > would probably be confusing.
> >> >
> >> > This is supposed to be a synonym.[1]
> >> > I thought that the question was how to replace "transform"...
> >> >
> >> > >
> >> > > > Was the same "Transform" interface used in both the "euclidean" and
> >> > > > the
> >> > > "spherical" packages of "Commons Math"?
> >> > >
> >> > > Indirectly. SphericalPolygonsSet extended AbstractRegion, which
> >> > > included an applyTransform(Transform) method.
> >> >
> >> > So the "affine" requirement (in the doc) applied there too.
> >> >
> >> > Anyways, what would be the issue(s) of a non-affine transform?
> >> > IOW why should implementations of "Transfrom" be restricted to affine
> >> > transform?
> >> >
> >> > Regards,
> >> > Gilles
> >> >
> >> > [1] https://en.wikipedia.org/wiki/Affine_transformation
> >> >
> >> > > -Matt
> >> > > ________________________________
> >> > > From: Gilles Sadowski <gillese...@gmail.com>
> >> > > Sent: Tuesday, January 7, 2020 10:29 AM
> >> > > To: Commons Developers List <dev@commons.apache.org>
> >> > > Subject: Re: [geometry] Rename Transform to AffineTransform
> >> > >
> >> > > Hello.
> >> > >
> >> > > Le mar. 7 janv. 2020 à 16:00, Matt Juntunen
> >> > > <matt.juntu...@hotmail.com> a écrit :
> >> > > >
> >> > > > Hi all,
> >> > > >
> >> > > > The documentation for the o.a.c.geometry.core.Transform interface
> >> > > > (which comes from the original commons-math version) states that
> >> > > > implementations must be affine. Therefore, I think we should rename
> >> > > > this interface to AffineTransform to avoid confusion with other
> >> > > > types of transforms, such as projective transforms. Potential
> >> > > > problems with this are
> >> > > > - the fact that the JDK already has a class with the same name
> >> > > > (java.awt.geom.AffineTransform), and
> >> > >
> >> > > "AffineMap" (?)
> >> > >
> >> > > > - I'm not sure if the term "affine" can technically be applied to
> >> > > > non-Euclidean geometries, such as spherical geometry (there may be
> >> > > > nuances there that I'm not aware of).
> >> > >
> >> > > Was the same "Transform" interface used in both the "euclidean" and
> >> > > the
> >> > > "spherical" packages of "Commons Math"?
> >> > >
> >> > > Regards,
> >> > > Gilles
> >> > >
> >> > > > Anyone have any insight or opinions on this? I've created
> >> > > > GEOMETRY-80 to track this issue.
> >> > > >
> >> > > > Regards,
> >> > > > Matt
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
> For additional commands, e-mail: dev-h...@commons.apache.org
>

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
For additional commands, e-mail: dev-h...@commons.apache.org

Reply via email to