【问题标题】:Java: How would I draw a line at an angle other than 45 degrees or zero degrees etc.?Java:我如何以 45 度或 0 度等以外的角度画线?
【发布时间】:2016-05-02 05:31:11
【问题描述】:

我一直在研究分形并决定尝试一下,但立即遇到了一个简单得多的问题。除了 0、45、90 等,我不能画线。

问题: 我的角度是一个整数,我使用 Math.toRadians(angle) 来计算角度本身作为它的绘制。当我画线时,我必须将 (int) 转换为从 Math.toRadians() 生成的双精度数,这导致我失去了角度本身,我相信这是阻止画线的原因。

我正在使用的代码:`

    Graphics2D g2d = (Graphics2D) g;

    int angle = 90; 

    int startX = getWidth()/2;
    int startY = getHeight()/2;
    int length = 100;

    int endX = startX + (int)Math.cos(Math.toRadians(angle)) * length;
    int endY = startY + (int)Math.sin(Math.toRadians(angle)) * length;

    g2d.drawLine(startX, startY, endX, endY);

`

解决方案:

    Graphics2D g2d = (Graphics2D) g;

    int angle = 91; 

    int startX = getWidth()/2;
    int startY = getHeight()/2;
    int length = 100;



    int endX = startX + (int)(Math.cos(Math.toRadians(angle)) * length);
    int endY = startY + (int)(Math.sin(Math.toRadians(angle)) * length);

    g2d.drawLine(startX, startY, endX, endY);

谢谢大家!

【问题讨论】:

  • 你应该转换为int乘以length
  • ^--- (int)(Math.cos(Math.toRadians(angle)) * length)
  • 正弦和余弦是实数,在 [-1,1] 范围内的商定义了一个角度。如果您需要转换为整数,请在任何计算中保持它们的精度直到最后一刻。
  • 感谢您的帮助,我被这么愚蠢的事情难住了哈哈。
  • @A.Ferguson 不要为您的问题添加解决方案。这就是答案的目的。

标签: java math line angle radians


【解决方案1】:

您是运算符优先级的受害者。你需要

int endX = startX + (int) (Math.cos(Math.toRadians(angle)) * length);
int endY = startY + (int) (Math.sin(Math.toRadians(angle)) * length);

【讨论】:

    【解决方案2】:

    为了获得最佳精度,请使用 Math.round():

    int endX = startX + (int)Math.round(Math.cos(Math.toRadians(angle)) * length);
    int endY = startY + (int)Math.round(Math.sin(Math.toRadians(angle)) * length);
    

    您可能不会注意到屏幕上的绘图有任何差异,但精度损失可能会导致可见的故障。

    【讨论】:

    • 为了获得更好的精度,请使用 2D 图形和支持双精度的 Shapes API ;)
    • @MadProgrammer 像素 (x,y) 是表示矩形 ([x,x+1],[y,y+1]) 还是 ([x-0.5,x+0.5], [y-0.5,y+0.5])?程序员应该担心这个吗?例如,注意整数像素网格对小数值的不同解释?我从来没有遇到过关于这个的讨论(但没有尝试找到)。
    • 一切都与上下文有关,取决于它的配置方式,Graphics API 可以使用反分析来渲染小数元素
    猜你喜欢
    • 1970-01-01
    • 2018-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多