代码之家  ›  专栏  ›  技术社区  ›  ubiquibacon

在Java中以特定的角度画一条线

  •  29
  • ubiquibacon  · 技术社区  · 14 年前

    假设(x,y)对于直线的起点总是相同的,而(x,y)对于同一直线的终点是变化的。这条线也总是40像素长。在程序开始时,直线以垂直方向开始(称为0度)。根据用户的输入,我需要重新绘制一个特定的角度从它的原点只改变结束(x,y)的数目。

    如果你需要的话,可以多想想:

    我认为基于三角形的角度比较容易,因为我总是知道三角形两边的长度(一边由40px的长线形成,另一边由该线的起点和JPanel的边界形成)以及这两条线形成的角度。尽管如此,我的大脑还是无法理解。任何帮助都将不胜感激。

    更新:

    首先,我没有意识到90度是直线上升的,但一旦我意识到我的解决方案反映了这一事实。我正在画我的线从底部中心的框架出去。自从 opposite 当我的用户给出的角度小于90度时,三角形的边在屏幕的右侧,当我的用户给出的角度大于90度时,三角形的边在屏幕的左侧,我必须调整公式来说明这一事实,因此我有四种方法,一种用于 x 屏幕左侧的坐标(当用户给定的角度大于90度时),一个用于 y 屏幕左侧的坐标(当用户给定角度大于90度时)和屏幕右侧的坐标(当用户给定角度小于90度时)相同。这个 int length 在所有方法中都是斜边的长度。 再次感谢您对卡萨布兰卡的帮助!

    public double leftSideX(double angle, int length){
        double x = frameWidth/2 - (length * Math.cos(Math.toRadians(90-(Math.toDegrees(angle)-90))));
        return x;
    }
    
    public double leftSideY(double angle, int length){
        double y = frameHeight - (length * Math.sin(Math.toRadians(90-(Math.toDegrees(angle)-90))));
        return y;
    }
    
    public double rightSideX(double angle, int length){
        double x = frameWidth/2 + (length * Math.cos(angle));
        return x;
    }
    
    public double rightSideY(double angle, int length){
        double y = frameHeight - (length * Math.sin(angle));
        return y;
    }
    
    1 回复  |  直到 7 年前
        1
  •  71
  •   casablanca    14 年前

    这就是你要找的吗?

    startX = x;
    startY = y;
    endX   = x + 40 * Math.sin(angle);
    endY   = y + 40 * Math.cos(angle);
    

    还要注意的是 angle 以弧度为单位。如果以度为单位,则需要先将其转换为:

    angle = angle * Math.PI / 180;