Transformation erstellen, um von einem Rechteck in ein anderes zu mappen?

Was ist der einfachste Weg, um zu erstellenAffineTransform Welche Karten Koordinaten von einem Rechteck zum anderen (float / double Rechtecke sind gegeben)?

UPDATE 1

Rechtecke können absolut unterschiedlich sein. Zum Beispiel [(0,0) - (1,1)] und [(150, -14) - (- 1000, -14,1)]. Und Transformation sollte sich gleichmäßig verändern. Beispielsweise sollten Rechteckecken eins zu eins transformiert werden. Zum Beispiel sollten die Koordinaten (0,0) zu (150, -14) werden.

UPDATE 2

Ich braucheAffineTransform Objekt, nicht nur Berechnung. Weil ich es anwenden möchteGraphics Objekt. Auch möchte ich in Form einer Verkettung von einfachen Transformationen haben.

UPDATE 3

Alle folgenden 3 Tests sind fehlgeschlagen:

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);

    }

}

Antworten auf die Frage(1)

Ihre Antwort auf die Frage