【问题标题】:Drawing shapes with lines in JAVA在 JAVA 中用线条绘制形状
【发布时间】:2012-12-04 01:44:06
【问题描述】:

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

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

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

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

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

我不知道如何解决这个问题并使线条在绘制形状的末端相交。这几天一直想弄明白,但什么都没想到。

这是一个截图:

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

【问题讨论】:

  • “线条最终没有相遇”到底是什么意思?它们在哪里结束?能发个截图吗?这确实有助于发现问题。
  • 这里是它的打印屏幕,我在红色圆圈内标记了它。 imgur.com/VglD1
  • 将所有坐标变量的类型保持为双精度,并将所有计算作为双精度进行。此外,尝试使用数学函数而不是预计算表。这能解决不准确的问题吗?
  • @hyde 好吧,我可以将它们存储在双变量中,因为绘制线条的内置 Java 函数需要整数线,而我所能做的就是将这些线转换为整数。
  • @Philipp 也许这说明了它是如何工作的所有这些 args 都可以绘制我想要的任何东西,但是由于它没有正确绘制形状,因此它使我可以绘制同一条线 100 次,每次迭代都会改变 72 度的角度。 i.imgur.com/XZhUP.png 当它应该做的只是在一个地方绘制和重绘同一个五边形时。

标签: java lines shapes trigonometry


【解决方案1】:

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

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

     // 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 代替,则积分相遇的几率更高。

【讨论】:

  • 我应该在我的问题开始时添加这个,它是一个用于在 2D 中使用 L 系统进行建模的 Turtle 程序,这就是为什么我永远无法预测将要绘制什么并且我需要这种精度的原因.
  • 好的,但是它可以使用 double 作为海龟的当前坐标,不要使用 int。仅使用 int 进行绘图
  • @Paul 请注意,不准确性仍然会蔓延。您可能应该测试多快,例如通过制作一百万个这些五边形,从 (0,0) 开始第一个并查看开始的距离点漂移。
【解决方案2】:

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

【讨论】:

  • 这毫无意义,因为我永远无法预测我要画什么样的形状。
  • 如果您知道形状中的部分数量,您可以在最后一个部分(amount-1)时使用 if 开关,并从当前位置到起始位置构建一条线。
  • 也可以查看我的代码,最好还是先从头开始,然后再计算一遍,(但这也可以)
【解决方案3】:

如果您只依赖int 值,您将遇到准确性问题,因为sin(72°) 是不合理的,而sin(90°) 则不是。

但是您可以在doublefloat 精度下绘制Line2D,或者使用GeneralPath [使用float]。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多