代码之家  ›  专栏  ›  技术社区  ›  Terrance

Java1.5关于使用线和角绘制形状的问题

  •  0
  • Terrance  · 技术社区  · 14 年前

    嘿,我正在尝试编写一个方法,该方法采用笛卡尔坐标(x,y)、角度(以度为单位)、长度和边数,并为小程序绘制一个形状。到目前为止,这是我所拥有的,但是,我不知道我做错了什么。我计划对实际的角度变化使用线转换,这还没有写进去,但是在一个角度画一条线的逻辑应该可以工作,但不是我能说的那么远。我能换双新眼睛看看这个,告诉我是不是缺了什么东西吗。

    public void paint(Graphics g)
    {
        g.setColor(Color.BLACK);
        Point startPt = new Point(0,0);
        //Function in question  
        drawRegularPolygon(g, startPt, 5,60,50);    
    }
    
    public static void drawRegularPolygon(Graphics g, Point2D startPoint, int numOfSides, int angle, int length)
    {
    
        Point2D current = startPoint;
        for(int i=0; i<numOfSides; i++)
        {
            drawAngularLine(g, current, angle, length);
            current = getEndPoint(current ,length,angle);
        }
    }
    
    public static void drawAngularLine(Graphics g, Point2D startPoint, int angle, int length)
    {
        g.setColor(Color.BLACK);
        Point2D endPoint = getEndPoint(startPoint, length, angle);
        ((Graphics2D) g).draw(new Line2D.Double(startPoint, endPoint));
    }
    
    private static Point2D getEndPoint(Point2D p, int length, int angle)
    {
        //Starting point you know (x1, x2), 
        //end point is (x1 + l * cos(ang), y1 + l * sin(ang)) 
        //where l is the length and ang is the angle.
        Point2D retVal = p; 
        double x = Math.cos(Math.toRadians(angle)*length+p.getX());
        double y = Math.sin(Math.toRadians(angle)*length+p.getY());
        retVal.setLocation(x,y);
        return retVal;
    }
    
    2 回复  |  直到 14 年前
        1
  •  1
  •   Ben Taitelbaum    14 年前

    几件事。首先是要小心你的罪/余弦。不是cos(角度*长度),而是length*cos(角度)。

    假设我们只需要一个点,在标准右手系统中,它的长度,与原点的角度,我们会得到:

    x1 = length * cos(angle)
    y1 = length * sin(angle)
    

    x2 = length * cos(angle)
    y2 = -length * sin(angle)
    

    要在精神上检查这个,想象一下你在原点(0,0)做这个数学运算,原点在左上角,角度是45°。如果y2是正的,我们最终会看到一个在我们看来像-45°的角度。

    现在将原点转换为我们的起点(xñi,yñi),得到我们的最终值:

    x_f = x_i + length * cos(angle)
    y_f = y_i + (-length * cos(angle)) = y_i - length * cos(angle)
    

    或者,如果在一个标准的右手坐标系中工作更有意义,你可能会做所有的数学运算,好像(0,0)在中心,然后应用一个平移和Y轴镜像变换,但是这个屏幕坐标系统在你习惯于翻转Y的时候不太难工作。价值观。

        2
  •  1
  •   Peter Knego    14 年前

    你正在用相同的起点和终点画一条线-所以什么都不画。

    Java对象通过引用传递,因此:

    private static Point2D getEndPoint(Point2D p, int length, int angle){
       Point2D retVal = p;
       retVal.setLocation(x,y);
       return retVal;
    }
    

    也改变了起点 p . 所以它画了一条长度为1的线(屏幕上有点吗?).

    Point2D retVal = p.clone();