không cần phải làm một hàm atan.
nếu bạn làm: y/x bạn sẽ nhận được độ dốc của đường kẻ. Đánh giá bằng số bạn nhận được, bạn có thể xác định góc/octant.
cho của x dương (x> 0)
- (y/x)> 2.4 - => 90 độ (hướng bắc)
- 2.4> (y/x)> 0,4 - => 45 độ (phía tây bắc)
- 0,4> (y/x)> -0.4 - => 0 độ (phía tây)
- -0.4> (y/x)> -2,4 - => -45 độ (tây nam)
- -2.4> (y/x) - => 90 độ (phía nam)
và một danh sách tương tự cho x tiêu cực của
và cuối cùng là trường hợp ngoại lệ:
- (x == 0 & & y> 0) - => -90 độ (phía nam)
- (x == 0 & & y < 0) - => 90 độ (phía nam)
phụ lục: Tôi chỉ báo cáo phương pháp này khi tính toán một atan là không đi (ví dụ trên một hệ thống nhúng))
Tôi phải đào một chút. Đây là một thói quen tối ưu hóa cao mà tôi sử dụng (được sử dụng trong trò chơi di động).
đầu vào: x1, y1 = startpoint của vector x2, y2 = điểm cuối của vector đầu ra (0-7) = 0 = bắc, 1 = tây bắc, 2 = tây, ... vv
int CalcDir(int x1, int y1, int x2, int y2)
{
int dx = x2 - x1, dy = y2 - y1;
int adx = (dx<0)?-dx:dx, ady = (dy<0)?-dy:dy, r;
r=(dy>0?4:0)+(dx>0?2:0)+(adx>ady?1:0);
r=(int []){2,3,1,0,5,4,6,7}[r];
return r;
}
void CalcDirTest(){
int t = CalcDir(0, 0, 10, 1);
printf("t = %d",t);
t = CalcDir(0, 0, 9, 10);
printf("t = %d",t);
t = CalcDir(0, 0, -1, 10);
printf("t = %d",t);
t = CalcDir(0, 0, -10, 9);
printf("t = %d",t);
t = CalcDir(0, 0, -10, -1);
printf("t = %d",t);
t = CalcDir(0, 0, -9, -10);
printf("t = %d",t);
t = CalcDir(0, 0, 1, -10);
printf("t = %d",t);
t = CalcDir(0, 0, 10, -9);
printf("t = %d",t);
}
này sẽ dẫn đến kết quả như sau:
t = 7
t = 6
t = 5
t = 4
t = 3
t = 2
t = 1
t = 0
(các vectơ cho kỳ thi này có thể nhìn kỳ quặc chọn, nhưng tôi tinh chỉnh tất cả chúng một chút để được rõ ràng trong một chòm sao bát nhân và không trên biên giới chính xác)
bất kỳ ý tưởng nào về cách gắn thẻ chính xác? cảm thấy tự do ... –
Không, trong câu trả lời của tôi (1, 0) là về phía đông và nó sẽ chống ngược chiều kim đồng hồ, vì tôi đang làm những điều toán học ở đây. Đây là tỷ lệ cược với việc sử dụng tiêu chuẩn của góc trong điều hướng (0 = phía bắc, theo chiều kim đồng hồ). Bạn có thể điều chỉnh nó bằng cách thêm một offset thích hợp cho +8 và sử dụng a - ở phía trước của atan2. – starblue
Cảm ơn bạn đã chỉ ra rằng starblue, tôi đang bối rối với bản phác thảo của tôi ở đây - câu trả lời của bạn là tại chỗ! –