我在做椭圆的绘制。
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方法后,怎么处理 选中的问题呢? 我旋转的只是图像,其实数据都没有变的,那变换过的图像怎么去判断选中呢? 不旋转,我能拿到数据,也都能搞定。现在求大神们帮忙啊。
在线等。。

解决方案 »

  1.   

    public boolean selectByDot(int x, int y) {
    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的热区~~
    将鼠标点转换成一个2*2的矩形区域,与原图形进行相交判断。
    那么,当前图形所使用的仿射变换需要同样应用到鼠标点,或者鼠标点构造的矩形上。
    不然会出现偏差,看起来在图形范围内,但是判断却是false,是这样吧?Rectangle(x,y,2,2),这个可能就不能直接相交了。也要与当前图形所使用的仿射变换保持一致才可以。但是Rectangle(x,y,2,2)的各个点变换后就不是那种标准的水平垂直的矩形了~所以intersects方法也就不那么精确。
    那么,是否可以考虑将原有图形反向,变换回到初始的未加旋转的状态你原来rotate一个角度,与此时鼠标点的2*2的热区判断相交呢
      

  3.   

    我是靠鼠标点三个点,创建一个椭圆。前二点为焦点,第三点为椭圆上的点。
    ovalG2d.rotate(Math.PI-angle,x1,y1);//围绕椭圆圆心旋转Math.PI-angle个度数
    这句就是 把绘制好的正椭圆旋转一个度数。  旋转的那个度数是 两焦点的直线和X轴倾斜的度数。
    表达的不好不知道您能不能看懂。
      

  4.   

    了解了。
    rotate这个方法实际上是讲一个仿射变换作用到Graphics上面
    g.rotate实际上可以理解和这样的操作是等效的:
    AffineTransform af = new AffineTransform();
    af.translate(x1,y1);
    af.rotate(//一个角度);
    g.setTransForm(af);那,说起来或许较为费劲了。能否发一个可执行的代码,会比这么说节省时间和气力啊
      

  5.   

    兄弟,咱们慢慢探讨,你看看我写的这个代码,是不是描述了你的疑惑。要是有问题咱们再说。年底了,乱糟糟的事情一大堆,不能及时回复,多多理解哈。
    我这里面就直接用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);
    }
    }
      

  6.   

    我把一些东西都写成变量放变量声明里面了,x,y指ellipse所在矩形的顶点,width,height宽高。
    希望能对你有所帮助