转换形状

4
我有两个点想以特定方式连接,如第一张图片所示。我知道所有四个点的坐标。然后需要将整个形状移动到坐标[0, 0]并旋转它,使得主要两个点都在x轴上(见第二张图片)。接下来,我需要仅在x轴上“挤压”形状,以使最后一个点的坐标为[0, 1](见最后一张图片)。
我的问题是 - 如何在Java中有效地计算出中间两点的坐标,而不必进行手动分析数学?

你可以祈求或将这项工作交给朋友……旋转、平移和缩放由大多数用户界面引擎支持,并涉及到数学。 - Aubin
@Aubin 当然,我不想绘制形状,只是使用一些我不知道的Java变换工具计算缺失的坐标(而不涉及解析几何)。 - kenor
程序完成,感谢java.awt.geom。 - Aubin
我已经为你的问题做了一个套件:https://dev59.com/mXDXa4cB1Zd3GeqP_l4f - Aubin
1个回答

3

java.awt.geom.AffineTransform 可能是一个起点。

该程序应用了三种变换(逆序):

import java.awt.geom.AffineTransform;

public class TransRotScal {

   public static void main( String[] args ) {
      double theta = Math.atan2( -15.0, 40.0 );
      AffineTransform trans = new AffineTransform(); // Identity
      trans.scale( 1/43.0, 1.0 );
      trans.rotate( theta );
      trans.translate( -10, -20 );
      double[] in = {
         10, 20,
         10, 30,
         50, 30,
         50, 35
      };
      double[] out = new double[in.length];
      trans.transform( in, 0, out, 0, in.length/2 );
      for( int ptNdx = 0; ptNdx < out.length; ptNdx += 2 ) {
         System.out.printf( "{%7.4f, %7.4f }\n", out[ptNdx], out[ptNdx+1]);
      }
   }
}

输出:

{ 0,0000,  0,0000 }
{ 0,0817,  9,3633 }
{ 0,9527, -4,6816 }
{ 0,9935,  0,0000 }

为了回答这个问题,我写了一个小程序,但我希望有一个更简单的方法。因此,我需要发表这个问题:对于图形的仿射变换,而不是文本和标签。请保留HTML标记,但不要写解释。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接