我让用户在屏幕上画一条线,有一个起点和一个终点。如果用户延伸超过某个角度,我会更改端点的位置,这样用户就不能延伸超过指定的角度。然而,当我计算用户绘制的角度,并确保其不超过最大角度,并将角度设置为最大角度时,似乎存在差异。这可以从我画线的时候看出,一旦我到达某个角度,线就会跳跃并锁定在最大角度,但不应该有任何跳跃,它应该是平滑的,就像线碰到了一个看不见的障碍。这可能只是我,虽然,我的PosX和PosY是浮动。
private void CheckAngle() {
double adj = Math.abs(PosX - PosX2);
double c1 = adj;
double c2 = Math.abs(PosY - PosY2);
double hyp = Math.hypot(c1, c2);
double angle = Math.cos((adj/hyp));
angle = angle * 100;
if (angle > MAX_ANGLE) {
double opp = (Math.tan(MAX_ANGLE) * Math.abs(PosX - PosX2));
if (PosY > PosY2) {
PosY2 =(float) (PosY - opp);
} else {
PosY2 =(float) (PosY + opp);
}
}
}
我的答案是使用弧度和取消的组合
Math.acos() & Math.atan()
所以最后的代码看起来像这个
private void CheckAngle() {
double adj = Math.abs(PosX - PosX2);
double opp = Math.abs(PosY - PosY2);
double hyp = Math.sqrt((adj*adj)+(opp*opp));
double angle = Math.acos((adj/hyp));
angle = angle * 100;
angle = Math.toRadians(angle);
if (angle > MAX_ANGLE) {
opp = (Math.atan(MAX_ANGLE) * adj);
if (PosY > PosY2) {
PosY2 =(float) (PosY - opp);
} else {
PosY2 =(float) (PosY + opp);
}
}
}
以下是转换:
final double MAX_ANGLE = Math.toRadians(80);
注意,这等同于说:
final double MAX_ANGLE = 80 * Math.PI / 180;