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 final class PolarTransformation extends GuavaIsomorphism<Point3D, Point3D> {
030
031//  private final double minX;
032  private final double width;
033  private final double centerX;
034
035  public PolarTransformation(final double minX, final double width) {
036//    this.minX = minX;
037    this.width = width;
038    this.centerX = minX + width / 2d;
039  }
040
041  @Override
042  public final Point3D apply(final Point3D p) {
043    final double a = ((p.getX() - centerX) / width) * (1.8d * Math.PI);
044    final double r = p.getY();
045    return new Point3D(r * Math.sin(a), r * Math.cos(a), 0);
046  }
047
048  @Override
049  public final Point3D invert(final Point3D q) {
050    final double a = Math.atan2(q.getX(), q.getY());
051    final double r = Math.sqrt(q.getX() * q.getX() + q.getY() * q.getY());
052    final double x = centerX + ((a * width) / (1.8d * Math.PI));
053    final double y = r;
054    return new Point3D(x, y, 0);
055  }
056}