如何绘制包含各种长度文本的最小椭圆
How to draw minimum ellipse that encloses the text of various lengths
请看下图。
并且请用阴影矩形的坐标来解释它。
如果我有阴影矩形的坐标,整个组的 center_x 和 center_y,我如何找到椭圆的 xradius 和 yradius 来绘制最后显示的椭圆?
所以你想要的可能是集合上的最小体积椭圆体。您的集合由文本框决定,文本框本身完全由每个框的 4 个顶点决定。以 x1 为中心的椭圆可以由中心向量 mu 和 sym pos.def 形状矩阵 A as
确定
Ell(mu,A) = {x 使得 (x-mu)'A(x-mu)<=1}
所以最小体积问题可以表示为
min -log(Det(A))
s.t. (v_i-mu)'*A*(v_i-mu)<=1 }
其中 (v_i[0],v_i1) 是点的平面坐标(框的角)。
有一种方法可以将其嵌入到更高的维度中以摆脱 mu
min -log(Det(B))
s.t. ([v_i,1])'*B*(v_i-mu)<=1 }
而且这是一个凸问题,有多种算法可以解决,这里是基于椭球法的一种:
我不知道这是否是理想的解决方案。但这似乎对我有用。
因为我的文字总是居中对齐。
- 我从适合图 2 中绘制的矩形内部的椭圆开始。(由 xradius 和 yradius = 矩形的半宽和半高组成)。
- 我遍历文本框并为每个文本框 (a) 找到一个角
使用这里找到的这个公式
radius length of ellipse at any angle 其中 a 和 b 只是我的大矩形的一半宽度和一半高度,中心只是当前椭圆的中心,theta 是从中心到文本框角的角度。我称之为椭圆半径。然后 (b) 我找到从中心到角的长度,称之为 hyp(Hypotenuse 的缩写) (c) 用 hyp 除以 ellipseRadius 得到一个因子。这是我必须将我的 xradius 和 yradius 乘以的因素(称为因素)以包括保持与我开始的形状相同的纵横比的角。但我还没有乘以它。
(d) 我只是不断循环并寻找最大因子(称之为 maxFactor)。
- 当我完成循环后,我设置我的 xradius = xradius * maxFactor 和 yradius = yradius * maxFactor
- 使用步骤 3 中新设置的 xradius 和 yradius 绘制椭圆。
就是这样。
这是它生成的示例(黑色标签与之前的浅绿色标签相比):
正如您所看到的,黑色标签围绕着文本,但没有像绿色标签那样过多 space 。这就是我想要实现的。
请看下图。
并且请用阴影矩形的坐标来解释它。
如果我有阴影矩形的坐标,整个组的 center_x 和 center_y,我如何找到椭圆的 xradius 和 yradius 来绘制最后显示的椭圆?
所以你想要的可能是集合上的最小体积椭圆体。您的集合由文本框决定,文本框本身完全由每个框的 4 个顶点决定。以 x1 为中心的椭圆可以由中心向量 mu 和 sym pos.def 形状矩阵 A as
确定Ell(mu,A) = {x 使得 (x-mu)'A(x-mu)<=1} 所以最小体积问题可以表示为
min -log(Det(A))
s.t. (v_i-mu)'*A*(v_i-mu)<=1 }
其中 (v_i[0],v_i1) 是点的平面坐标(框的角)。 有一种方法可以将其嵌入到更高的维度中以摆脱 mu
min -log(Det(B))
s.t. ([v_i,1])'*B*(v_i-mu)<=1 }
而且这是一个凸问题,有多种算法可以解决,这里是基于椭球法的一种:
我不知道这是否是理想的解决方案。但这似乎对我有用。 因为我的文字总是居中对齐。
- 我从适合图 2 中绘制的矩形内部的椭圆开始。(由 xradius 和 yradius = 矩形的半宽和半高组成)。
- 我遍历文本框并为每个文本框 (a) 找到一个角 使用这里找到的这个公式 radius length of ellipse at any angle 其中 a 和 b 只是我的大矩形的一半宽度和一半高度,中心只是当前椭圆的中心,theta 是从中心到文本框角的角度。我称之为椭圆半径。然后 (b) 我找到从中心到角的长度,称之为 hyp(Hypotenuse 的缩写) (c) 用 hyp 除以 ellipseRadius 得到一个因子。这是我必须将我的 xradius 和 yradius 乘以的因素(称为因素)以包括保持与我开始的形状相同的纵横比的角。但我还没有乘以它。 (d) 我只是不断循环并寻找最大因子(称之为 maxFactor)。
- 当我完成循环后,我设置我的 xradius = xradius * maxFactor 和 yradius = yradius * maxFactor
- 使用步骤 3 中新设置的 xradius 和 yradius 绘制椭圆。 就是这样。
这是它生成的示例(黑色标签与之前的浅绿色标签相比): 正如您所看到的,黑色标签围绕着文本,但没有像绿色标签那样过多 space 。这就是我想要实现的。