Java 从给定角度获取屏幕边缘的坐标

Java 从给定角度获取屏幕边缘的坐标,java,math,coordinates,Java,Math,Coordinates,我知道起始点(屏幕中间)和角度(在我的示例中为20°)。现在我想知道屏幕边缘的位置,就像在给定角度下从中心到边缘画一条看不见的线。为了更好地解释,我添加了一张图片: 一种方法是计算半径等于或大于最大对角线的圆上的点,然后将其剪裁到屏幕边界 利用毕达哥拉斯定理,最大对角线的长度为 float d = Math.sqrt((width/2)*(width/2) + (height/2)*(height/2)); 因此,您可以这样计算圆上的点(角度以弧度为单位,从顶部顺时针): 然后,必须将矢量从

我知道起始点(屏幕中间)和角度(在我的示例中为20°)。现在我想知道屏幕边缘的位置,就像在给定角度下从中心到边缘画一条看不见的线。为了更好地解释,我添加了一张图片:


一种方法是计算半径等于或大于最大对角线的圆上的点,然后将其剪裁到屏幕边界

利用毕达哥拉斯定理,最大对角线的长度为

float d = Math.sqrt((width/2)*(width/2) + (height/2)*(height/2));
因此,您可以这样计算圆上的点(角度以弧度为单位,从顶部顺时针):

然后,必须将矢量从原点剪裁到4条边中的每一条边的点,例如,对于右侧和左侧:

if(x > width/2)
{
    float clipFraction = (width/2) / x; // amount to shorten the vector
    x *= clipFraction;
    y *= clipFraction;
}
else if(x < -width/2)
{
    float clipFraction = (-width/2) / x; // amount to shorten the vector
    x *= clipFraction;
    y *= clipFraction;
}

一种方法是计算半径等于或大于最大对角线的圆上的点,然后将其剪裁到屏幕边界

利用毕达哥拉斯定理,最大对角线的长度为

float d = Math.sqrt((width/2)*(width/2) + (height/2)*(height/2));
因此,您可以这样计算圆上的点(角度以弧度为单位,从顶部顺时针):

然后,必须将矢量从原点剪裁到4条边中的每一条边的点,例如,对于右侧和左侧:

if(x > width/2)
{
    float clipFraction = (width/2) / x; // amount to shorten the vector
    x *= clipFraction;
    y *= clipFraction;
}
else if(x < -width/2)
{
    float clipFraction = (-width/2) / x; // amount to shorten the vector
    x *= clipFraction;
    y *= clipFraction;
}

我想你只需要知道屏幕的大小,不是吗(以及你已知点的绝对坐标)?我可以通过
getHeight()
getWidth()
得到高度和宽度,所以我已知点的y是
height/2
和x是
width/2
。未知点在x=0,确定y只是使用角度的几何问题。这个几何问题是你的问题吗?如果我的角度是,比方说130°,我怎么知道x或y应该是0?可能重复:我想你只需要知道屏幕的大小,不是吗(以及你已知点的绝对坐标)?我可以通过
getHeight()
getWidth()
得到高度和宽度,因此,已知点的y是高度/2,x是宽度/2。未知点在x=0,确定y只是一个几何问题,使用角度。这个几何问题是你的问题吗?如果我的角度是,比如说130°,我怎么知道x或y应该是0?可能的重复:我想这也解释了:我试过了,但我想我做错了什么,因为它不起作用。我将代码粘贴到问题中。您只需检查减号和比较运算符是否正确。我已经编辑了我的答案,以显示-width的剪裁/2是否使用角度或弧度作为角度?可以使用Math.toRadians(角度)转换为弧度。也可以用sin表示x,cos表示y,从顶部顺时针旋转,我想这也可以解释:我试过了,但我认为我做错了什么,因为它不起作用。我将代码粘贴到问题中。您只需检查减号和比较运算符是否正确。我已经编辑了我的答案,以显示-width的剪裁/2是否使用角度或弧度作为角度?可以使用Math.toRadians(角度)转换为弧度。也可以用sin表示x,用-cos表示y,从顶部顺时针旋转