Tag: affinetransform

如何使用另一个象限作为坐标在JPanel上绘图?

我想通过覆盖paintComponent在JPanel上绘制一些形状。 我希望能够平移和缩放。 使用AffineTransform和Graphics2D对象上的setTransform方法可以轻松进行平移和缩放。 在做完之后,我可以使用g2.draw(myShape) myShape)绘制形状。形状用“世界坐标”定义,因此在平移时它可以正常工作,我必须在绘制之前将它们转换为canvas/ JPanel坐标。 现在我想改变坐标的象限 。 从JPanel和计算机经常使用的第四象限到用户最熟悉的第一象限。 X是相同的,但是Y轴应该向上而不是向下增加。 通过new Point(origo.x, -origo.y);很容易重新定义origo new Point(origo.x, -origo.y); 但是如何在这个象限中绘制形状? 我想保持形状的坐标(在世界坐标中定义)而不是在canvas坐标中。 所以我需要以某种方式转换它们,或者转换Graphics2D对象,我想有效地做到这一点。 我也可以使用AffineTransform吗? 我的绘图代码: public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 = (Graphics2D)g; g2.setColor(Color.blue); AffineTransform at = g2.getTransform(); at.translate(-origo.x, -origo.y); at.translate(0, getHeight()); at.scale(1, -1); g2.setTransform(at); g2.drawLine(30, 30, 140, 20); g2.draw(new CubicCurve2D.Double(30, 65, 23, 45, 23, 34, 67, […]

Java旋转图像变成背景黑色的一部分

当我尝试旋转图像时,看起来背景的一部分变黑(我的图像是透明的) 背景白色 背景的一部分变黑 这是旋转图像的代码: public BufferedImage rotate(int height, int width, BufferedImage originalImg, int angle) { BufferedImage rotateImage = null; try { rotateImage = new BufferedImage(height, width, BufferedImage.TYPE_INT_RGB); AffineTransform a90 = AffineTransform.getRotateInstance(Math.toRadians(angle), height / 2, width / 2); AffineTransformOp op90 = new AffineTransformOp(a90, AffineTransformOp.TYPE_BILINEAR); op90.filter(originalImg, rotateImage); } catch (Exception e) { System.err.println(e); } return rotateImage; }

使用仿射变换放大

我正在使用JAVA swing开展个人项目。 该项目是关于在窗口上绘制地图。 地图可以使用仿射变换进行缩放。 我在这里遇到的问题是每当我放大或缩小地图时,也会移动而不是放大/缩小位于屏幕中心的地图上的点 private void updateAT() { Dimension d = panel.getSize(); int panelW = d.width; int panelH = d.height; Rectangle2D r = regionList[0].get(“Victoria”).getShape().getBounds2D(); scaleX = (panelW/r.getWidth()) * zoom; scaleY = (panelH/r.getHeight()) * zoom; AffineTransform goToOrigin = AffineTransform.getTranslateInstance(-r.getMinX(), -r.getMinY()); AffineTransform pan = AffineTransform.getTranslateInstance(panX, panY); AffineTransform scaleAndFlip = AffineTransform.getScaleInstance(scaleX, -scaleY); //AffineTransform mirror_y = new AffineTransform(1, […]

java围绕中心旋转矩形

我想围绕它的中心点旋转一个矩形,它应该保留在它应该被绘制的位置并在该空间中旋转 这是我的代码: AffineTransform transform = new AffineTransform(); transform.rotate(Math.toRadians(45),rectangle.width/2, rectangle.height/2); Shape transformed = transform.createTransformedShape(rectangle); g2.fill(transformed) 旋转矩形但是在屏幕的不同部分绘制,我该如何纠正?

AffineTransform没有改变中风?

当使用带有两个不同参数的Graphics2D scale()函数(在x和y方向上按不同比例缩放)时,稍后在此Graphics2D对象上绘制的所有内容也会缩放。 这具有奇怪的效果,即在一个方向上绘制的线比在另一个方向上绘制的线更粗。 以下程序产生此效果,它显示此窗口: public class StrokeExample extends JPanel { public void paintComponent(Graphics context) { super.paintComponent(context); Graphics2D g = (Graphics2D)context.create(); g.setStroke(new BasicStroke(0.2f)); int height = getHeight(); int width = getWidth(); g.scale(width/7.0, height/4.0); g.setColor(Color.BLACK); g.draw(new Rectangle( 2, 1, 4, 2)); } public static void main(String[] params) { EventQueue.invokeLater(new Runnable(){public void run() { StrokeExample example = new […]

自定义形状旋转问题

我试图围绕其中心旋转自定义形状,但无法按预期获得结果。 我想要的是什么 * 形状应围绕其中心旋转而不会自行移动。 * 我的解决方案目前正在做的是围绕其中心旋转整个形状,每次旋转都会改变其位置。 我有多个形状,所以我创建了一个类来封装一个形状,其变换在下面的类中 public abstract class Shoe implements Shape, ShoeShape { // variable declaration /** * */ public Shoe() { position = new Point(); lastPosition = new Point(); } public void draw(Graphics2D g2, AffineTransform transform, boolean firstTime) { AffineTransform af = firstTime ? getInitTransform() : getCompositeTransform(); if (af != null) { […]

围绕其中心旋转移动的形状

我正在用Java制作2D游戏,玩家通过障碍物引导多边形。 多边形上下移动,游戏世界左右滚动。 我需要多边形围绕其中心旋转,但由于它经常被平移,所以它围绕移动旋转。 尝试将其转换回原始中心,旋转它并将其翻译回来并不起作用。 如何获得形状的中心? 以下是我在2ms计时器上的运动计算: @Override public void actionPerformed(ActionEvent e) { double theta = angleRad+90; if (up == true) { if (accelerating == false) { time2 = 0; moveX0 = moveX; moveY0 = moveY; accelerating = true; } time1++; double t = time1/500; if (accCount % 10 == 0) { DronePilot.velocity++; } moveX = […]

JComponent JPanel缩放,平移和坐标问题

我有一个带有矢量图像的JPanel ,用户可以缩放和平移。 覆盖此图像是一个(透明) JComponent ,我允许用户注释底层图像。 这在全尺寸下工作得很好,但如果我使用AffineTransform放大,则叠加坐标也会受到影响。 因此,如果用户在图像上绘制一个框,则该框也会缩放。 有关如何解耦此行为的任何建议? 那么JComponent不会受到JPanel的AffineTransform ?

旋转后图像不在适当的位置(图形)

我试图以不同的速率显示直径为512untis的两个旋转轮,但我无法移除先前绘制的图像图形并将旋转的图形设置在正确的位置。 现在我正以任意角度进行旋转。 我尝试了affineTransform并获得了旋转,但奇怪的是所有像素都散开了。 我使用带有thread.sleep()的while循环。 以下是代码:// drawSmallCircle和drawBigCircle返回两个图像。 class MyFramePart2 extends JFrame { String name; JPanel big_obj_panel,small_obj_panel; JLabel bigLabel,smallLabel;BufferedImage imgRet,imgRetSmall; static double radians,angle,rev,fps,smallAngle,smallRadians; int numLines,i=0; MyFramePart2(String frameName,int numStrokes,double revolutions,double frameps) { numLines=numStrokes; smallAngle=smallRadians=angle=radians=Math.toRadians(360/numLines); rev=revolutions; fps=frameps; setSize(1240,720); setLocation(0,0); setLayout(null); getContentPane().setBackground(Color.WHITE); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); big_obj_panel=new JPanel(); big_obj_panel.setLayout(null); big_obj_panel.setSize(512,512); big_obj_panel.setLocation(100,100); big_obj_panel.setBackground(Color.white); add(big_obj_panel); imgRet=drawBigCircle(); bigLabel = new JLabel(new ImageIcon(imgRet)); bigLabel.setLayout(null); bigLabel.setLocation(0,0); bigLabel.setSize(512,512); bigLabel.setOpaque(true); […]

创建变换以从一个矩形映射到另一个矩形?

创建AffineTransform的最简单方法是将坐标从一个矩形映射到另一个矩形(给出浮点/双矩形)? 更新1 矩形可以完全不同。 例如[(0,0) – (1,1)]和[(150,-14) – ( – 1000,-14.1)]。 转型应该统一转变。 例如,矩形角应该一对一变换。 例如,坐标(0,0)应转向(150,-14)。 更新2 我需要AffineTransform对象,而不仅仅是计算。 因为我想将它应用于Graphics对象。 我也希望以简单变换的一些连接forms出现。 更新3 以下3项测试都失败了: public class RectangleTransformTest { private static final double delta = 0.001; Rectangle2D r1 = new Rectangle2D.Double(-1, 0, 2, 0.01); Rectangle2D r2 = new Rectangle2D.Double(10, 20, 400, 300); AffineTransform t; Point2D src; Point2D dst1, dst2; @Test public […]