【发布时间】:2013-04-26 15:59:49
【问题描述】:
我正在尝试以给定的边距围绕椭圆绘制贝塞尔曲线:
我想以编程方式实现这一点,所以如果我改变椭圆大小,曲线就会跟随它。
目前我已经做了这个功能:
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;
}
但我不知道如何计算这个方向点值,以便它适用于任何椭圆:
- box.width/15
- box.height/4.5
我已阅读此stackoverflow question 并在我的示例中尝试了相同的方法,但仍然无法找到一个简单的解决方案,它仍然是随机的...
编辑
现在我正在尝试使用椭圆形Arc,结果比使用贝塞尔路径更糟糕:
这是我正在使用的功能。如果我删除边距,它会完全按照我的椭圆...最后问题是我如何才能按照椭圆的边距?
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的?不是泛化数学的问题吗? -
在拥有这两个数字之前,我尝试了很多。这可能是数学概括的问题,不知道......我会用椭圆弧再试一次,让你知道。
-
我用椭圆弧更新了,但是结果还是错了……
标签: svg raphael bezier ellipse elliptic-curve