如何画椭圆的轴

Posted

技术标签:

【中文标题】如何画椭圆的轴【英文标题】:How draw axis of ellipse 【发布时间】:2015-10-30 09:29:12 【问题描述】:

我正在使用 Opencv 和 C++ 的 fitellipse,我得到了这些值:

/// Find the rotated rectangles and ellipses for each contour
vector<RotatedRect> minRect( contours.size() );
vector<RotatedRect> minEllipse( contours.size() );

for( int i = 0; i < contours.size(); i++ )

   minRect[i] = minAreaRect( Mat(contours[i]) );

   if( contours[i].size() > 5 )
      minEllipse[i] = fitEllipse( Mat(contours[i]) );

   // ...


float xc    = minEllipse[element].center.x;
float yc    = minEllipse[element].center.y;
float a     = minEllipse[element].size.width  / 2;   
float b     = minEllipse[element].size.height / 2;
float theta = minEllipse[element].angle; 

但是有了这些值,我如何绘制椭圆的轴,例如下面的椭圆?

注意:元素是存储在minEllipse 中的椭圆。

【问题讨论】:

您是在问如何根据端点、长度和斜角绘制线段? 我想用椭圆的点心、半径的长度和角度来绘制椭圆的旋转轴,因为图像中的椭圆是旋转的,所以我想在椭圆内绘制新的轴。 看起来您需要几何而不是编程方面的帮助。 我认为仅使用这些值可以绘制该轴,但我搜索并没有找到,并且我使用的所有几何方法都没有给我很好的结果。 如果你不能在纸上画出来,那你就走错地方了。 【参考方案1】:

您可以使用minEllipse[element].points 获取旋转边界矩形的四个角,如here 所述。

那么你只需要计算矩形每一边的两个点的平均值就可以得到坐标轴的端点...

Point2f vertices[4];
minEllipse[element].points(vertices);
line(image, (vertices[0] + vertices[1])/2, (vertices[2] + vertices[3])/2, Scalar(0,255,0));
line(image, (vertices[1] + vertices[2])/2, (vertices[3] + vertices[0])/2, Scalar(0,255,0));

【讨论】:

【参考方案2】:

您可能正在寻找这些公式:

ct = cos(theta)
st = sin(theta)

LongAxix0.x = xc - a*ct
LongAxis0.y = yc - a*st
LongAxis1.x = xc + a*ct
LongAxix1.y = yc + a*st

ShortAxix0.x = xc - b*st
ShortAxix0.y = yc + b*ct
ShortAxis1.x = xc + b*st
ShortAxix2.y = yc - b*ct

【讨论】:

【参考方案3】:

但是有了这些值,我怎样才能画出椭圆的轴呢?

椭圆的轴穿过它的中心:

float xc = minEllipse[element].center.x;
float yc = minEllipse[element].center.y;

轴的起点和终点可以偏离椭圆的宽度和高度定义的中心,即:

// horizontal axis start/ end point

// coordinates
int HxStart = xc - size.width  / 2;
int HyStart = yc;

int HxEnd = xc + size.width  / 2;
int HyEnd = yc;

// points
Point Hstart(HxStart, HyStart);
Point Hend(HxEnd, HyEnd);

// horizontal axis
Line horizontalAxis(Hstart, Hend);

// vertical axis start/ end point
int VxStart = xc;
int VyStart = yc - size.height  / 2;

int VxEnd = xc;
int VyEnd = yc + size.height  / 2;

// ----//----

现在,您可以通过提供的角度theta 围绕椭圆中心rotate 轴(以上为点)。

具备以上条件并知道如何构建一条线,您可以在任意给定角度构建两个轴theta

【讨论】:

以上是关于如何画椭圆的轴的主要内容,如果未能解决你的问题,请参考以下文章

如何用 css 画出一个椭圆

如何用MATHCAD绘制椭圆

PS如何画环形渐变

置信椭圆与R画法

CAD中椭圆弧如何标注尺寸?

如何获取椭圆边框的坐标