Я пытаюсь нарисовать кривую Безье, окружающую эллипс с заданным полем:
Я хочу добиться этого программно, поэтому, если я изменю размер эллипса, кривая будет следовать за ним.
На данный момент я сделал эту функцию:
function bezierPathTopRounded(ellipse, margin) {
var box = ellipse.paper.getBBox();
var leftX = box.x - margin;
var rightX = box.x + margin + box.width;
var y = box.y + box.height/2 - margin;
var p = "M "+ leftX + ", "+ y
+ " C " //could be relative too
+ ( box.x - margin + (box.width/15) ) + ", " + ( box.y + margin - (box.height/4.5) ) + " "
+ ( box.x + margin + box.width - (box.width/15) ) + ", " + ( box.y + margin - (box.height/4.5) ) + " "
+ rightX +", " + y;
return p;
}
Но я не могу понять, как рассчитать значения точек этого направления, чтобы они работали с любым эллипсом:
- коробка.ширина/15
- коробка.высота/4,5
В этом примере есть скрипка.
Я прочитал этот вопрос stackoverflow и попробовал то же самое на моем примере, но до сих пор не могу найти простое решение, оно остается случайным...
Изменить
Сейчас пробую с эллиптическим A
rc, результат хуже, чем с Путем Безье:
Есть функция, которую я использую. Если я удалю поле, оно будет точно соответствовать моему эллипсу... Наконец, вопрос в том, как я могу следовать эллипсу с полем?
function borderPath(ellipse, margin, flag) {
var flag = flag == undefined ? 1 : 0;
var box = ellipse.paper.getBBox();
var leftX = box.x - margin;
var rightX = box.x + margin + box.width;
var y = box.y + box.height/2;
y += (flag == 1) ? -margin : margin;
var rx = box.width/2 + margin;
var ry = box.height/2;
var p = "M "+ leftX + ", "+ y
+ " A "
+ rx + " " + ry
+ " 0 0 "+ flag +" "
+ rightX +", " + y;
return p;
}
См. обновленную скрипту здесь.
Очень извиняюсь за ужасные цвета, это для примера.
box.width/15
иbox.height/4.5
? Разве это не вопрос обобщения математики? - person Beetroot-Beetroot   schedule 19.04.2013