当前位置: 首页 > 面试题库 >

创建变换以从一个矩形映射到另一个矩形?

戚衡
2023-03-14
问题内容

创建AffineTransform哪一个将坐标从一个矩形映射到另一个矩形(给出浮动/双矩形)的最简单方法是什么?

更新1

矩形可以完全不同。例如[(0,0)-(1,1)]和[(150,-14)-(-1000,-14.1)]。并且转换应该统一转换。例如,矩形角应一一变换。例如,坐标(0,0)应该变成(150,-14)。

更新2

我需要AffineTransform对象,而不仅仅是计算。因为我想将其应用于Graphics对象。我也想以一些简单转换的串联形式。

更新3

以下所有3个测试均失败:

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

    }

}

问题答案:

要将[(a,b)-(c,d)]转换为[(e,f)-(g,h)],可以执行以下计算:

x' = e + (x - a) * (g - e) / (c - a);
y' = f + (y - b) * (h - f) / (d - b);

这是相应的AffineTransform代码,在这里r1将转换为r2

t = new AffineTransform();
t.translate(r2.getMinX(), r2.getMinY());
t.scale(r2.getWidth()/r1.getWidth(), r2.getHeight()/r1.getHeight());    
t.translate(-r1.getMinX(), -r1.getMinY());


 类似资料:
  • 在上面的图片中,我展示了两个矩形 矩形1,其x可以从-900到13700不等,Y可以从-600到6458 矩形2,其坐标X可以从0到3000变化,而y可以从0到2000变化 同样:矩形2的起点位于左上角位置(0,0),而矩形1的起点位于左上角位置(宽度/2,高度/2)。 我需要做的是:使用缩放或平移将矩形1的点转换为矩形2的点。 那么,为了将矩形1的坐标转换为矩形2的坐标,< code>x和< c

  • 我正在创建一个简单的Java2D程序。它应该从另一个类中绘制矩形,但它不起作用。如果你们中有人能花点时间看看我哪里出了问题,我将不胜感激。这是我明天要交的最后一项作业。 以下是我迄今为止所编写的代码: Block.java 下面是主类: 非常感谢。

  • 给定两个矩形的边的长度,我必须编写代码来检查第一个矩形是否可以被第二个矩形完全覆盖。只能旋转第二个矩形,看看它是否可以覆盖第一个矩形。 A和B是第一个矩形的边的长度,我们要覆盖的那个,C和D是第二个矩形的边的长度,它将覆盖第一个。 我尝试了两种代码,但仍然不起作用。第一个是天真的解决方案,但我不知道它是否正确。 然后我用我的数学技巧找出第二个矩形(和)的边应该

  • 我有两个矩形:红色和绿色。对于它们中的每一个,我有以下信息: 中心点( 和 坐标)。 旋转角度 宽度和高度 矩形将始终以正坐标移动。编辑:没有坐标可以是负的:矩形总是位于正坐标。因此,中心永远不会是(0,0)。 问题 我有一个起始位置。为了简化示例,假设我的红色和绿色矩形的位置如下: 现在,我使用0º和90º之间的角度φ旋转红色矩形。但是,绿色矩形需要旋转并保持其相对于红色矩形的位置。绿色矩形不仅

  • 我有一个点[xmin,ymin,xmax,ymax]的列表,每个点都按黑点显示 请注意,有许多这样的矩形,如图像所示。红色的应检测删除,绿色的应保留。 输入是 n 矩形 输出是覆盖区域和它覆盖的矩形 id 。最好给出一些算法和解释。

  • 问题内容: 我需要快速创建一个只有两个圆角的矩形(也可以使用目标C代码)。 目前,我的代码正在创建两个矩形 和 并将它们合并(有两个直角和两个圆角),但是我对代码不满意,并且我很确定应该有更好的方法。 我是iOS和图形开发的新手。 问题答案: 在 Swift 2.3中, 您可以这样做 在 Objective-C中, 您可以使用class方法 示例实现- 并将上述方法称为-