001package conexp.fx.gui.graph.transformation;
002
003/*
004 * #%L
005 * Concept Explorer FX
006 * %%
007 * Copyright (C) 2010 - 2023 Francesco Kriegel
008 * %%
009 * This program is free software: you can redistribute it and/or modify
010 * it under the terms of the GNU General Public License as
011 * published by the Free Software Foundation, either version 3 of the
012 * License, or (at your option) any later version.
013 * 
014 * This program is distributed in the hope that it will be useful,
015 * but WITHOUT ANY WARRANTY; without even the implied warranty of
016 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
017 * GNU General Public License for more details.
018 * 
019 * You should have received a copy of the GNU General Public
020 * License along with this program.  If not, see
021 * <http://www.gnu.org/licenses/gpl-3.0.html>.
022 * #L%
023 */
024
025
026import conexp.fx.core.math.GuavaIsomorphism;
027import javafx.geometry.Point3D;
028
029public class RotationXY extends GuavaIsomorphism<Point3D, Point3D> {
030
031  private final double  angle;
032  private final Point3D center;
033
034  public RotationXY(final Point3D center, final double angle) {
035    super();
036    this.angle = angle;
037    this.center = center;
038  }
039
040  @Override
041  public final Point3D apply(final Point3D p) {
042    final double dx = p.getX() - center.getX();
043    final double dy = p.getY() - center.getY();
044    final double r = Math.sqrt(dx * dx + dy * dy);
045    final double w = Math.atan2(dy, dx) + angle;
046    return new Point3D(r * Math.cos(w) + center.getX(), r * Math.sin(w) + center.getY(), p.getZ());
047  }
048
049  @Override
050  public final Point3D invert(final Point3D q) {
051    final double dx = q.getX() - center.getX();
052    final double dy = q.getY() - center.getY();
053    final double r = Math.sqrt(dx * dx + dy * dy);
054    final double w = Math.atan2(dy, dx) - angle;
055    return new Point3D(r * Math.cos(w) + center.getX(), r * Math.sin(w) + center.getY(), q.getZ());
056  }
057}