Dưới đây là một ví dụ làm việc trong SVG đó là gần để sửa:
http://phrogz.net/svg/constant-length-bezier.xhtml
Tôi thực nghiệm xác định rằng khi các thiết bị đầu cuối đang lên nhau tay nắm nên
mong muốnLength × cos (30 °)
cách xa các tay cầm; và (tất nhiên) khi các điểm kết thúc ở khoảng cách lớn nhất của chúng, các tay cầm phải nằm trên đỉnh của nhau.Âm mưu tất cả các điểm lý tưởng trông loại như một hình elip:
Dòng màu xanh là phương trình lý tưởng thực tế, trong khi dòng màu đỏ ở trên là một hình elip gần giống lý tưởng. Sử dụng phương trình cho hình elip (như ví dụ trên của tôi) cho phép các dòng để có được khoảng 9% quá dài ở giữa.
Dưới đây là đoạn mã JavaScript có liên quan:
// M is the MoveTo command in SVG (the first point on the path)
// C is the CurveTo command in SVG:
// C.x is the end point of the path
// C.x1 is the first control point
// C.x2 is the second control point
function makeFixedLengthSCurve(path,length){
var dx = C.x - M.x, dy = C.y - M.y;
var len = Math.sqrt(dx*dx+dy*dy);
var angle = Math.atan2(dy,dx);
if (len >= length){
C.x = M.x + 100 * Math.cos(angle);
C.y = M.y + 100 * Math.sin(angle);
C.x1 = M.x; C.y1 = M.y;
C.x2 = C.x; C.y2 = C.y;
}else{
// Ellipse of major axis length and minor axis length*cos(30°)
var a = length, b = length*Math.cos(30*Math.PI/180);
var handleDistance = Math.sqrt(b*b * (1 - len*len/(a*a)));
C.x1 = M.x + handleDistance * Math.sin(angle);
C.y1 = M.y - handleDistance * Math.cos(angle);
C.x2 = C.x - handleDistance * Math.sin(angle);
C.y2 = C.y + handleDistance * Math.cos(angle);
}
}
Có quan trọng mà các dòng này là chính xác độ dài giống nhau, hoặc chỉ là nó được cho không khi bắt đầu và điểm kết thúc được gần gũi hơn? – idanzalz
mức độ của bezier (bao nhiêu điểm?) Là nó khối? (4 điểm - bắt đầu, kết thúc và 2 ở giữa) – idanzalz
Một giải pháp nhanh chóng và bẩn là xây dựng nó như một vấn đề tối ưu hóa: Chia đường cong thành một chuỗi các đoạn thẳng và giảm thiểu sự khác biệt giữa tổng chiều dài phân đoạn đường thẳng và độ dài không đổi mong muốn, wrt các điểm kiểm soát miễn phí. Bạn có thể sử dụng các thuật toán như gradient gốc http://en.wikipedia.org/wiki/Gradient_descent cho việc này. Nhưng một giải pháp phân tích sẽ đẹp hơn. – Rulle