给定中心点与轴对齐相交线,计算轴对齐椭圆bounding box(适配Win32 Chord)
轴对齐椭圆Bounding Box计算方法(适配Win32 Chord函数)
核心逻辑
轴对齐椭圆的Bounding Box是与椭圆中心(cx, cy)重合的矩形,左右边界为cx±a、上下边界为cy±b(a是x方向半轴长,b是y方向半轴长)。核心目标就是通过已知条件算出a和b的值。
已知条件对应(结合附图场景)
题目中的轴对齐相交线是椭圆底部的水平弦:
- 弦的两个端点
(x1,y1)、(x2,y2)为水平弦,因此y1=y2,统一记为Y - 弦到椭圆Bounding Box底部边界的距离为
h,而Bounding Box底部的y坐标是cy - b,由此推导得:Y = (cy - b) + h→ 变形为b = cy + h - Y(Y即y1)
计算步骤
- 求y方向半轴长
b
直接代入已知的cy、h和y1计算:
int b = cy + h - y1;
- 求x方向半轴长
a
端点(x1,y1)在椭圆上,满足轴对齐椭圆的标准方程:
((x1 - cx)/a)² + ((y1 - cy)/b)² = 1
将方程变形求解a:
// 先计算根号内的分母部分,确保值为正(否则输入端点不符合椭圆要求) double temp = 1 - pow( (y1 - cy)/(double)b, 2 ); int a = abs(x1 - cx) / sqrt(temp);
- 确定Bounding Box坐标
得到a和b后,Bounding Box的四个边界值直接得出:
- 左边界:
cx - a - 上边界:
cy - b - 右边界:
cx + a - 下边界:
cy + b
适配Win32 Chord函数
Chord函数的参数格式为:
BOOL Chord( HDC hdc, int left, int top, int right, int bottom, int x1, int y1, int x2, int y2 );
将计算出的Bounding Box边界值对应传入left、top、right、bottom,已知的弦端点(x1,y1)、(x2,y2)传入最后四个参数,即可绘制目标椭圆段。
补充(垂直弦场景)
如果相交线是垂直弦(x坐标固定),逻辑同理:
- 先根据弦到Bounding Box左/右边界的距离
h求出a:a = cx + h - X(X是弦的x坐标,即x1=x2=X) - 再代入端点坐标到椭圆方程求解
b。
内容的提问来源于stack exchange,提问作者user2707695
相关产品推荐
相关产品推荐

