我在做椭圆的绘制。
Graphics2D ovalG2d = (Graphics2D) g2.create();
ovalG2d.rotate(Math.PI-angle,x1,y1);//围绕椭圆圆心旋转Math.PI-angle个度数
Ellipse2D.Double ell2d2;
ell2d=new Ellipse2D.Double(x,y,w,h);//椭圆绘制XY坐标,和绘制HW.
ovalG2d.draw(ell2d);
以上是绘制的流程。椭圆也给我绘制出来了。
我用了rotate方法后,怎么处理 选中的问题呢? 我旋转的只是图像,其实数据都没有变的,那变换过的图像怎么去判断选中呢? 不旋转,我能拿到数据,也都能搞定。现在求大神们帮忙啊。
在线等。。
Graphics2D ovalG2d = (Graphics2D) g2.create();
ovalG2d.rotate(Math.PI-angle,x1,y1);//围绕椭圆圆心旋转Math.PI-angle个度数
Ellipse2D.Double ell2d2;
ell2d=new Ellipse2D.Double(x,y,w,h);//椭圆绘制XY坐标,和绘制HW.
ovalG2d.draw(ell2d);
以上是绘制的流程。椭圆也给我绘制出来了。
我用了rotate方法后,怎么处理 选中的问题呢? 我旋转的只是图像,其实数据都没有变的,那变换过的图像怎么去判断选中呢? 不旋转,我能拿到数据,也都能搞定。现在求大神们帮忙啊。
在线等。。
int a=xr//椭圆X 半径
int b=yr//椭圆Y 半径
//每一条边对应的圆心角
double angle = 2 * Math.PI /36;
//起始角度,保证最下边的一条边是水平的
double startAngle = (Math.PI - angle) / 2; for (int i = 0; i < 36; i++) {
tmp1X[i] =(int) (x1+ (a+4) * Math.cos(startAngle + i * angle));
tmp1Y[i] =(int) (y1 + (b+4) * Math.sin(startAngle + i * angle));
}
for(int i = 0; i < 36; i++){
tmp1X[36+i] = (int)(x1 + (a-4) * Math.cos(startAngle - i * angle));
tmp1Y[36+i] = (int)(y1 + (b-4) * Math.sin(startAngle - i * angle));
}
tmpPolygon = new Polygon(tmp1X,tmp1Y,72);
return tmpPolygon.intersects(x, y, 2,2);
}
我做了一个72边形,大概的围住了那个 椭圆,鼠标点击的范围为2*2的大小,这样就完成了 点选的功能。
那么这些数据都是正椭圆。那么要是斜的就要旋转一下,旋转是画布,不是数据,那么我的数据还是椭圆数据 选中就不行了。
麻烦您了。大老远的请您来了、、、、
将鼠标点转换成一个2*2的矩形区域,与原图形进行相交判断。
那么,当前图形所使用的仿射变换需要同样应用到鼠标点,或者鼠标点构造的矩形上。
不然会出现偏差,看起来在图形范围内,但是判断却是false,是这样吧?Rectangle(x,y,2,2),这个可能就不能直接相交了。也要与当前图形所使用的仿射变换保持一致才可以。但是Rectangle(x,y,2,2)的各个点变换后就不是那种标准的水平垂直的矩形了~所以intersects方法也就不那么精确。
那么,是否可以考虑将原有图形反向,变换回到初始的未加旋转的状态你原来rotate一个角度,与此时鼠标点的2*2的热区判断相交呢
ovalG2d.rotate(Math.PI-angle,x1,y1);//围绕椭圆圆心旋转Math.PI-angle个度数
这句就是 把绘制好的正椭圆旋转一个度数。 旋转的那个度数是 两焦点的直线和X轴倾斜的度数。
表达的不好不知道您能不能看懂。
rotate这个方法实际上是讲一个仿射变换作用到Graphics上面
g.rotate实际上可以理解和这样的操作是等效的:
AffineTransform af = new AffineTransform();
af.translate(x1,y1);
af.rotate(//一个角度);
g.setTransForm(af);那,说起来或许较为费劲了。能否发一个可执行的代码,会比这么说节省时间和气力啊
我这里面就直接用point判断了,没拿你说的2*2的矩形。你先看看吧,呵呵,初等数学和逻辑思维得捋顺。
public class ShapeFrame extends JFrame {
private static final long serialVersionUID = 1L; public ShapeFrame() {
super(); setContentPane(new ShapePanel()); setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(800, 600);
setLocationRelativeTo(null);
setVisible(true);
} public static void main(String[] args) {
new ShapeFrame();
}
}
public class ShapePanel extends JPanel { private static final long serialVersionUID = 1L; int x = 100;
int y = 150;
int width = 200;
int height = 100;
double angle = Math.toRadians(60d); private Ellipse2D ellipse; public ShapePanel() {
super();
ellipse = new Ellipse2D.Double(x, y, width, height); addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
Point p = e.getPoint(); AffineTransform af = new AffineTransform();
af.translate(x + width / 2, y + height / 2);
af.rotate(angle); // 判断的时候需要转换,方式不唯一
Shape newShape = af
.createTransformedShape(new Ellipse2D.Double(
-width / 2, -height / 2, width, height)); System.out.println("旋转前" + ellipse.contains(p));
System.out.println("旋转后" + newShape.contains(p));
System.out.println("***************************");
}
});
} @Override
public void paint(Graphics g) {
super.paint(g);
Graphics2D g2d = (Graphics2D) g;
AffineTransform oldtrans = g2d.getTransform(); g2d.draw(ellipse); AffineTransform newTrans = new AffineTransform(); newTrans.translate(x + width / 2, y + height / 2);
newTrans.rotate(angle); g2d.setColor(Color.red); /************ 第一种画法 *************/
Ellipse2D newEllipse = new Ellipse2D.Double(-width / 2, -height / 2,
width, height);
g2d.draw(newTrans.createTransformedShape(newEllipse));
/************ 第二种画法 *************/
g2d.setTransform(newTrans);
g2d.draw(newEllipse);
/************ 你的那种也是一种 *************/ g2d.setTransform(oldtrans);
}
}
希望能对你有所帮助