Я пытаюсь постепенно заполнять эллипс за вращающимся радиусом, действительно, похожим на часы таймером, который заполняется за широкой рукой. Я близок к тому, чтобы это правильно, но дуга заполненной области движется с каждым пересчетом.SVG Draw Path и Fill с эллиптической дугой
версия CodePen является here, но в итоге, я использую следующий HTML для запуска:
<svg version="1.1" baseProfile="full" width="50%" height="50%" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 3 3.2">
<path id="pie" stroke="none" stroke-width=".01" fill="rgb(204, 50, 50)"
d="M 1.5 1.7 V 1.5 .3
A 1.5 1.3 0 0 1 1.5 .2
z"/>
<line id="hand" stroke="black" stroke-width=".02"
x1="1.5" y1="1.7" x2="1.5" y2=".2"/>
</svg>
и вращать руку и рисовать/заливкой за ним следующий JavaScript:
var sweep = document.getElementById("hand"),
fill = document.getElementById("pie"),
degrees = 0;
const Torads = Math.PI/180;
function rotateHand() {
degrees += 45;
sweep.setAttribute("transform", "rotate(" + degrees + " 1.5 1.7)");
if (degrees <= 180) {
fill.setAttribute("d", "M 1.5 1.7 V .4 A 1.4 1.3 0 0 1 " + ellipticalXcoords(Math.cos((degrees-90) * Torads)) + " " + ellipticalYcoords(Math.sin((degrees-90) * Torads)) + " z");
} else {
fill.setAttribute("d", "M 1.5 1.7 V .4 A 1.4 1.3 0 1 1 " + ellipticalXcoords(Math.cos((degrees - 90) * Torads)) + " " + ellipticalYcoords(Math.sin((degrees - 90) * Torads)) + " z");
}
В случае, если вам интересно, где коэффициент '0.01309' пришли - это преобразует угол (в градусах) к длине пути по окружности радиусом 0,75 (2 * π * 0.75/360 ≈ 0.01309) –
gotcha: некоторые браузеры (думаю, это старые сафари iOs) не запускают круг под углом 90 градусов. Решение: конвертировать круг в путь. – Ruskin
@squeamishossifrage Похоже, что это сработает. Теперь я помню, что видел описание маскирующего решения, но я думал, что математика не должна быть слишком сложной. Но я думаю, что это будет хорошо работать. Благодарю. –