【问题标题】:draw a line of known distance along a known angle沿已知角度画一条已知距离的线
【发布时间】:2012-02-09 04:35:21
【问题描述】:

我知道这不是一个很难的触发问题,但遗憾的是我的数学迟钝。

我需要从已知起点沿已知角度到未知终点绘制一条 50 像素的线。角度是从起点 (400,400) 和鼠标单击得出的;这条线需要向鼠标点击方向绘制,但只有 50 像素向点击方向绘制。

我在 Google 上进行了广泛搜索并找到了许多解决方案,但对我来说并没有组合在一起。

这是我得到角度的方法:

float angle = (float) Math.toDegrees(Math.atan2(400 - event.getY(), 400 - event.getX()));
float angleInDegrees = (angle + 270) % 360;

“事件”是鼠标点击。

float endX = 250 + 50 * (float)Math.cos(angleInDegrees);
float endY 250 + 50 * (float)Math.sin(angleInDegrees);

line.setStartX(400);
line.setStartY(400);
line.setEndX(endX);
line.setEndY(endY);

我发现的所有内容都围绕 Math.cos 和 Math.sin 展开,但我仍然不明白。我认为这个问题与将弧度映射到场景坐标有关,但我不确定。所以人们,我到底是怎么傻的?如有任何帮助,我将不胜感激。

【问题讨论】:

    标签: java trigonometry javafx-2


    【解决方案1】:

    我不会为角度而烦恼。您可以只使用比率来做到这一点:

    int startX = 400;
    int startY = 400;
    int dx = event.getX() - startX;
    int dy = event.getY() - startY;
    float distToTarget = Math.sqrt(dx * dx + dy * dy);
    float ratio = 50 / distToTarget;
    int endX = startX + Math.round(ratio * dx);
    int endY = startY + Math.round(ratio * dy);
    

    然后从 (startX, startY) 绘制到 (endX, endY)。

    这是怎么回事:

    1. 计算从 (400, 400) 到鼠标点击的向量(这是 (dx, dy))
    2. 缩放矢量,使其长度为 50 像素
    3. 对缩放的向量进行四舍五入,使其在 x 和 y 中具有整数长度
    4. 将缩放的四舍五入向量添加到 (400, 400) 以计算终点

    【讨论】:

    • 非常感谢!这非常有效。这个答案比摆弄角度更有意义。
    【解决方案2】:

    您甚至不必处理弧度/度数。回到正弦和余弦的几何定义:正弦是opposite/hypotenuse,余弦是adjacent/hypotenuse。 (“相反”和“相邻”是指直角三角形的边分别与您取正弦或余弦的角度相对和相邻)。

    所以:

    float opposite = event.getY() - 400;
    float adjacent = event.getX() - 400;
    float hypotenuse = Math.sqrt(opposite*opposite + adjacent*adjacent);
    
    float cosine = adjacent/hypotenuse;
    float sine = opposite/hypotenuse;
    
    float endX = 400 + 50 * cosine;
    float endY = 400 + 50 * sine;
    

    【讨论】:

      【解决方案3】:

      代码中的错误是您使用度数,而 Math.cosMath.sin 需要 radians 中的参数。
      使用Math.toRadians 而不是Math.toDegrees,您的代码将开始工作。

      【讨论】:

        猜你喜欢
        • 2014-03-12
        • 2020-06-12
        • 1970-01-01
        • 2015-05-13
        • 1970-01-01
        • 1970-01-01
        • 2013-04-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多