public Shape getRegularPolygon(Vertex v, int num_sides)
    {
        if (num_sides < 3)
            throw new IllegalArgumentException("Number of sides must be >= 3");
        Rectangle2D frame = getRectangle(v);
        float width = (float)frame.getWidth();
        float height = (float)frame.getHeight();
        
        // generate coordinates
        double angle = 0;
        thePolygon.reset();
        thePolygon.moveTo(0,0);
        thePolygon.lineTo(width, 0);
        double theta = (2 * Math.PI) / num_sides;
        for (int i = 2; i < num_sides; i++)
        {
            angle -= theta;
            float delta_x = (float) (width * Math.cos(angle));
            float delta_y = (float) (width * Math.sin(angle));
            Point2D prev = thePolygon.getCurrentPoint();
            thePolygon.lineTo((float)prev.getX() + delta_x, (float)prev.getY() + delta_y);
        }
        thePolygon.closePath();
        
        // scale polygon to be right size, translate to center at (0,0)
        Rectangle2D r = thePolygon.getBounds2D();
        double scale_x = width / r.getWidth();
        double scale_y = height / r.getHeight();
        float translationX = (float) (r.getMinX() + r.getWidth()/2);
        float translationY = (float) (r.getMinY() + r.getHeight()/2);        AffineTransform at = AffineTransform.getScaleInstance(scale_x, scale_y);
        at.translate(-translationX, -translationY);
        Shape shape = at.createTransformedShape(thePolygon);
        return shape;
    }这是我在阅读jung代码时碰到的,看了它的坐标计算方法,thePolygon.lineTo((float)prev.getX() + delta_x, (float)prev.getY() + delta_y),为什么要这么计算,百思不得其解,请大侠不吝赐教

解决方案 »

  1.   

    算法问题  不懂ING......
      

  2.   

    求出正多边形两个顶点的平均夹角
    double theta = (2 * Math.PI) / num_sides;顺时针画线
    angle -= theta;利用圆的参数方程计算各点偏移坐标
    float delta_x = (float) (width * Math.cos(angle)); 
    float delta_y = (float) (width * Math.sin(angle));把之前的点和这次的点用线连接起来
    thePolygon.lineTo((float)prev.getX() + delta_x, (float)prev.getY() + delta_y);
      

  3.   

    关键是他根据什么原则把相邻点的坐标表示成thePolygon.lineTo((float)prev.getX() + delta_x, (float)prev.getY() + delta_y); 
    这个2个点的横纵坐标分别差了(delta_x, delta_y),对这一点很难理解,很显然这不是通过旋转角度算出来的,他用的方法是根据前一点的坐标
    来计算后一点的坐标
      

  4.   

    你这么一说感觉是有点奇怪,已经计算了旋转角度的坐标,
    直接用 thePolygon.lineTo(delta_x, delta_y); 就
    可以了啊,为什么还要加上前面点的坐标呢?
      

  5.   

    thePolygon.moveTo(0,0); //圆心坐标(0,0)thePolygon.lineTo(width, 0);//从(0,0)开始向A(width, 0)画线//下面的prev.getX()和prev.getY()都为0,所以从圆心开始顺时针旋转,如果O(0,0),P(delta_x,delta_y),A(width, 0),旋转的角度就是OP与OA的夹角
    thePolygon.lineTo((float)prev.getX() + delta_x, (float)prev.getY() + delta_y);
      

  6.   

    只有计算第二个点时,prev.getX()和prev.getY()都为0, 以后的不一定是0