在JAVA中用线条绘制形状

时间:2012-12-16 22:24:52

标签: java lines shapes sin cos

所以我只使用线条绘制形状有一个大问题。让我说我开始从屏幕中间的一个点画一条线,然后以100像素的距离向前绘制,角度为0然后我用角度72度绘制另一条相同长度的线,依此类推直到360度。它应该给我完美的五边形,其中一条线结束,另一条线从那一点开始,但线条不符合最终它适用于角度为0/90/180/270的方块,但我需要使它适用于每个形状甚至圆圈。我正在使用这个东西进行计算:

_endingPointX = (_currentPostisionX + distance * _cosinuses[_angle]);

_endingPointY = (_currentPostisionY + distance * _sinuses[_angle]);

其中_cosinuses和_sinuses是双精度数组,包含每个360度的鼻窦和余弦的值。在绘制线时,我需要将这些值转换为整数。

drawLine(_ currentPostisionX,_ currentPostisionY,(int)_endingPointX,(int)_endingPointY);

我不知道如何修复它并使线条在绘制形状的末尾相遇。我试图弄清楚这几天,但没有想到任何事情。

以下是截图: enter image description here

问题解决了,谢谢你的建议,使用整数铸造是我的错误。

3 个答案:

答案 0 :(得分:2)

在绘制前立即计算所有双倍和圆形值 不要用圆角计算进一步计算。

绘制五边形或者n-gon使用类似的东西:

     // number of corners of pentagon
    double numVertex = 5;
    // how much to change the angle for the next corner( of the turtle )
    double angleStep = 360.0 / numVertex;
    gc.moveTo(cx, cy - rad);
    for (int i= 1; i < numVertex; i++) {
         // total angle from 0 degrees
         double angle = i* angleStep;
         // px point of turtle is corner of pentagon
         double px = cx + rad * sin(angle * DEG_TO_RADIANS);
         // move turtle to
         gc.lineto((int)Math.round(px),
         (int)Math.round(py));
    }
     gc.lineTo(cx, cy - rad);

如果你使用lineTo而不是直线几率,那么积分会更高。

答案 1 :(得分:0)

由于sin和cos函数的精度导致的舍入误差,它不能完美排列。要解决此问题,您可以将起点存储为单独的变量,并将其用作最后一行的结束点。

答案 2 :(得分:0)

如果您只依赖int值,则会出现准确性问题,因为sin(72°)是不合理的,而sin(90°)当然不是。

但您可以同时以doublefloat精度绘制Line2D,或使用GeneralPath [使用float]。