2015-07-14 42 views
13

Tôi đang sử dụng javascript và canvas để vẽ thang được thiết kế toán học (để đo mô-men xoắn, nó bao gồm newton-mét và foot-pounds). Tôi đã định vị ve của mình bằng cách sử dụng lượng giác, và vẽ các đường phun bằng cách sử dụng arc, một cách tự nhiên. Vấn đề xảy ra khi họ cần phải xếp hàng, nhưng có một số biến dạng kỳ lạ. Sau đó tôi vẽ một vòng tròn rất lớn và so sánh nó với một lựa chọn hình tròn trong GIMP và có một sự biến dạng. Các vòng tròn nhất quán mỗi 45 độ xung quanh các vòng tròn, nhưng giữa các nút đó vòng tròn vẽ vải lệch ra ngoài, giống như một hình bát giác có thể được làm tròn quá xa để gần đúng một vòng tròn.Làm cách nào để vẽ hình tròn trên canvas?

Tại sao những biến dạng này xảy ra? Làm thế nào tôi có thể vẽ một vòng tròn thực sự tròn trên vải?

Đây là mã tôi đã sử dụng để tạo vòng tròn méo mó của mình.

<!DOCTYPE html> 
<html> 
    <body> 
    <canvas width=8000 height=8000 id='myCanvas'></canvas> 
    <script> 
     var canvas = document.getElementById('myCanvas'); 
     var context = canvas.getContext('2d'); 
     context.beginPath(); 
     context.arc(4000, 4000, 3200, 0, Math.PI*2, false); 
     context.lineWidth = 1; 
     context.strokeStyle = '#ff0000'; 
     context.lineCap = 'square'; 
     context.stroke(); 
    </script> 
    </body> 
</html> 

này có thể không được tối thiểu, tôi biết không sự liên quan của context.lineCap, nhưng đó là một di tích của mã này được dựa trên. Ảnh chụp màn hình dưới đây cho thấy sự khác biệt giữa các vòng tròn được vẽ bởi GIMP và vòng tròn được vẽ bởi Chrome screenshot

+0

bạn có mã mẫu nào không? –

+0

@JonSaw Chắc chắn rồi. Tôi sẽ thêm vào mã tôi đã sử dụng để tạo vòng kết nối của mình. –

+0

Chạy mã của bạn trên Safari (8.0.6), Chrome (43.0.2357.132) & Firefox (36.0.4) - nó trông rất đẹp. JS Bin [ở đây] (https://jsbin.com/pogehixibu/edit?html,output). Chỉ vì tò mò, bạn đang sử dụng trình duyệt nào? –

Trả lời

10

này được Chromium Bug #164241 (tuyên bố cố định, mặc dù việc sửa chữa có thể không làm cho nó ra được nêu ra). Câu trả lời ngắn gọn là: Chrome là approximating circles with composite Bezier curves.

Tôi không thể tự sao chép bản thân trên Chromium (43.0.2357.130, Ubuntu) nhưng nó xảy ra trên Firefox 39, mặc dù tôi không thể tìm thấy báo cáo lỗi tương tự cho Firefox. Thực tế là nó chính xác mỗi 90 độ (không 45, ít nhất là không cho tôi) chỉ ra rằng các vòng tròn đang được xấp xỉ bởi 4 đường cong, vì các điểm cuối đường cong được đảm bảo là chính xác.

May mắn thay, có cách giải quyết đơn giản: tạo đường dẫn bao gồm nhiều hơn 4 đường cong. 8 hoặc thậm chí 6 là đủ cho bán kính bạn đang sử dụng nhưng bạn có thể sử dụng nhiều hơn nếu bạn muốn chơi nó an toàn. Hoặc bạn có thể tăng số lượng đường cong như một hàm bán kính, mặc dù tính toán hàm tối ưu (n tối thiểu sẽ tạo ra một vòng tròn chính xác cho bán kính nhất định r) là không nhỏ.

context.beginPath(); 
var n=8; // 4 is the default behaviour. higher is better, also slower 
for (var i=0; i<n; i++) { 
    context.arc(4000, 4000, 3200, Math.PI*2*i/n, Math.PI*2*(i+1)/n, false); 
} 
context.stroke(); 

Xem thêm this question.

(Và có, lineCap là một cá trích đỏ.)

+0

Làm thế nào sâu sắc đáng thất vọng. Tôi đoán tôi sẽ chỉ phải viết của tôi, xấp xỉ tốt hơn. –

Các vấn đề liên quan