Cố gắng để mã một bezier thứ n trong javascript trên vải cho một dự án. Tôi muốn có thể cho người dùng nhấn một nút, trong trường hợp này là 'b', để chọn từng điểm kết thúc và các điểm điều khiển. Cho đến nay tôi có thể có được tọa độ chuột trên nhấn phím và làm cho đường cong bậc hai và bezier bằng cách sử dụng các chức năng được xây dựng trong. Làm thế nào tôi sẽ đi về làm mã cho thứ tự thứ n?Làm thế nào để mã một trật tự thứ n Bezier đường cong
Trả lời
Dưới đây là một việc thực hiện Javascript trật tự thứ n đường cong Bezier:
// setup canvas
var canvas = document.getElementById('canvas');
var ctx = canvas.getContext('2d');
canvas.height = window.innerHeight;
canvas.width = window.innerWidth;
ctx.fillText("INSTRUCTIONS: Press the 'b' key to add points to your curve. Press the 'c' key to clear all points and start over.", 20, 20);
// initialize points list
var plist = [];
// track mouse movements
var mouseX;
var mouseY;
document.addEventListener("mousemove", function(e) {
mouseX = e.clientX;
mouseY = e.clientY;
});
// from: http://rosettacode.org/wiki/Evaluate_binomial_coefficients#JavaScript
function binom(n, k) {
var coeff = 1;
for (var i = n - k + 1; i <= n; i++) coeff *= i;
for (var i = 1; i <= k; i++) coeff /= i;
return coeff;
}
// based on: https://stackoverflow.com/questions/16227300
function bezier(t, plist) {
var order = plist.length - 1;
var y = 0;
var x = 0;
for (i = 0; i <= order; i++) {
x = x + (binom(order, i) * Math.pow((1 - t), (order - i)) * Math.pow(t, i) * (plist[i].x));
y = y + (binom(order, i) * Math.pow((1 - t), (order - i)) * Math.pow(t, i) * (plist[i].y));
}
return {
x: x,
y: y
};
}
// draw the Bezier curve
function draw(plist) {
ctx.clearRect(0, 0, canvas.width, canvas.height);
var accuracy = 0.01; //this'll give the 100 bezier segments
ctx.beginPath();
ctx.moveTo(plist[0].x, plist[0].y);
for (p in plist) {
ctx.fillText(p, plist[p].x + 5, plist[p].y - 5);
ctx.fillRect(plist[p].x - 5, plist[p].y - 5, 10, 10);
}
for (var i = 0; i < 1; i += accuracy) {
var p = bezier(i, plist);
ctx.lineTo(p.x, p.y);
}
ctx.stroke();
ctx.closePath();
}
// listen for keypress
document.addEventListener("keydown", function(e) {
switch (e.keyCode) {
case 66:
// b key
plist.push({
x: mouseX,
y: mouseY
});
break;
case 67:
// c key
plist = [];
break;
}
draw(plist);
});
html,
body {
height: 100%;
margin: 0 auto;
}
<canvas id="canvas"></canvas>
này được dựa trên this implementation of cubic Bezier curves. Trong ứng dụng của bạn, có vẻ như bạn sẽ muốn điền vào mảng points
với các điểm do người dùng xác định.
Cảm ơn bạn. Câu hỏi tiếp theo: cách tốt nhất để thêm vào điểm do người dùng xác định là gì? Tôi đã thử nghiệm cho ngày cuối cùng, nhưng đã không đưa ra bất cứ điều gì hoạt động. Những gì tôi muốn là cho người dùng nhấn 'b' sau đó nó sẽ vẽ sau mỗi lần nhấn, vì vậy bạn sẽ nhấn 'b' hai lần cho dòng, 3 cho bậc hai, v.v. – Adam
[Đây là một fiddle] (http: // jsfiddle .net/rphv/3jkt16Ly/3 /) có thể hữu ích. Nó thêm một điểm mới dưới con trỏ chuột khi phím 'b' được nhấn và xóa danh sách điểm khi bạn nhấn 'c'. Nó cũng hiển thị các điểm (numbererd) khi chúng được thêm vào. Để làm điều này, tôi đã tái cấu trúc mã vẽ vào hàm riêng của nó 'draw()', di chuyển 'plist' vào phạm vi toàn cục và thêm một trình nghe' mousemove' để theo dõi vị trí của chuột. Xin vui lòng xem xét upvoting câu trả lời ở trên nếu điều này đã giúp bạn. – rphv
Cảm ơn bạn rất nhiều! Tôi sẽ upvote nếu tôi có thể, nhưng nó sẽ không cho phép tôi chưa gây ra đại diện. Tài khoản của tôi rất mới – Adam
- 1. thứ tự thứ n Bezier Curves?
- 2. Đường cong Bezier và canvas
- 3. Đường viền của đường cong đường cong khối bezier
- 4. Làm thế nào để vẽ đường cong Bezier với mã Javascript gốc mà không cần ctx.bezierCurveTo?
- 5. Làm thế nào để animate một đường cong bezier trong một thời hạn nhất định
- 6. Kéo một đường cong bezier để chỉnh sửa nó
- 7. Làm thế nào để vẽ một đường cong Bezier lập trình trong WPF?
- 8. Làm thế nào để bù đắp một đường cong bezier khối?
- 9. WPF Animation - Điểm động Bezier đường cong
- 10. Làm thế nào để vẽ đường cong bezier bằng nhiều điểm?
- 11. Tính toán đường bao của đường cong khối bezier
- 12. chuyển đổi đường cong bezier thành chuỗi đa giác?
- 13. Sử dụng đường cong Bezier để vẽ hình xoắn ốc
- 14. Đường cong bị đứt trên Html5 Canvas Bezier
- 15. Cocos2d-x - Lỗi vẽ đường cong bezier khối
- 16. mở rộng đường bezier
- 17. Thuật toán để "theo dõi" các điểm tuần tự vào các đường cong bezier
- 18. Đường cong bezier khối - nhận Y cho X
- 19. Tìm Y cho X trên Đường cong Bezier khối?
- 20. Vẽ đường cong bezier đứt quãng trong QML
- 21. Đường cong Bezier luôn có cùng độ dài
- 22. Cách tính điểm gần nhất của đường và đường cong? .. hoặc đường cong và đường cong?
- 23. Làm thế nào để vẽ một đường cong qua các điểm cây trong Android?
- 24. Làm thế nào để vẽ Bezier Curve trong Android
- 25. Vẽ một đường cong Bezier giữa một tập hợp các điểm nhất định
- 26. Làm phẳng đường cong đơn giản trong matplotlib --- tương đương với "bezier mịn" của gnuplot?
- 27. Vị trí của một điểm tương ứng với đường cong Bezier
- 28. Làm thế nào để ngoại suy đường cong bằng Python?
- 29. truy vấn cơ sở dữ liệu theo thứ tự dọc theo một đường cong
- 30. Làm thế nào để tạo ra loại đường cong ngẫu nhiên này?
Tạo một mảng và lưu trữ từng dòng trong đó. – user2072826