2012-03-08 16 views
5

Tôi đang gặp một chút rắc rối với một số trig cơ bản. Tôi đang làm một số bài tập về nhà toán học, và cuối cùng tôi đã chán chuyển đổi các tọa độ hình chữ nhật thành các tọa độ cực và ngược lại, vì vậy tôi quyết định tạo một chương trình Python nhỏ để giúp tôi với các chuyển đổi. Tuy nhiên, Math.atan() đang cho tôi một chút rắc rối. Dưới đây là đoạn code:.Cơ bản trig: math.atan() số

def rect_to_polar_input(x, y): 
    hypotenuse = math.sqrt((x * x) + (y * y)) 
    tangent = float(y/x); 
    angle = round(math.degrees(math.atan(tangent))); 

    if x <= 0: 
     if(y >=0): 
      angle += 90 

     if(y <= 0): 
      angle+= 180 

    if x >= 0: 
     if(y<0): 
      angle+=270 

    return hypotenuse, angle 

Trong trường hợp bạn đang tự hỏi tại sao tôi có những if báo cáo phiền phức trong đó, nó để thêm các góc chính xác cho các góc phần tư tọa độ vuông góc trong Quadrant 2 là 90 độ ra khỏi Quadrant 1 và Quadrant 3 là 180 độ từ Quadrant 1, v.v.

Bây giờ, nếu tôi nhập giá trị như (5, 5), mọi thứ hoạt động như mong đợi. Tuy nhiên, nếu tôi nhập (-5, 5), tôi nhận được giá trị là 7.07, 45, nơi tôi sẽ nhận được 7.07, 135. Nếu tôi nhập (-5, -5), tôi nhận được giá trị là 7.07, 225, dự kiến. Cuối cùng, nếu tôi nhập giá trị (5, -5), tôi vẫn nhận được giá trị là 7.07, 225. Tôi đã thử tất cả mọi thứ tôi có thể nghĩ đến, nhưng nó không hoạt động. Vì vậy, tôi đang thiếu gì?

Trả lời

12

Bạn nên sử dụng atan2 cho việc này. Nó đề với các góc phần tư chính xác như bạn cần. Cũng giống như vậy:

def rect_to_polar_input(x, y): 
    hypotenuse = math.hypot(x, y) 
    angle = round(math.degrees(math.atan2(y, x))) 
    if angle<0: 
     angle += 360 
    return hypotenuse, angle 

Tuyên bố if là để đối phó với thực tế là bạn muốn kết quả trong khoảng 0..360, nhưng atan2 cho góc trong khoảng -180..180.

Bạn có thể thực hiện việc này với atan bằng cách sử dụng phương pháp cơ bản mà bạn đã thực hiện, nhưng bạn chưa hoàn toàn sửa lỗi. Trong mọi trường hợp, mọi người đều sử dụng atan2 cho việc này.

Ngoài ra, bạn cũng có thể sử dụng hypot thay vì tự cuộn của riêng mình.

+0

Vâng, đã làm điều đó, cảm ơn! Xin lỗi vì đã chờ đợi. –