【问题标题】:Problems with 2D Graphics: equivalent AffineTransform codes?2D 图形的问题:等效的 AffineTransform 代码?
【发布时间】:2022-02-03 19:11:29
【问题描述】:

我正在学习 Java。我已经解决了这个问题,但是我对 2D 图形有一个大问题。在讲座中,关于AffineTransform,我们了解到这些代码:

 1. translate(double x, doubley),
 2. scale(double x, double y),
 3. rotate(double theta),
 4. shear(double x, double y),
 5. transform(AffineTransform at) and
 6. setTransform(AffineTransform).

我现在最大的问题是我们的教授说,有了这些代码,所有关于转换的事情都是可行的。这就是他向我们展示的全部内容。

AffineTransform at = AffineTransform.getTranslateInstance(this.pos.getX(), this.pos.getY());
at.concatenate(AffineTransform.getScaleInstance(this.scaleX, this.scaleY));

Shape shape = at.createTransformedShape(this.form);
Point2D center = getCenter(shape);

at = AffineTransform.getRotateInstance(this.winkel, center.getX(), center.getY());
return at.createTransformedShape(shape);

例如,我现在的问题是这个。为什么我们不使用例如at.rotate 而我们使用at = AffineTransform.getRotateInstance

为什么我们使用at=AffineTransform.getTranslateInstance 而不是at.translate

我不明白。我们的教授说命令已经足够了,现在添加了新的?我可以制作这段代码中的内容吗?相当于我列出的代码?

因为我们的教授说我可以用我列出的代码做任何事情,但导师从不使用它们!他使用了我没有得到的这些代码,我一直在练习和训练这些列出的代码,现在我很惊讶。

我的主要问题是:我能否以某种方式使用列出的代码获得与粘贴的代码相同的结果?有什么办法可以代替吗?

【问题讨论】:

  • getXxx static 方法为您提供了一个起点,与必须直接使用构造函数不同,它们是令人信服的方法。一旦你有了类的实例,你就可以应用额外的转换
  • 你“可以”做类似AffineTransform at = new AffineTransform(); 然后at.rotate(this.winkel, center.getX(), center.getY()); 的事情,但是你必须问“为什么”这个问题?当你可以只在一行上使用getRotateInstance ;)
  • 好的,谢谢,但是我如何使用 erxamle AffineTransform at = new AffineTransform() 然后 at.rotate(this.winkel, center.getX(), center.getY());在此之后连接?例如 getRotateInstance 我现在如何使用连接,但我如何使用它,例如 at.rotate?
  • 对转换的每个附加操作都会被连接起来,仅仅因为你开始使用getXxx 方法没有区别,它只是一个说服方法
  • 对不起,这个愚蠢的问题,但你能不能把我帖子中的代码“翻译”为一个正常的答案,没有那个 get 但有连接,我可以看到一次吗? (对不起,我是菜鸟)

标签: java swing affinetransform


【解决方案1】:

请注意AffineTransform 方法concatenate() 使用matrix multiplication,即not commutative。连接变换的优点是可以执行一次乘法,结果可以重复使用。关注引用here的具体示例,给定一个名为at的恒等变换:

AffineTransform at = new AffineTransform();

以下三个公式是等价的:

at.translate(SIZE/2, SIZE/2);
at.scale(60, 60);
at.rotate(Math.PI/4);

at.concatenate(AffineTransform.getTranslateInstance(SIZE / 2, SIZE / 2));
at.concatenate(AffineTransform.getScaleInstance(60, 60));
at.concatenate(AffineTransform.getRotateInstance(Math.PI / 4));

at.preConcatenate(AffineTransform.getRotateInstance(Math.PI / 4));
at.preConcatenate(AffineTransform.getScaleInstance(60, 60));
at.preConcatenate(AffineTransform.getTranslateInstance(SIZE / 2, SIZE / 2));

【讨论】:

    猜你喜欢
    • 2012-02-15
    • 2015-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多