所以基本上我想做的是只使用仿射变换和一个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
的使用方式有关。
它使用仿射变换和一个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类: 绘图渐变类: