Bạn muốn sử dụng lệnh RC hình elipA
. Thật không may cho bạn, điều này đòi hỏi bạn phải xác định tọa độ Descartes (x, y) của điểm bắt đầu và điểm kết thúc thay vì tọa độ cực (bán kính, góc) mà bạn có, do đó bạn phải thực hiện một số phép toán. Đây là một hàm JavaScript sẽ hoạt động (mặc dù tôi chưa kiểm tra nó) và tôi hy vọng nó khá tự giải thích:
function polarToCartesian(centerX, centerY, radius, angleInDegrees) {
var angleInRadians = angleInDegrees * Math.PI / 180.0;
var x = centerX + radius * Math.cos(angleInRadians);
var y = centerY + radius * Math.sin(angleInRadians);
return [x,y];
}
Những góc nào tương ứng với vị trí đồng hồ nào sẽ phụ thuộc vào hệ tọa độ; chỉ trao đổi và / hoặc phủ nhận các điều khoản sin / cos khi cần thiết.
Lệnh arc có các tham số sau:
rx, ry, x-axis-rotation, large-arc-flag, sweep-flag, x, y
Ví dụ đầu tiên của bạn:
rx
= ry
= 25 và x-axis-rotation
= 0, vì bạn muốn có một hình tròn chứ không phải hình elip. Bạn có thể tính toán cả tọa độ bắt đầu (mà bạn nên M
chuyển sang) và tọa độ kết thúc (x, y) bằng cách sử dụng hàm trên, lần lượt là (200, 175) và khoảng (182.322, 217.678). Cho đến những hạn chế này cho đến nay, thực sự có bốn cung có thể được vẽ, vì vậy hai lá cờ chọn một trong số chúng. Tôi đoán có lẽ bạn muốn vẽ một vòng cung nhỏ (có nghĩa là large-arc-flag
= 0), theo hướng giảm góc (nghĩa là sweep-flag
= 0). Tất cả cùng nhau, đường dẫn SVG là:
M 200 175 A 25 25 0 0 0 182.322 217.678
Đối với ví dụ thứ hai (giả sử bạn có nghĩa là đi cùng hướng và do đó, một cung lớn), đường dẫn SVG là:
M 200 175 A 25 25 0 1 0 217.678 217.678
Một lần nữa, tôi đã không kiểm tra những thứ này.
(chỉnh sửa 2016-06-01) Nếu, như @clocksmith, bạn đang tự hỏi tại sao họ chọn API này, hãy xem các ghi chú triển khai . Họ mô tả hai tham số hóa cung có thể là "tham số hóa điểm cuối" (cái mà họ đã chọn) và "tham số hóa trung tâm" (giống như những gì câu hỏi sử dụng). Trong phần mô tả "tham số hóa điểm cuối", họ nói:
Một trong những lợi thế của tham số hóa điểm cuối là nó cho phép cú pháp đường dẫn nhất quán trong đó tất cả các lệnh đường dẫn kết thúc theo tọa độ của "điểm hiện tại" mới.
Vì vậy, về cơ bản, đó là tác dụng phụ của các cung được coi là một phần của đường dẫn lớn hơn là đối tượng riêng biệt của chúng. Tôi cho rằng nếu trình kết xuất SVG của bạn không đầy đủ, nó có thể bỏ qua mọi thành phần đường dẫn mà nó không biết cách kết xuất, miễn là nó biết có bao nhiêu đối số họ đưa ra. Hoặc có thể nó cho phép hiển thị song song các đoạn khác nhau của một đường dẫn có nhiều thành phần. Hoặc có lẽ họ đã làm điều đó để đảm bảo các lỗi làm tròn không tích tụ dọc theo chiều dài của một đường dẫn phức tạp.
Các ghi chú thực hiện cũng hữu ích cho câu hỏi ban đầu, vì chúng có nhiều mã giả toán học hơn để chuyển đổi giữa hai tham số hóa (điều mà tôi không nhận ra khi lần đầu tiên viết câu trả lời này).
arcSweep
biến thực sự đang kiểm soátlarge-arc-flag
tham số svg A. Trong đoạn mã trên, giá trị củasweep-flag
tham số luôn bằng không.arcSweep
có lẽ nên được đổi tên thành một cái gì đó nhưlongArc
.