SVG пончик срез в качестве элемента пути (кольцевой сектор)

Да, конечно, это не ошибка, но я сбит с толку тем, как получить идеальную дугу окружности между точками с помощью кривой B & # xE9; zier.

Мне нужна такая форма:

enter image description here

Поэтому я вычислял четыре угловые точки, подобные этой, из центральной точки, радиуса и угла по следующей формуле: (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(" ")   

Ответы на вопрос(1)

Ваш ответ на вопрос