当前位置: 首页 > 知识库问答 >
问题:

仿射变换变换不同的图形对象

樊烨烨
2023-03-14

我通过此方法调用draw类:

@Override
protected void paintComponent(Graphics g) {

    super.paintComponent(g);
    DrawGradient gradient = new DrawGradient();
    gradient.draw(g);

    DrawCoordinateSystem coor = new DrawCoordinateSystem();
    coor.draw(g);
}

我试图转换DrawGradient类中的对象,但由于某种原因,DrawCoordinateSystem类中的图形对象会被转换。为什么?

DrawCoordinateSystem类:

public class DrawCoordinateSystem {

public DrawCoordinateSystem() {
    // TODO Auto-generated constructor stub
}

 public void draw(Graphics g1){

             Color customcolor = new Color(210,191,245);

             int x0 = 15, y0 = 15;

             int Xpoints[] = {x0+45, x0+40, x0+40};
             int Ypoints[] = {y0, y0-5, y0+5};

             int Xpoints1[] = {x0, x0+5, x0-5};
             int Ypoints1[] = {y0+45, y0+40, y0+40};


             g1.setColor(customcolor);

             g1.drawPolygon(Xpoints,Ypoints, 3);
             g1.fillPolygon(Xpoints,Ypoints, 3);

             g1.drawPolygon(Xpoints1,Ypoints1, 3);
             g1.fillPolygon(Xpoints1,Ypoints1, 3);

             g1.drawLine(x0, y0, x0+40, y0);
             g1.drawLine(x0, y0, x0, y0+40);

             g1.setFont(new Font("TimesRoman", Font.PLAIN, 12));
             g1.drawString("x", 52, 30);

             g1.setFont(new Font("TimesRoman", Font.PLAIN, 12));
             g1.drawString("y", 23, 57);

    }

}

绘图渐变类:

public class DrawGradient {

public DrawGradient() {

}


private  Color c1;
private  Color c2;


public void draw( Graphics g ) {

        Graphics2D g2d1 = (Graphics2D) g;
        GradientPaint gp = new GradientPaint(0, 0, c2, 0, 100, c1);
        g2d1.setPaint(gp);
        Rectangle reckt = new Rectangle(0,0,100,100);
        g2d1.fill(reckt);

        AffineTransform move = new AffineTransform();
        move.translate(200, 200);
        g2d1.setTransform(move);





}

}

共有1个答案

萧德馨
2023-03-14

转换是复合的,所以,一旦你应用了转换,你需要在完成后逆转它。

现在,您可以手动执行此操作,或者您可以在手动之前创建Graphics上下文的副本,并在完成后将其处理掉。这可以防止您对要对原始副本进行的副本的属性进行任何更改(但您绘制的内容仍然存在)

public class TestPane extends JPanel {

    public TestPane() {
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(200, 200);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Color c1 = new Color(0, 0, 255);
        Color c2 = new Color(0, 255, 255);
        GradientPaint gp = new GradientPaint(0, 0, c1, 0, 100, c2);

        Graphics2D g2d = (Graphics2D) g.create();
        g2d.setPaint(gp);
        g2d.setTransform(AffineTransform.getTranslateInstance(100, 100));
        g2d.fill(new Rectangle(0, 0, 100, 100));
        g2d.dispose();

        g2d = (Graphics2D) g.create();
        g2d.setPaint(gp);
        g2d.fill(new Rectangle(0, 0, 100, 100));
        g2d.dispose();
    }

}

例如,在您将上下文传递给其他方法之前,我需要创建一个图形上下文的副本

Graphics2D g2d =(Graphics2D)g.create();
DrawGradient gradient = new DrawGradient();
gradient.draw(g2d);
g2d.dispose();

g2d =(Graphics2D)g.create();
DrawCoordinateSystem coor = new DrawCoordinateSystem();
coor.draw(g2d);
g2d.dispose();

这样您就可以控制。如果您可以避免,我建议不要在绘制组件方法中创建新对象,特别是如果这些对象并没有真正从一个绘制周期更改到另一个,因为绘制组件可以快速连续调用多次

 类似资料:
  • 我正在制作一个带有Swing的GUI,它使用仿射变换来缩放绘制在JInternalFrame上的图形2D对象。问题是,它在当前状态下有问题,我不知道为什么。 为什么我的代码不能正确伸缩?为什么图形会在调整大小时“跳转”到面板顶部? 以下是我的独立示例:

  • 在第三章“图层几何学”中,我们使用了UIView的transform属性旋转了钟的指针,但并没有解释背后运作的原理,实际上UIView的transform属性是一个CGAffineTransform类型,用于在二维空间做旋转,缩放和平移。CGAffineTransform是一个可以和二维空间向量(例如CGPoint)做乘法的3X2的矩阵(见图5.1)。 图5.1 用矩阵表示的CGAffineTra

  • 我有一个名为的类。在这个类中,我有变量,它是类型。此外,我还有类,它重写函数: 我的airplane.rotateAirplane()函数如下所示: 当我运行我的程序时,只绘制对象。当我删除这条车道时 我也有我的飞机,但没有旋转。

  • 我似乎无法让一种坐标格式与另一种格式配合使用。我想我只是没有使用正确的矩阵,但我对它们的了解还不够确定。我希望得到一些帮助,弄清楚我是否在假设我的转换应该是什么。 iText使用左下角作为ISO标准的原点,但pdfbox代码和从pdf中获取坐标的程序都使用左上角作为原点。 我应该做什么转换来调整坐标,以便iText能够以一种有效的方式使用它们? 我有一些代码,使用pdfbox来操作pdf并去除一些

  • 所以基本上我想做的是只使用仿射变换和一个draw语句来绘制一个任意边数的多边形:。是的,我知道有一个函数——这不是这个问题的重点。为了简单起见,多边形是“正”多边形,这意味着它的所有边和边之间的角度都是相同的。 主要问题是,我不完全理解如何使点正确对齐: 我想要的只是在屏幕上画一个正方形。然而,台词到处都是。。。我猜这与的使用方式有关。

  • 变换 变换包括就对象进行移动、旋转、镜像、缩放和倾斜。可以使用 “变换 ”面板、 “对象 ”>“变换 ”命令以及专用工具来变换对象。还可通过拖动选区的定界框来完成多种变换类型。 某些情况下,您可能要对同一变换操作重复数次,在复制对象时尤其如此。利用 “对象 ”菜单中的 “再次变换 ”命令,可以根据需要,重复执行移动、缩放、旋转、镜像或倾斜操作,直至执行下一变换操作。 对选定对象进行变换时,可以使用