首先,请参阅:
我有一个算法可以解决给定圆和偏移的对象的高度。
它有点有用,但高度始终是关闭的: 这是公式:
这里是它应该做的草图:
这是应用程序的示例输出:
在公式中,offset = 10,widthRatio为3.这就是(1/10)因为(3 * 3)+ 1 = 10的原因。
问题是,您可以看到蓝色矩形的高度不正确。我将左下方的偏移设置为所需的偏移(在本例中为10),这样您就可以看到左下角是正确的。右上角是错误的,因为从右上角开始,我只需要去10个像素,直到我触摸圆圈。
我用来设置大小和位置的代码是:
void DataWidgetsHandler::resize( int w, int h )
{
int tabSz = getProportions()->getTableSize() * getProportions()->getScale();
int r = tabSz / 2;
agui::Point tabCenter = agui::Point(
w * getProportions()->getTableOffset().getX(),
h * getProportions()->getTableOffset().getY());
float widthRatio = 3.0f;
int offset = 10;
int height = solveHeight(offset,widthRatio,tabCenter.getX(),tabCenter.getY(),r);
int width = height * widthRatio;
int borderMargin = height;
m_frame->setLocation(offset,
h - height - offset);
m_frame->setSize(width,height);
m_borderLayout->setBorderMargins(0,0,borderMargin,borderMargin);
}
我可以断言表格半径和表格中心位置是正确的。
这是我对公式的实现:
int DataWidgetsHandler::solveHeight( int offset, float widthRatio, float h, float k, float r ) const
{
float denom = (widthRatio * widthRatio) + 1.0f;
float rSq = denom * r * r;
float eq = widthRatio * offset - offset - offset + h - (widthRatio * k);
eq *= eq;
return (1.0f / denom) *
((widthRatio * h) + k - offset - (widthRatio * (offset + offset)) - sqrt(rSq - eq) );
}
它使用二次公式来找出高度应该是多少,以便矩形右上角,左下角和左上角之间的距离=偏移。
公式或实施方面有问题吗?问题是高度永远不够长。
由于
答案 0 :(得分:1)
嗯,这是我的解决方案,它看起来与你的solveHeight功能类似。下面可能有一些算术错误,但方法是合理的。
您可以考虑匹配圆点处的坐标 从矩形(P)。
设o_x,o_y为左下角偏移距离,w和h为 矩形的高度,宽度比,dx是所需的 矩形右上角与矩形之间的距离 圆(水平移动),c_x和c_y的坐标 圆的中心,角度θ和圆半径。
标记它是工作的一半!只需记下点P的坐标:
P_x = o_x + w + dx = c_x + r cos(theta)
P_y = o_y + h = c_y + r sin(theta)
我们知道w = w_r * h
。
为了简化算术,我们收集一些常数项,并让X = o_x + dx - c_x
和Y = o_y - c_y
。然后我们有
X + w_r * h = r cos(theta)
Y + h = r sin(theta)
平方和求和给出了h的二次方:
(w_r^2 + 1) * h^2 + 2 (X*w_r + Y) h + (X^2+Y^2-r^2) == 0
如果你将它与你的有效二次方法进行比较,那么只要我们犯了不同的错误:-),你就可以弄清楚发生了什么。
要明确:我们可以使用二次公式设置
来解决这个问题a = (w_r^2 + 1)
b = 2 (X*w_r + Y)
c = (X^2+Y^2-r^2)