Hướng dẫn dùng find hypotenuse python

Bán kính của "vòng tròn" của bạn phải là 57.28996163075943pixel và có thể được tính như sau:

import math
radius = math.sin[math.radians[89]] / math.sin[math.radians[1]]
print['Radius of circle =', radius]

Lý do điều này đúng bắt nguồn từ thực tế là hình tròn của bạn không thực sự là hình tròn. Nó bao gồm 360 hình tam giác khác nhau. Đặc biệt, chúng đều là tam giác ASA [góc, cạnh, góc]. Giả sử rằng khi bắt đầu vẽ đường tròn của bạn, con rùa của bạn bắt đầu trên một tiếp tuyến của đường tròn. Điều đó có nghĩa là nếu bạn vẽ một đường thẳng đi qua tâm của vòng tròn bạn đang vẽ và con rùa đang vẽ, hướng của con rùa của bạn sẽ vuông góc với đường thẳng đó. Do đó, chúng ta có thể nói như sau:

angle_a = 90

Chúng ta đang nói rằng góc đầu tiên mà chúng ta biết bất cứ điều gì về tam giác của chúng ta là 90 độ. Thông tin tiếp theo chúng ta cần là độ dài của một cạnh. Vì con rùa vẽ một đoạn thẳng 1 pixel, chúng tôi biết đó là chiều dài và có thể thêm nó vào ghi chú của chúng tôi:

angle_a = 90
side_c = 1

Điều cuối cùng chúng ta cần biết là một góc độ nữa. Bây giờ điều này phải được bắt nguồn từ kiến ​​thức trước đây vì nó có thể không rõ ràng lúc đầu. Ở đầu mỗi bước vẽ, con rùa của chúng ta song song với một tiếp tuyến trên đường tròn; và điều đó có nghĩa là sau khi quay con rùa 1 độ, nó đã sẵn sàng để bắt đầu bước vẽ tiếp theo và phải nằm trên một tiếp tuyến. Do đó, khi kết thúc bước vẽ, có thể vạch một đường trở lại giữa vòng tròn bằng cách đi theo một đường vuông góc với hướng mà con rùa đang quay mặt. Vì đã quay 1 độ nên chúng ta biết rằng góc còn lại của tam giác mà chúng ta đang tạo phải là 89 độ.

angle_a = 90
side_c = 1
angle_b = 89

Từ đó ta có thể kết luận rằng góc còn lại trong tam giác ở tâm đường tròn phải là 1 độ.

angle_a = 90
side_c = 1
angle_b = 89
angle_c = 1

Bây giờ chúng ta có tất cả thông tin này, chúng ta có thể sử dụng luật sin để tìm độ dài của hai cạnh còn lại của tam giác. Chúng ta sẽ nhận được hai giá trị khác nhau. Đầu tiên là độ dài của cạnh a, cạnh huyền; và thứ hai là chiều dài của cạnh b, bán kính. Bạn sẽ nhận thấy rằng chiều dài dài hơn bao xa so với tâm của vòng tròn sau bước vẽ đầu tiên của nó. Đối với mục đích tính toán bán kính, tôi đã chọn đi với phép đo thứ hai hầu như không có gì khác biệt.

Đã đến lúc giải một số công thức:

side_a / sin[angle_a] = side_c / sin[angle_c]
side_a / sin[90] = 1 / sin[1]
side_a = sin[90] / sin[1]

side_a = math.sin[math.radians[90]] / math.sin[math.radians[1]]  # hypotenuse

side_b / sin[angle_b] = side_c / sin[angle_c]
side_b / sin[89] = 1 / sin[1]
side_b = sin[89] / sin[1]

side_b = math.sin[math.radians[89]] / math.sin[math.radians[1]]  # radius

Bạn cũng có thể chọn lấy trung bình độ dài của các cạnh a và b để có được giá trị gần đúng hơn về bán kính hình tròn của bạn:

print['Radius of circle =', [side_a + side_b] / 2]

Từ đó, bạn sẽ nhận được 57.29432506465481bán kính gần đúng của mình tính bằng pixel.

Phụ lục

Sau khi nghiên cứu thêm một chút về vấn đề này, có thể dễ dàng phát triển một hàm để giúp giải quyết các vấn đề như thế này dễ dàng hơn trong tương lai. Hãy nhận ra rằng đa giác không nhất thiết phải có đường kính, nhưng đa giác đều có ít nhất hai bức xạ song song với nhau. Lấy bán kính với hàm sau dễ dàng như chia kết quả của nó cho hai. Cách sử dụng ví dụ được bao gồm:

import math


def get_polygon_diameter[side_length, side_rotation]:
    return side_length / math.sin[math.pi * side_rotation / 360]


length_of_each_side = 1  # in pixels
rotation_per_side = 1    # in degrees
diameter = get_polygon_diameter[length_of_each_side, rotation_per_side]
radius = diameter / 2
print[f'Radius of "circle" that is actually a polygon = {radius:.3f} pixels']

0 hữu ích 0 bình luận chia sẻ

Tên xuất hiện ở khắp nơi trong phần mềm. Chúng ta đặt tên cho biến, hàm, danh sách tham số, lớp, gói. Sau đó chúng ta đặt tên tệp và tên thư mục chứa chúng, tên tệp jar và tệp war, tệp ear… Sau đây là một số quy tắc đơn giản để tạo ra một cái tên tốt.

Sử dụng những tên gợi tả mục đích

Mục lục

  • Sử dụng những tên gợi tả mục đích
  • Tạo nên sự khác biệt rõ ràng
  • Giao diện và cài đặt
  • Tên lớp
  • Tên phương thức
  • Chọn Một Từ cho mỗi Khái Niệm
  • Thêm bối cảnh có ý nghĩa

Thật đơn giản để nói về những cái tên được gợi tả. Việc lựa chọn tên tốt mất nhiều thời gian nhưng lại tiết kiệm được rất nhiều khi dùng. Vì vậy cần chú ý tới những cái tên bạn đặt và thay đổi chúng khi bạn tìm thấy tên tốt hơn. Khi bạn làm được điều đó, tất cả những ai khi đọc đoạn mã của bạn sẽ thấy dễ hiểu hơn.

Tên của biến, hàm, lớp nên giải đáp cho tất cả những câu hỏi lớn. Nó sẽ cho bạn biết lý do tại sao nó tồn tại, những gì nó làm và cách nó được sử dụng. Nếu một cái tên cần được yêu cầu giải thích, thì tên này không có ý nghĩa gợi tả.

int d; // thời gian trôi qua trong ngày

Tên biến d cho thấy không có nghĩa gì. Nó không diễn tả cảm giác thời gian trôi qua, cũng không phải nói về ngày. Chúng ta nên chọn một tên mô tả được điều đang diễn ra như:

intelapsedTimeInDays;

intdaysSinceCreation;

intdaysSinceModification;

intfileAgeInDays;

Sự chọn lựa những tên gợi tả làm cho ta dễ dàng hiểu và thay đổi khi lập trình hơn.

Tránh sai lạc

Lập trình viên phải tránh để lại manh mối sai mà che khuất nghĩa đoạn mã lệnh. Chúng ta nên tránh những từ có nghĩa khác với ý định thực của mình. Ví dụ, hp, aix, sco là những tên biến kém bởi chúng là những cái tên mô tả trong hệ điều hành Unix hay các phiên bản của nó. Thậm chí nếu bạn đang lập trình về hypotenuse và hp nhìn giống như từ viết tắt, đây không phải là thông tin tốt.

Không nên gọi một nhóm các tài khoản [account] là accountList trừ khi nó lưu trữ danh sách [list] thật sự. Từ danh sách [list] có nghĩa là một cái gì đó cụ thể cho các lập trình viên. Nếu các tài khoản này không được lưu trữ ở dạng danh sách, thì có thể danh đến những kết luận sai lệch. Vì vậy cái tên accoutGroup hoặc bunchOfAccounts chỉ ra danh sách chủ tài khoản vẫn tốt hơn.

Tạo nên sự khác biệt rõ ràng

Lập trình viên sẽ tự tạo ra vấn đề khi họ viết mã chỉ để thỏa mãn trình biên dịch hoặc trình thông dịch. Ví dụ, bởi vì bạn không thể sử dụng cùng một tên để chỉ hai việc khác nhau trong cùng một phạm vi, bạn có thể bị cám dỗ để thay đổi tên một tên theo cách ngẫu nhiên. Đôi khi, điều này được thực hiện do lỗi chính tả, dẫn đến tình huống ngạc nhiên sửa lỗi chính tả dẫn đến đoạn mã không có khả năng biên dịch được [Ví dụ khi đặt tên lớp là kclass bởi tên class đã được sử dụng cho việc khác].

Đặt tên cho một dãy số là [a1, a2, … aN] là ngược lại với việc đặt tên có chủ đích. Những tên này không làm hiểu sai, nhưng chúng cũng không có thông tin. Chúng không cung cấp manh mối về ý tưởng của tác giả.

Những từ nhiễu là một trường hợp khác của tên mà không có sự khác biệt đáng kể. Hãy tưởng tượng rằng bạn có lớp Product. Nếu bạn có một lớp khác được gọi ProductInfo hay ProductData. Bạn đặt những tên khác nhau mà không tạo ra bất kỳ sự khác biệt nào. Info và Data là hai từ nhiễu.

Các từ nhiễu là thừa. Một biến không bao giờ nên có tên variable. Từ table không nên xuất hiện trong tên bảng. Tên NameString tốt hơn Name ở chỗ nào? Name đã bao giờ là số thực chưa? Nếu như vậy nó phát vỡ quy tắc trước về sự sai lệnh thông tin. Hãy tưởng tượng việc tìm ra tên lớp là Customer và một cái tên khác đặt là CustomerObject. Bạn thấy sự khác biệt giữa hai cái tên này là gì? Tên nào sẽ mô tả tốt nhất cho lịch sử thanh toán của một khách hàng?

Giao diện và cài đặt

Thỉnh thoảng có một vài trường hợp đặc biệt khi mã hóa. Ví dụ, nếu bạn đang xây dựng một Abstract Factory để tạo ra đối tượng Shapes [hình]. Factory này sẽ được tạo dưới dạng là interface và sẽ được thực thi bởi một lớp cụ thể. Vậy bạn nên đặt tên thế nào cho Factory đó? IShapeFactory hay ShapeFactory? Tôi thích interface ShapeFactory hơn. Khi xác định I phía trước interface, có nhiều phân tán và thông tin không tốt. Vì tôi không muốn khách hàng của tôi biết rằng tôi đang bàn giao cho họ một interface. Tôi chỉ muốn họ biết rằng đó là một ShapeFactory. Do vậy để mã hóa hay thực thi interface tôi chọn sự thực thi [implementation]. Gọi đó là ShapeFactoryImp, hoặc thậm chí CShapeFactory hơn là mã hóa interface.

Lớp và đối tượng nên có danh từ hoặc cụm danh từ như Customer, WikiPage, Account, và AddressParser. Tránh dùng những từ như Manager, Processor, Data, Infor trong tên của một lớp. Tên một lớp không nên là một động từ

Tên phương thức

Phương thức nên có động từ hoặc cụm động từ như postPayment, deletePage, hoặc save. Các phương thức truy xuất, thay đổi nên được đặt tên cho giá trị của chúng và tiền tốt get, get và is theo chuẩn của javabean.

string name = employee.getName[];

customer.setName[“mike”];

if [paycheck.isPosted[]]…

Khi phương thức khởi tạo được nạp chồng, dùng phương thức tính với tên mô tả đối số truyền vào. Ví dụ:

Complex fulcrumPoint = Complex.FromRealNumber[23.0];

thường tốt hơn:

Complex fulcrumPoint = new Complex[23.0];

Hãy xem xét việc ép buộc dùng chúng bằng cách chuyển phương thức khởi tạo tương ứng thành private.

Chọn Một Từ cho mỗi Khái Niệm

Hãy chọn một từ cho mỗi khái niệm trừu tượng và gắn nó vào. Ví dụ, các phương phức tương đương của các lớp khác nhau có những tên fetch, retrieve và get. Làm sao bạn có thể nhớ được tên của phương thức trong mỗi lớp? Thật buồn, bạn vẫn thường phải nhớ công ty, nhóm hoặc cá nhân nào đã viết thư viện hoặc lớp đó để biết tên nào được sử dụng, nếu không bạn phải mất thời gian đáng kể để tìm kiếm.

Những IDE hiện đại như Eclipse và IntelliJ cung cấp những gì có thể dùng được trong hoàn cảnh đó, ví dụ như danh sách phương thức có thể gọi trên một đối tượng nào đó. Nhưng chú ý rằng, danh sách này không thường xuyên cho chúng ta những chú thích mà bạn đã viết xung quanh tên phương thức, danh sách tham số. Bạn thực là may mắn nếu IDE cho bạn biết tên của của tham số của phương thực. Tên phương thức phải độc lập và thống nhất để bạn có thể chọn đúng phương thức mà không cần phải tìm kiếm gì thêm.

Tương tự, việc có controller, manager và driver trong cùng một mã nguồn sẽ gây bối rối.

Thêm bối cảnh có ý nghĩa

Có rất ít tên mà tự thân có ý nghĩa, hầu hết là không. Bạn cần đặt tên vào bối cảnh, bằng việc đặt chúng vào lớp, hàm, gói có tên rõ nghĩa để giúp người đọc hiểu. Khi bạn không làm được những điều này thì có thể dùng tiền tố như giải pháp cuối cùng.

Hãy tưởng tượng bạn có các biến với tên như sau: firstName, lastName, street, houseNumber, city, state và zipcode. Đặt chúng cạnh nhau thì rất rõ là sẽ tạo thành một địa chỉ. Nhưng biến state có nghĩa gì nếu bạn thấy nó một mình trong một phương thức? Liệu bạn có hiểu ngay đó là một phần của một địa chỉ?

Bạn có thể thêm bối cảnh bằng cách sử dụng tiền tốt: addrFirstName, addrLastName, adddrState,… Ít nhất người đọc sẽ hiểu rằng những biến này là phần của một cấu trúc lớn hơn. Dĩ nhiên, giải pháp tốt hơn là tạo một lớp có tên là Address. Lúc đó thì thậm chí trình biên dịch cũng biết là những biến này thuộc một câu trúc lớn hơn.

Hãy làm theo những quy tắc này và xem liệu bạn có cải tiến được mã nguồn của mình dễ đọc hơn. Nếu bạn bảo trì mã nguồn của người khác, hãy dùng công cụ tái câu trúc để giúp giải quyết những vấn đề này. Nó sẽ trả hết vốn trong thời gian ngắn và tiếp tục cho lãi về lâu dài.

Chủ Đề