如何使用贝塞尔曲线近似椭圆来填充给定的矩形?

时间:2011-04-11 22:00:37

标签: java android math

我尝试了下面的代码,如果矩形的宽度与其高度相同,则会得到一个很好的近似圆;但它并没有画出一个巨大的椭圆形,“角落”非常尖锐。有什么建议吗?

float width = rect.width();
float height = rect.height();
float centerX = rect.width() / 2;
float centerY = rect.height() / 2;

float diameter = Math.min(width, height); 
float length = (float) (0.5522847498 * diameter/2);


path.moveTo(0, centerY);
path.cubicTo(0, centerY - length, 0, centerX - length, 0, centerX, 0);
path.cubicTo(centerX + length, 0, width, centerY - length, height, centerY);
path.cubicTo(width, centerY + length, centerX + length, height, centerX, height);
path.cubicTo(centerX - length, height, 0, centerY + length, 0, centerY);

2 个答案:

答案 0 :(得分:1)

您应该根据它所在的轴来缩放length,以便从每个圆弧端点到相邻控制点的距离是(不固定但是)与您平行移动的轴的固定部分那一点。

答案 1 :(得分:0)

如果它是一个真正的矩形,有直角,那么应该很容易。椭圆的长轴和短轴等于矩形边长,椭圆的中心位于矩形对角线的交点处。

我不知道如何表达它,因为Bezier样条曲线偏离我的头顶,但是椭圆的经典方程应该很容易编写,只要你先转换到适当的坐标系(例如x -axis沿矩形/椭圆的长轴,y轴沿矩形/椭圆的短轴)。