2011-01-31 29 views
7

Tôi duy trì các trình kết xuất Flash và HTML5/Canvas song song cho dự án nguồn mở OpenHeatMap. Tôi bị cản bởi một sự mâu thuẫn trong việc vẽ các đa giác đầy với các tọa độ phân số giữa hai phiên bản. Nếu bạn hiển thị hai đa giác có chung một cạnh, Canvas sẽ hiển thị một kết nối hiển thị dọc theo cạnh đó, trong khi Flash sẽ liên kết chặt chẽ cả hai cạnh nhau, không có sự khác biệt nào có thể nhìn thấy nếu chúng có cùng màu. Tôi đã đặt cùng một trang tối thiểu đây để hiển thị các vấn đề:Làm cách nào để tránh các hiện vật ghép cạnh đa giác trong Canvas HTML5?

http://web.mailana.com/labs/stitchingbug/

[Gak, ngăn chặn spam dừng này không bị một hình ảnh, nhưng xem ở đây để một web.mailana.com/labs/stitchingbug ảnh chụp màn hình .png]

nguồn, cùng với một dự án flash làm điều tương tự, là ở đây:

github.com/petewarden/stitchingbug

vấn đề cơ bản là nó không thể làm bất cứ đa giác phức tạp r endering nếu bạn không thể khâu đa giác với nhau mà không có đường nối. Tôi không biết chính xác quy tắc điền Flash là gì, nhưng chúng tạo ra kết quả chính xác, cũng như các trình kết xuất 3D. Có ai có một sửa chữa phía khách hàng để làm việc xung quanh vấn đề này? Đó là trình duyệt chéo, mà làm cho nó có vẻ thận trọng, vì vậy bất kỳ tham chiếu đến các quy tắc được sử dụng cũng sẽ được đánh giá cao. Dưới đây là mã Canvas:

var ctx = canvas.getContext('2d'); 
    ctx.fillStyle = 'rgb(0,0,0)'; 

    ctx.beginPath() 
    ctx.moveTo(0, 0); 
    ctx.lineTo(50.5, 0); 
    ctx.lineTo(50.5, 100); 
    ctx.lineTo(0, 100); 
    ctx.closePath(); 
    ctx.fill(); 

    ctx.beginPath() 
    ctx.moveTo(50.5, 0); 
    ctx.lineTo(100, 0); 
    ctx.lineTo(100, 100); 
    ctx.lineTo(50.5, 100); 
    ctx.closePath(); 
    ctx.fill(); 
+0

Brainstorming: tính trung tâm của mỗi đa giác và khi vẽ đẩy các điểm bên ngoài từ trung tâm bởi một lượng nhỏ (có lẽ là 0,5). Buộc rút tiền quá mức của chống răng cưa. – Phrogz

+0

Xem phần thứ hai của [câu trả lời này] (http://stackoverflow.com/questions/15631426/svg-fill-not-filling-boundary/15638764#comment22224474_15638764) để hiểu tại sao bạn không thể giải quyết vấn đề này mà không cần 'hack 'Giống như đột quỵ hoặc lấp đầy khi chống răng cưa có liên quan. – Phrogz

Trả lời

1

Bạn đã xem xét cắt ngắn tất cả coords vẽ? Nó không nên giảm chất lượng, và nó có thể khắc phục vấn đề của bạn.

Bạn cũng có thể vẽ một đường kẻ trên khu vực khó khăn để làm cho vấn đề không nhìn thấy được.

Nếu vẫn thất bại, điều đó sẽ hiệu quả.

+1

Rất tiếc, tọa độ cắt ngắn chỉ hoạt động trong trường hợp đơn giản của một tập hợp các đa giác tĩnh. Ngay sau khi bạn phóng to hoặc xoay bản đồ, ví dụ, việc cắt ngắn gây ra 'các cạnh nhảy' khá nghiêm trọng khi chúng chụp qua lại giữa các tọa độ nguyên. Nó cũng đáng chú ý làm méo mó các cạnh của các đa giác lớn hơn với các lớp nông. –

3

Đây là một câu hỏi cũ, nhưng tôi đã có cùng một vấn đề.

Tôi thấy rằng vẽ một đường duy nhất giữa hai đa giác (hoặc một phác thảo xung quanh họ) giải quyết vấn đề (trong firefox và chrome ít nhất).

Điều đó dường như lấp đầy khoảng trống trong chrome và firefox ít nhất. Nó là đủ để gọi ctx.stroke() sau ctx.fill(), hoặc vẽ một đường đơn như sau:

ctx.beginPath() 
ctx.moveTo(50.5, 0); 
ctx.lineTo(50.5, 100); 
ctx.stroke(); 

và chắc chắn để thiết lập strokeStyle tất nhiên.

+0

Nếu dòng bạn đang vuốt là một mẫu hình ảnh, trong chrome, điều này làm giảm hiệu suất nghiêm trọng vì một lý do nào đó. – shoosh

+1

Ngoài ra, giải pháp này không hoạt động với đa giác bán trong suốt. –

+0

Thêm đột quỵ xung quanh đa giác với lineWidth of .5 hoạt động tốt cho tôi. Cho đến khi tôi nhận thấy khi phóng to các góc đa giác thì tốc độ của chúng vượt quá đáng kể. Vì vậy, tôi thay vì thiết lập lineWidth thành .5/zoom (trong đó zoom là 1 cho 100%, .5 cho 50%, 2 cho% 200, vv) và bây giờ nó hoạt động rất đẹp. Polys bán trong suốt sẽ vẫn hiển thị với các cạnh đáng chú ý. Về lý thuyết, điều này có thể được khắc phục bằng cách hiển thị đa giác hoàn toàn mờ đục trên một khung hình riêng biệt, sau đó hiển thị canvas đó với độ trong suốt trên canvas đích - điều này có khả năng sẽ đạt được hiệu suất đáng kể. – CodeAndCats

1

tôi có thể thấy cùng một vấn đề trong Chrome 41.0.2272.89 m ngay cả khi các tọa độ là các số nguyên: http://jsfiddle.net/xgd03fyb/

var canvas = document.getElementById('myCanvas'); 
var context = canvas.getContext('2d'); 
context.lineWidth = 0; 
context.fillStyle = 'black'; 

context.beginPath(); 
context.moveTo(100, 100); 
context.lineTo(200, 200); 
context.lineTo(200, 100); 
context.closePath(); 
context.fill(); 

context.beginPath(); 
context.moveTo(100, 100); 
context.lineTo(100, 200); 
context.lineTo(200, 200); 
context.closePath(); 
context.fill(); 

Tôi nghi ngờ rằng vấn đề có thể được gây ra bởi chiều kim đồng hồ/ngược chiều kim đồng hồ không phù hợp, như trong một số thư viện mà tôi từng sử dụng trong quá khứ này sẽ ảnh hưởng đến các cạnh nào được vẽ như rắn, mà như trong suốt, và đó là chống răng cưa. Tuy nhiên, việc thay đổi thứ tự các lệnh lineTo() trong tam giác thứ hai dường như không có bất kỳ ảnh hưởng nào.

Tôi cũng đã cố gắng chaning fillStyle (đối số được chuyển đến fill()) từ "evenodd" từ mặc định "nonzero", không có may mắn.

Nó không rõ ràng đối với tôi từ spec https://html.spec.whatwg.org/multipage/scripting.html#dom-context-2d-fill cách này nên làm việc vì vậy tôi đã nộp lỗi để tìm hiểu thêm: https://www.w3.org/Bugs/Public/show_bug.cgi?id=28217

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