我正在尝试使用AffineTransform从其中心缩放矩形.我确信解决方案很明显,但我不能让它发挥作用!这是我到目前为止测试过的...
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.geom.AffineTransform;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
public class Test extends JPanel {
Test()
{
super(null);
setOpaque(true);
setBackground(Color.WHITE);
setPreferredSize(new Dimension(200,200));
}
@Override
protected void paintComponent(Graphics g1) {
super.paintComponent(g1);
Rectangle r= new Rectangle(5,5,getWidth()-10,getHeight()-10);
double cx= r.getCenterX();
double cy= r.getCenterY();
Graphics2D g=(Graphics2D)g1;
g.setColor(Color.BLACK);
AffineTransform old= g.getTransform();
for(double zoom=0.9; zoom>=0.5; zoom-=0.1)
{
AffineTransform tr2= new AffineTransform(old);
tr2.translate(-cx, -cy);
tr2.scale(zoom, zoom);
tr2.translate(cx/zoom,cy/zoom);
g.setTransform(tr2);
g.draw(r);
g.setTransform(old);
}
}
public static void main(String[] args) {
JOptionPane.showMessageDialog(null, …Run Code Online (Sandbox Code Playgroud) 我正在开发一款带有一些简单动画的iPhone应用程序.
我有一个想要翻译的观点,但不是一条线.我想抛物面翻译它.想象一下,我正在制作一辆沿弯曲道路行驶的汽车.
我知道我可以将转换正确地设置为CGAffineTransform的实例
问题是,我不知道如何创建转换.我知道如何缩放,翻译等,但我如何翻译?它甚至可能吗?
我想围绕它的中心点旋转一个矩形,它应该保留在它应该被绘制的位置并在该空间中旋转
这是我的代码:
AffineTransform transform = new AffineTransform();
transform.rotate(Math.toRadians(45),rectangle.width/2, rectangle.height/2);
Shape transformed = transform.createTransformedShape(rectangle);
g2.fill(transformed)
Run Code Online (Sandbox Code Playgroud)
旋转矩形但是在屏幕的不同部分绘制,我该如何纠正?
我需要:
1.)移动原点并旋转坐标平面,使x值向右前进,y值从新原点向上进展(需要在内部的蓝色矩形的左下角)代码如下).这将使我能够在下面的代码中绘制x,y坐标对的点.
2.)绘制数据图的y轴上的抽动标记的旋转标签.
下面的代码设置了这个问题.它有效,除了两个问题:
1.)数据点被绘制,左上角为原点,y值向下下降
2.)y轴上的标记标记未被绘制屏幕上
任何人都可以告诉我如何修复下面的代码,以便它修复这两个问题,并做上面第一段描述的内容?
代码在以下两个java文件中:
DataGUI.java
import java.awt.*;
import java.util.ArrayList;
import javax.swing.*;
class DataGUI extends JFrame{
DataGUI() {
super("X,Y Plot");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setPreferredSize(new Dimension(800, 400));
this.pack();
this.setSize(new Dimension(800, 600));
this.setLocationRelativeTo(null);
setLayout(new GridLayout());
ArrayList<Double> myDiffs = new ArrayList<Double>();
myDiffs.add(25.0);
myDiffs.add(9.0);
myDiffs.add(7.0);
myDiffs.add(16.0);
myDiffs.add(15.0);
myDiffs.add(6.0);
myDiffs.add(2.0);
myDiffs.add(8.0);
myDiffs.add(2.0);
myDiffs.add(27.0);
myDiffs.add(14.0);
myDiffs.add(12.0);
myDiffs.add(19.0);
myDiffs.add(10.0);
myDiffs.add(11.0);
myDiffs.add(8.0);
myDiffs.add(19.0);
myDiffs.add(2.0);
myDiffs.add(16.0);
myDiffs.add(5.0);
myDiffs.add(18.0);
myDiffs.add(23.0);
myDiffs.add(9.0);
myDiffs.add(4.0);
myDiffs.add(8.0);
myDiffs.add(9.0);
myDiffs.add(3.0);
myDiffs.add(3.0);
myDiffs.add(9.0);
myDiffs.add(13.0);
myDiffs.add(17.0);
myDiffs.add(7.0);
myDiffs.add(0.0);
myDiffs.add(2.0);
myDiffs.add(3.0);
myDiffs.add(33.0);
myDiffs.add(23.0);
myDiffs.add(26.0);
myDiffs.add(12.0);
myDiffs.add(12.0);
myDiffs.add(19.0); …Run Code Online (Sandbox Code Playgroud) 我正在尝试为java中的几何对象创建一个Illustrator样式选择框.
选择对象时,将绘制边框,并且可以拖动小矩形以重新调整对象的大小.我也想通过拖动来旋转盒子.
到目前为止,我可以缩放盒子,我可以旋转盒子,但我不能一起做这两个.想象一下盒子的角度是45度.当您拖动角落以在x方向上放大框时,由于角度,这将增加框的宽度和高度.
我可以使用以下方式让它工作:
dx = dx*cos(theta) - dy*sin(theta);
dy = dy*cos(theta) + dx*sin(theta);
Run Code Online (Sandbox Code Playgroud)
但这只适用于枢轴点位于左上角的情况.我希望能够移动枢轴,然后缩放和旋转.这个问题以前必须经过多次解决.有没有办法可以使用仿射变换将鼠标绘制转换为旋转对象的坐标空间?我宁愿不用挖掘三角学!提前致谢.
我有以下内容:
public class ParametricEQView extends JPanel implements PluginView {
private static final int BAND_WIDTH = 3;
private static final int THROW_HEIGHT = 64;
private static final int WIDTH = 128*BAND_WIDTH + 2*MARGIN;
private static final int HEIGHT = 2*THROW_HEIGHT + 2*MARGIN;
private static final int MID_HEIGHT = THROW_HEIGHT + MARGIN;
private final ParametricEQ _peq;
public ParametricEQView(ParametricEQ peq) {
super();
_peq = peq;
SwingUtils.freezeSize(this, WIDTH, HEIGHT);
setToolTipText("Parametric Equalizer");
}
@Override
public void paint(Graphics g) {
final Graphics2D g2d = (Graphics2D) g; …Run Code Online (Sandbox Code Playgroud) 假设我使用大小为8的char数组来表示图像的碰撞掩码.char的每个位代表一个像素.实际上,我将使用长[64]阵列作为64x64矩阵.
所以一个框将显示为:
00000000
01111110
01111110
01111110
01111110
01111110
01111110
00000000
Run Code Online (Sandbox Code Playgroud)
45度的示例输出应该如下所示,尽管旋转可以是任何角度.这种形状对于45度旋转可能不准确,正如我手工完成的那样.
00011000
00111100
01111110
11111111
11111111
01111110
00111100
00011000
Run Code Online (Sandbox Code Playgroud)
另一个示例输出向右旋转小 - 10度?这些值可能是错误的,因为在数学上我不知道它究竟会如何旋转,但我认为如果每个位的旧形状覆盖率超过50%是安全的,那么它就是1.
00000000
00111111
01111111
01111110
01111110
11111110
11111100
00000000
Run Code Online (Sandbox Code Playgroud)
在没有旋转的情况下,使用此stackoverflow回复中定义的位移来快速查找这些位掩码之间的冲突:https://stackoverflow.com/a/336615/4595736
现在,在过去我使用过Path2D,Rectangles,Shapes等...并使用AffineTransform来旋转对象.Path2D是唯一提供我想要的复杂形状的类,但是用于访问每个点的"链接列表"行为并不像我希望的那样快.
在Java中旋转二进制映射的最佳方法是什么?
看起来像Matrices的Java库也不是最快的.
我尝试使用AffineTransform和Scalr.resize调整缓冲图像的大小
这是我的两个代码.
使用Scalr.resize:
BufferedImage buff = robot.createScreenCapture(new Rectangle(bufx,bufy,bufwidth,bufheight)); // x-coord, y-coord, width, height
BufferedImage scrCapt = Scalr.resize(buff, Method.BALANCED, scrwidth, scrheight);
Run Code Online (Sandbox Code Playgroud)
使用AffineTransform:
BufferedImage buff = robot.createScreenCapture(new Rectangle(bufx,bufy,bufwidth,bufheight)); // x-coord, y-coord, width, height
BufferedImage scrCapt = new BufferedImage(bufwidth,bufheight,BufferedImage.TYPE_INT_ARGB);
AffineTransform atscr = new AffineTransform();
atscr.scale(aspectRatioWidth,aspectRatioHeight);
AffineTransformOp scaleOp = new AffineTransformOp(atscr, AffineTransformOp.TYPE_BILINEAR);
scrCapt = scaleOp.filter(buff, scrCapt);
Run Code Online (Sandbox Code Playgroud)
变量已在类内部的开头声明:
static int bufx = 0;
static int bufy = 0;
static int bufwidth = 1;
static int bufheight = 1;
static int scrwidth = 0;
static int …Run Code Online (Sandbox Code Playgroud) 我有两个 2x3 矩阵 A 和 B - 每个矩阵都用于仿射变换。我需要将 A 和 B 组合成第三个矩阵 C,它将把 A 和 B 的仿射变换组合成一个矩阵。
我需要如何将它们相乘?
A B 还是 B A ?
区别在于 A 或 B 被调换了还是根本没有任何区别?
我读到另一个解决方案是使用 3x3 矩阵并复制到前两行中,并且只使用结果中的前两行。但它归结为同样的问题,如果它是 A B 或 B A。
此外,是否有一种简单的方法可以在 OpenCV 中实现这一点,或者我是否需要实现上述每个步骤?
我有源 ( src) 图像,我希望dst使用仿射变换对齐到目标 ( ) 图像,同时在对齐过程中保留两个图像的完整范围(甚至是非重叠区域)。
我已经能够计算仿射变换旋转和偏移矩阵,我将其提供给scipy.ndimage.interpolate.affine_transform恢复dst对齐的src图像。
问题在于,当图像未完全重叠时,生成的图像将被裁剪为仅两个图像的公共足迹。我需要的是放置在同一像素坐标系上的两个图像的完整范围。这个问题几乎是这个问题的重复- 那里的优秀答案和存储库为 OpenCV 转换提供了这一功能。不幸的是我需要这个来scipy实现。
太晚了,在多次碰壁试图将上述问题的答案翻译为 后scipy,我遇到了这个问题并随后遵循了这个问题。后一个问题确实让我们对仿射变换的奇妙世界有了一些了解scipy,但我还无法满足我的特殊需求。
src从到 的变换dst可以具有平移和旋转。我只能让翻译起作用(下面显示了一个示例),并且我只能让旋转起作用(主要是围绕下面的内容进行黑客攻击并从使用reshape中的参数中获取灵感scipy.ndimage.interpolation.rotate)。然而,将两者结合起来我彻底迷失了。我试图计算什么应该是正确的offset(再次参见这个问题的答案),但我无法让它在所有情况下工作。
填充仿射变换的仅翻译工作示例,主要遵循此存储库,在这个答案中进行了解释:
from scipy.ndimage import rotate, affine_transform
import numpy as np
import matplotlib.pyplot as plt
nblob = 50
shape = (200, 100)
buffered_shape = (300, …Run Code Online (Sandbox Code Playgroud)