freerouting/src/main/java/eu/mihosoft/freerouting/board/CoordinateTransform.java

142 lines
5.2 KiB
Java

/*
* Copyright (C) 2014 Alfons Wirtz
* website www.freerouting.net
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License at <http://www.gnu.org/licenses/>
* for more details.
*
* CoordinateTransform.java
*
* Created on 17. Dezember 2004, 07:34
*/
package eu.mihosoft.freerouting.board;
import eu.mihosoft.freerouting.geometry.planar.FloatPoint;
/**
* Class for transforming objects between user coordinate space and eu.mihosoft.freerouting.board coordinate space.
*
* @author Alfons Wirtz
*/
public class CoordinateTransform implements java.io.Serializable
{
/** Creates a new instance of CoordinateTransform */
public CoordinateTransform(double p_user_unit_factor, Unit p_user_unit,
double p_board_unit_factor, Unit p_board_unit)
{
user_unit = p_user_unit;
board_unit = p_board_unit;
user_unit_factor = p_user_unit_factor;
board_unit_factor = p_board_unit_factor;
scale_factor = board_unit_factor / user_unit_factor;
}
/**
* Scale a value from the eu.mihosoft.freerouting.board to the user coordinate system.
*/
public double board_to_user(double p_value)
{
return Unit.scale(p_value * scale_factor, board_unit, user_unit);
}
/**
* Scale a value from the user to the eu.mihosoft.freerouting.board coordinate system.
*/
public double user_to_board(double p_value)
{
return Unit.scale(p_value / scale_factor, user_unit, board_unit) ;
}
/**
* Transforms a eu.mihosoft.freerouting.geometry.planar.FloatPoint from the eu.mihosoft.freerouting.board coordinate space
* to the user coordinate space.
*/
public FloatPoint board_to_user(FloatPoint p_point)
{
return new FloatPoint(board_to_user(p_point.x), board_to_user(p_point.y));
}
/**
* Transforms a eu.mihosoft.freerouting.geometry.planar.FloatPoint from the user coordinate space.
* to the eu.mihosoft.freerouting.board coordinate space.
*/
public FloatPoint user_to_board(FloatPoint p_point)
{
return new FloatPoint(user_to_board(p_point.x), user_to_board(p_point.y));
}
public PrintableShape board_to_user(eu.mihosoft.freerouting.geometry.planar.Shape p_shape, java.util.Locale p_locale)
{
PrintableShape result;
if (p_shape instanceof eu.mihosoft.freerouting.geometry.planar.Circle)
{
result = board_to_user((eu.mihosoft.freerouting.geometry.planar.Circle) p_shape, p_locale);
}
else if (p_shape instanceof eu.mihosoft.freerouting.geometry.planar.IntBox)
{
result = board_to_user((eu.mihosoft.freerouting.geometry.planar.IntBox) p_shape, p_locale);
}
else if (p_shape instanceof eu.mihosoft.freerouting.geometry.planar.PolylineShape)
{
result = board_to_user((eu.mihosoft.freerouting.geometry.planar.PolylineShape) p_shape, p_locale);
}
else
{
System.out.println("CoordinateTransform.board_to_user not yet implemented for p_shape");
result = null;
}
return result;
}
public PrintableShape.Circle board_to_user(eu.mihosoft.freerouting.geometry.planar.Circle p_circle, java.util.Locale p_locale)
{
return new PrintableShape.Circle(board_to_user(p_circle.center.to_float()),
board_to_user(p_circle.radius), p_locale);
}
public PrintableShape.Rectangle board_to_user(eu.mihosoft.freerouting.geometry.planar.IntBox p_box, java.util.Locale p_locale)
{
return new PrintableShape.Rectangle(board_to_user(p_box.ll.to_float()),
board_to_user(p_box.ur.to_float()), p_locale);
}
public PrintableShape.Polygon board_to_user(eu.mihosoft.freerouting.geometry.planar.PolylineShape p_shape, java.util.Locale p_locale)
{
FloatPoint[] corners = p_shape.corner_approx_arr();
FloatPoint[] transformed_corners = new FloatPoint[corners.length];
for (int i = 0; i < corners.length; ++i)
{
transformed_corners[i] = board_to_user(corners[i]);
}
return new PrintableShape.Polygon(transformed_corners, p_locale);
}
/** The unit used for user coordinates */
public final Unit user_unit;
/** The factor of the user unit */
public final double user_unit_factor;
/** The unit used for eu.mihosoft.freerouting.board coordinates */
public final Unit board_unit;
/** The factor of the eu.mihosoft.freerouting.board unit */
public final double board_unit_factor;
/** The factor used for transforming coordinates between user coordinate space and eu.mihosoft.freerouting.board coordinate space */
private final double scale_factor;
}