线圈算法不能按预期工作

时间:2012-02-03 15:04:54

标签: c++ algorithm math

首先,请参阅:

https://math.stackexchange.com/questions/105180/positioning-a-widget-involving-intersection-of-line-and-a-circle

我有一个算法可以解决给定圆和偏移的对象的高度。

它有点有用,但高度始终是关闭的: 这是公式: enter image description here

这里是它应该做的草图: enter image description here

这是应用程序的示例输出: enter image description here

在公式中,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) );


}

它使用二次公式来找出高度应该是多少,以便矩形右上角,左下角和左上角之间的距离=偏移。

公式或实施方面有问题吗?问题是高度永远不够长。

由于

1 个答案:

答案 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_xY = 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)