Utwórz transformację, aby odwzorować jeden prostokąt na inny?
Jaki jest najprostszy sposób tworzeniaAffineTransform
który odwzorowuje współrzędne z jednego prostokąta na inny (podano pływające / podwójne prostokąty)?
AKTUALIZACJA 1
Prostokąty mogą być zupełnie inne. Na przykład [(0,0) - (1,1)] i [(150, -14) - (- 1000, -14,1)]. A transformacja powinna się przekształcić jednolicie. Na przykład prostokątne rogi powinny być przekształcane jeden do jednego. Na przykład współrzędne (0,0) powinny zmienić się na (150, -14).
AKTUALIZACJA 2
potrzebujęAffineTransform
obiekt, nie tylko obliczenia. Ponieważ chcę to zastosowaćGraphics
obiekt. Chciałbym również mieć w formie pewną konkatenację prostych przekształceń.
AKTUALIZACJA 3
Wszystkie następujące 3 testy nie powiodły się:
public class RectangleTransformTest {
private static final double delta = 0.001;
Rectangle2D r1 = new Rectangle2D.Double(-1, 0, 2, 0.01);
Rectangle2D r2 = new Rectangle2D.Double(10, 20, 400, 300);
AffineTransform t;
Point2D src;
Point2D dst1, dst2;
@Test
public void test1() {
t = new AffineTransform();
t.translate(+r2.getMinX()-r1.getMinX(), +r2.getMinY()-r1.getMinY());
t.scale(r2.getWidth()/r1.getWidth(), r2.getHeight()/r1.getHeight());
}
@Test
public void test2() {
t = new AffineTransform();
t.scale(r2.getWidth()/r1.getWidth(), r2.getHeight()/r1.getHeight());
t.translate(+r2.getMinX()-r1.getMinX(), +r2.getMinY()-r1.getMinY());
}
@Test
public void test3() {
t = new AffineTransform();
t.scale((r2.getMaxX()-r2.getMinX())/(r1.getMaxX()-r1.getMinX()), (r2.getMaxY()-r2.getMinY())/(r1.getMaxY()-r1.getMinY()));
t.translate(+r2.getMinX()-r1.getMinX(), +r2.getMinY()-r1.getMinY());
}
@After
public void comparePoints() {
src = new Point2D.Double(r1.getMinX(), r1.getMinY());
dst1 = new Point2D.Double();
t.transform(src, dst1);
dst2 = new Point2D.Double(r2.getMinX(), r2.getMinY());
assertEquals(dst2.getX(), dst1.getX(), delta);
assertEquals(dst2.getY(), dst1.getY(), delta);
src = new Point2D.Double(r1.getMinX(), r1.getMaxY());
dst1 = new Point2D.Double();
t.transform(src, dst1);
dst2 = new Point2D.Double(r2.getMinX(), r2.getMaxY());
assertEquals(dst2.getX(), dst1.getX(), delta);
assertEquals(dst2.getY(), dst1.getY(), delta);
src = new Point2D.Double(r1.getMaxX(), r1.getMinY());
dst1 = new Point2D.Double();
t.transform(src, dst1);
dst2 = new Point2D.Double(r2.getMaxX(), r2.getMinY());
assertEquals(dst2.getX(), dst1.getX(), delta);
assertEquals(dst2.getY(), dst1.getY(), delta);
src = new Point2D.Double(r1.getMaxX(), r1.getMaxY());
dst1 = new Point2D.Double();
t.transform(src, dst1);
dst2 = new Point2D.Double(r2.getMaxX(), r2.getMaxY());
assertEquals(dst2.getX(), dst1.getX(), delta);
assertEquals(dst2.getY(), dst1.getY(), delta);
}
}