SVG пончик срез в качестве элемента пути (кольцевой сектор)
Да, конечно, это не ошибка, но я сбит с толку тем, как получить идеальную дугу окружности между точками с помощью кривой B & # xE9; zier.
Мне нужна такая форма:
Поэтому я вычислял четыре угловые точки, подобные этой, из центральной точки, радиуса и угла по следующей формуле: (x?, Y?) = (X + d cos & # x3B1;, y + d sin & # x3B1 ;), который в моем coffeescript выглядит примерно так:
x1 = centerPointX+outerRadius*Math.cos(currentAngle)
y1 = centerPointY+outerRadius*Math.sin(currentAngle)
x2 = centerPointX+innerRadius*Math.cos(currentAngle)
y2 = centerPointY+innerRadius*Math.sin(currentAngle)
x3 = centerPointX+outerRadius*Math.cos(currentAngle2)
y3 = centerPointY+outerRadius*Math.sin(currentAngle2)
x4 = centerPointX+innerRadius*Math.cos(currentAngle2)
y4 = centerPointY+innerRadius*Math.sin(currentAngle2)
Как я могу взять имеющуюся у меня информацию и получить элемент пути с идеальными круговыми кривыми?
(PS Я новичок в SVG, и если вы хотите помочь мне с правильным синтаксисом для d =, это было бы круто, но я всегда могу написать это сам. Задача, с которой я хотел бы помочь, действительно больше связана с B & # xE9; Zier.
UPDATE / SOLUTION
Используя ответ ниже, руководство ниже - это функция, которую я фактически использовал:
annularSector = (centerX,centerY,startAngle,endAngle,innerRadius,outerRadius) ->
startAngle = degreesToRadians startAngle+180
endAngle = degreesToRadians endAngle+180
p = [
[ centerX+innerRadius*Math.cos(startAngle), centerY+innerRadius*Math.sin(startAngle) ]
[ centerX+outerRadius*Math.cos(startAngle), centerY+outerRadius*Math.sin(startAngle) ]
[ centerX+outerRadius*Math.cos(endAngle), centerY+outerRadius*Math.sin(endAngle) ]
[ centerX+innerRadius*Math.cos(endAngle), centerY+innerRadius*Math.sin(endAngle) ]
]
angleDiff = endAngle - startAngle
largeArc = (if (angleDiff % (Math.PI * 2)) > Math.PI then 1 else 0)
commands = []
commands.push "M" + p[0].join()
commands.push "L" + p[1].join()
commands.push "A" + [ outerRadius, outerRadius ].join() + " 0 " + largeArc + " 1 " + p[2].join()
commands.push "L" + p[3].join()
commands.push "A" + [ innerRadius, innerRadius ].join() + " 0 " + largeArc + " 0 " + p[0].join()
commands.push "z"
return commands.join(" ")