This graph will help you for a long time. I tried to figure out how to draw the arcs, so that you decide (if it comes out, throw off what you compare), closer to an hour I will throw my decision with code
function line(o){ var X = ox||0, //позиция центра по XY = oy||0, //позиция центра по Y SP = o.sp||0, // 1 точка дуги (в пи) EP = o.ep||2.0, // 2 точка дуги (в пи) R = or||10, // радиус S = os||10, //количество точек в дуге W = (ow)? (ow<=R*2)?ow:R*2 : 10; //ширина W = [R-(W/2),R+(W/2)];// выравниваем ширину по центру EP = (EP-SP <= 6.28)?EP:EP-(EP-SP-6.28); // определяем длину дуги и не даем ей быть больше чем 2пи P = EP-SP; P = (Math.round(P * 100)/100); //функция для уменьшения нулей function mr(Nn){ return (Math.round(Nn * 100)/100) } var linP = 'M'+(Math.cos(SP)*W[0]+X)+','+(Math.sin(SP)*W[0]+Y); //перемещение курсора в точку начала полоски linP += ((P == 6.28)?" M":" L")+mr((Math.cos(SP)*W[0]+X))+','+mr((Math.sin(SP)*W[0]+Y)); linP += ((P == 6.28)?" M":" L")+mr((Math.cos(SP)*W[1]+X))+','+mr((Math.sin(SP)*W[1]+Y)); //рисование первой закрывающей линии,если круг полный перемещение курсора for(i=1;i<S;i++){ var Vect = (i*(P)/(2))/(S/2)+SP; linP += ' L'+mr((Math.cos(Vect)*W[1]+X))+','+mr((Math.sin(Vect)*W[1]+Y)); } linP += ((P == 6.28)?"z":"") //рисование ДУГИ если круг полный замыкаем линию. //тоже самое только с нижней дугой и 2 закрывающей линией \/ linP += ((P == 6.28)?" M":" L")+mr((Math.cos(EP)*W[1]+X))+','+mr((Math.sin(EP)*W[1]+Y)); linP += ((P == 6.28)?" M":" L")+mr((Math.cos(EP)*W[0]+X))+','+mr((Math.sin(EP)*W[0]+Y)); for(i=S;i>0;i--){ var Vect = (i*(P)/(2))/(S/2)+SP; linP += ' L'+mr((Math.cos(Vect)*W[0]+X))+','+mr((Math.sin(Vect)*W[0]+Y)); } linP += "z" return linP //на выходе кординаты точек правдо тут еще вписаны буквы для svg }