1

所以我在仅使用线条绘制形状时遇到了一个大问题。假设我开始从屏幕中间的一个点画一条线,并以 100 像素距离向前绘制,角度为 0,然后我使用 72 度角绘制另一条相同长度的线,依此类推,直到 360 度。它应该给我完美的五边形,其中一条线结束,另一条线从该点开始,但线在末端不相遇形状均匀的圆圈。我正在使用这个东西进行计算:

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

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

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

drawLine(_currentPostisionX, _currentPostisionY, (int) _endingPointX, (int) _endingPointY);

我不知道如何解决这个问题并使线条在绘制形状的末端相遇。几天来一直试图弄清楚这一点,但我什么也没想到。

这是一个屏幕截图: 在此处输入图像描述

问题已解决,感谢您的建议,这是我使用整数转换的错误。

4

3 回答 3

2

在绘图前立即计算双精度和舍入的所有值。
不要用四舍五入的进一步计算。

要绘制五边形或正边形,请使用类似于:

     // 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改为使用线,则点相遇的机会更高。

于 2012-12-16T22:48:06.750 回答
0

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

于 2012-12-16T22:40:41.380 回答
0

如果你只依赖int价值观,你会遇到准确性问题,因为这sin(72°)是不合理的,而sin(90°)当然不是。

但是您可以同时绘制Line2Ddouble精确float绘制,或使用GeneralPath[which uses float]。

于 2012-12-16T22:50:23.220 回答