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

只使用线和仿射变换来绘制多边形

平嘉熙
2023-03-14

所以基本上我想做的是只使用仿射变换和一个draw语句来绘制一个任意边数的多边形:g2。绘制(新线条2D(0,0,1,0)。是的,我知道有一个drawPolygon函数——这不是这个问题的重点。为了简单起见,多边形是“正”多边形,这意味着它的所有边和边之间的角度都是相同的。

主要问题是,我不完全理解如何使点正确对齐:

import java.awt.*;
import java.awt.geom.AffineTransform;
import java.awt.geom.Line2D;

import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class PolygonDrawer extends JComponent implements Runnable, ChangeListener {

    JFrame jframe;

    public PolygonDrawer() {
        SwingUtilities.invokeLater(this);
    }

    public static void main(String[] args) {
        System.setProperty("awt.useSystemAAFontSettings","on");
        new PolygonDrawer();
    }

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

    public void run() {
        jframe = new JFrame("PolygonDrawer");
        jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel mainpanel = new JPanel();
        mainpanel.setLayout(new BorderLayout());
        mainpanel.add(this, BorderLayout.CENTER);
        jframe.getContentPane().add(mainpanel);
        jframe.setVisible(true);
        jframe.pack();
    }

    @Override
    public void stateChanged(ChangeEvent e) {
        repaint();
    }

    @Override
    protected void paintComponent(Graphics g) {
        // Configuration stuff
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        Dimension dim = this.getSize();
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        // Fill background
        g2.setColor(Color.white);
        g2.fillRect(0, 0, dim.width, dim.height);

        g2.setColor(Color.black);
        AffineTransform save = g2.getTransform();
        // Example polygon is a regular square
        int noVertices = 4;
        int rotationAngleInDegrees = 90;

        for (int i = 0; i < noVertices; i++) {
            g2.setTransform(save);
            AffineTransform at = new AffineTransform();
            at.rotate(Math.toRadians(i + 1) * rotationAngleInDegrees);
            at.translate(save.getTranslateX(), save.getTranslateY());
            at.scale(100, 1);
            g2.setTransform(at);
            g2.draw(new Line2D.Double(0.0,0.0,1.0,0.0));
            save = g2.getTransform();
        }
    }
}

我想要的只是在屏幕上画一个正方形。然而,台词到处都是。。。我猜这与save的使用方式有关。

共有1个答案

郁景龙
2023-03-14

它使用仿射变换和一个draw语句。希望有帮助。


    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.RenderingHints;
    import java.awt.geom.AffineTransform;
    import java.awt.geom.Line2D;

    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.SwingUtilities;

    public class PolygonDrawer extends JPanel {

       JFrame jframe;
       int    WIDTH  = 500;
       int    HEIGHT = 500;
       int    AX     = 100; 
       int    AY     = 100;

       public static void main(String[] args) {
          SwingUtilities.invokeLater(() -> new PolygonDrawer().start());
       }
       public void start() {
          jframe = new JFrame("PolygonDrawer");
          jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          setPreferredSize(new Dimension(WIDTH, HEIGHT));
          jframe.add(this);
          jframe.pack();
          jframe.setLocationRelativeTo(null);
          jframe.setVisible(true);
       }

       @Override
       protected void paintComponent(Graphics g) {
          // Configuration stuff
          super.paintComponent(g);
          Graphics2D g2d = (Graphics2D) g.create();
          Dimension dim = this.getSize();
          g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);
          // Fill background
          g2d.setColor(Color.white);
          g2d.fillRect(0, 0, dim.width, dim.height);

          g2d.setColor(Color.black);
          AffineTransform af = g2d.getTransform();

          int noVertices = 6;
          double rotationAngle = ((2 * Math.PI) / noVertices);
          double x1 = WIDTH / 2 - AX;
          double y1 = HEIGHT / 2 - AY;
          af.translate(x1, y1);
          for (int i = 0; i < noVertices; i++) {
             af.rotate(rotationAngle, AX, AY);
             double x2 = af.getTranslateX();
             double y2 = af.getTranslateY();
             g2d.draw(new Line2D.Double(x1, y1, x2, y2));
             x1 = x2;
             y1 = y2;
          }
       }
    }

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

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

  • 假设我有三个锚,来自阿拉片段的命中结果。 锚定=命中结果。createAnchor(); 如何使用Sceneform绘制三角形并应用自定义纹理?

  • 如何连接多点与流动曲线,使用PyQt5?例如,我试图使用quitTo()对8个点执行此操作,使用交替点作为控制点,但弧不接触控制点(见下面的代码和图表)。我也尝试使用cubicTo(),但这也导致了一个奇怪的曲线。use是否有任何其他函数调用,我应该使用,或自定义的方式来做到这一点?

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

  • 我通过此方法调用draw类: 我试图转换DrawGradient类中的对象,但由于某种原因,DrawCoordinateSystem类中的图形对象会被转换。为什么? DrawCoordinateSystem类: 绘图渐变类: