2012-12-28 14 views
6

Có cách nào để tránh vẽ lại tất cả các phần tử trên canvas (vì vậy tôi không phải theo dõi mọi thứ), trong khi vẫn có trải nghiệm vẽ mượt mà với đường vẽ hiện tại?Vẽ một đường bằng công cụ Pen trên Canvas Smothly mà không cần phải vẽ lại tất cả các dòng khác

+0

Tôi cố gắng sử dụng canvas cho ứng dụng vẽ. Đã nhận được vị trí chuột, nhưng kết quả là (như bạn có thể đoán) khá sắc sảo. Tôi đang cố gắng làm mịn dòng cuối cùng, mà không cần phải vẽ lại từng khung hình ngay từ đầu .. Có thể là cách để tính toán phiên bản mượt mà hơn của mỗi khung hình ... – Mia

+1

@ x3ro nếu bạn trải nghiệm vấn đề đầu tiên tay bạn sẽ biết rằng đây thực sự là một câu hỏi rất tốt ẩn đằng sau một số từ ngữ nghèo. Thực hiện một nỗ lực trước khi bạn bỏ phiếu để đóng một câu hỏi thường được đánh giá cao. Tôi đã cố gắng để cải thiện các từ ngữ, nếu bạn quan tâm để giúp đỡ ... – iwein

+0

@ iwein: Tôi nghĩ rằng tất cả những người gửi một câu hỏi SO nên làm cho các nỗ lực của việc viết một câu hỏi phong nha. Trong ví dụ trên, bao gồm liên kết đến những gì anh ta đọc và một ví dụ nhỏ về những gì anh ta đã viết. Ngoài ra, đoạn đầu tiên làm cho một câu lệnh, đoạn thứ hai hỏi một câu hỏi, nhưng tôi thực sự không thể nhìn thấy kết nối trực tiếp giữa chúng (đúng, người ta có thể có thể nội suy, nhưng vẫn còn). Tại sao một câu hỏi nghèo nàn vẫn còn mở trên cơ hội mà một người nào đó đến cùng hiểu được nó? Tại sao không buộc OP phải nói lại nó? – fresskoma

Trả lời

5

Điều này một câu hỏi rất hay, nhưng từ ngữ của nó mơ hồ. Vui lòng cẩn thận hơn trong các câu hỏi từ ngữ trong tương lai.

Thông thường khi vẽ các đường trơn, bạn cần vẽ lại đường ngay từ đầu.

Bạn không cần phải vẽ lại mọi thứ từ đầu mặc dù, bởi vì bạn cần phải làm theo các hoạt động:

  1. Save the canvas hiện tại để một canvas trong bộ nhớ
  2. Bắt đầu vẽ một đường mới
  3. Khi bạn đang vẽ, bạn liên tục:
    • Xoá vải
    • vẽ từ i n-bộ nhớ vải lên vải chính
    • Vẽ đường-so-xa
  4. Khi dòng kết thúc, giúp bạn tiết kiệm vải mới vào khung trong bộ nhớ và lặp lại quá trình này

Các chỉ dòng bạn cần phải theo dõi (về điểm) là "hiện tại". Tất cả các dòng cũ được lưu vào bitmap thông qua canvas trong bộ nhớ.

Dưới đây là một ví dụ tôi đã thực hiện một thời gian dài trước đây, đối phó với các đường trơn tru cụ thể. Các tổ chức đang kỳ lạ vì tôi bắt đầu với mã elses ai đó, nhưng nó sẽ cho bạn những ý tưởng cơ bản:

http://jsfiddle.net/NWBV4/10/

Phần vẽ mô tả ở trên được nhìn thấy trong các MouseMove:

this.mousemove = function(ev) { 
    if (tool.started) { 
     context.clearRect(0, 0, 300, 300); 
     // put back the saved content 
     context.drawImage(memCanvas, 0, 0); 
     tool.points.push({ 
      x: ev._x, 
      y: ev._y 
     }); 
     drawPoints(context, tool.points); 
    } 
}; 
+0

Cảm ơn bạn đã trả lời ... Tôi hiểu vấn đề, và đây là lý do tại sao tôi đã đặt câu hỏi (tái vẽ vấn đề) .. Một câu hỏi nhỏ về câu đố của bạn và giải thích: "Vẽ từ trong bộ nhớ canvas lên canvas chính " -why chúng ta cần phải tiếp tục vẽ lại canvas tạm thời lên canvas hiện tại? – Mia

+0

Bởi vì chúng ta phải xóa canvas mỗi lần. Vì vậy, các temp vải đại diện cho tất cả các dòng đã được rút ra, mà chúng tôi phải đưa "trở lại" vào vải trước khi vẽ dòng mới nhất của chúng tôi –

+0

Tôi không thể đồng ý hơn với câu trả lời nhưng tôi muốn nói rằng bạn có thể sử dụng một hình ảnh để vẽ lên khung hình. Bạn loại bỏ 'kiểm soát' bạn có vẽ hình dạng chính mình nhưng nó có vẻ hiệu quả hơn với tôi (không có sự chậm trễ khi bạn bấm vào vải để vẽ), tùy thuộc vào những gì ứng dụng của bạn thực sự là về. Đây là một liên kết đến câu hỏi của tôi - không thực sự - tương tự (xem phần EDIT trong câu hỏi của tôi): http://stackoverflow.com/questions/10122553/create-a-realistic-pencil-tool-for-a- painting-app-with-html5-canvas Bạn có thể thay thế hình ảnh để có được kết quả bạn thực sự muốn – jazzytomato

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