首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >需要浮点精度,GUI gui使用int

需要浮点精度,GUI gui使用int
EN

Stack Overflow用户
提问于 2012-04-06 12:02:22
回答 1查看 163关注 0票数 0

我有一个流程图。在它里面我有大约900张表。每张桌子都堆叠在一起。我有一个滑块,可以调整它们的大小,从而使流布局也可以调整大小。

问题是,这些表应该线性调整大小。它们的基本尺寸是200x200。因此,当scale =1.0时,表的w和h为200。

我每次都会调整一个固定的大小,让它们每次都变大4%。这意味着我希望它们每次能增长8个像素。发生的情况是,每调整几次大小,表就会增加9个像素。我到处都用替身。我已经尝试了四舍五入,地板和天花板,但问题仍然存在。我该怎么做才能使它们始终以正确的数量增长?

代码语言:javascript
复制
void LobbyTableManager::changeTableScale( double scale )
    {
        setTableScale(scale);
    }

    void LobbyTableManager::setTableScale( double scale )
    {
        scale += 0.3;
        scale *= 2.0;

        std::cout << scale << std::endl;
        agui::Gui* gotGui = getGui();
        float scrollRel = m_vScroll->getRelativeValue();
        setScale(scale);
        rescaleTables();
        resizeFlow();
    ...



    double LobbyTableManager::getTableScale() const
        {
            return (getInnerWidth() / 700.0) * getScale();
        }

    void LobbyFilterManager::valueChanged( agui::Slider* source,int val )
    {
        if(source == m_magnifySlider)
        {

            DISPATCH_LOBBY_EVENT
            {
                (*it)->changeTableScale((double)val / source->getRange());
            }
        }
    }

void LobbyTableManager::renderBG( GraphicsContext* g, agui::Rectangle& absRect, agui::Rectangle& childRect )
    {
        int cx, cy, cw, ch;
        g->getClippingRect(cx,cy,cw,ch);
        g->setClippingRect(absRect.getX(),absRect.getY(),absRect.getWidth(),absRect.getHeight());
        float scale = 0.35f;
        int w = m_bgSprite->getWidth() * getTableScale() * scale;
        int h = m_bgSprite->getHeight() * getTableScale() * scale;

        int numX = ceil(absRect.getWidth() / (float)w) + 2;
        int numY = ceil(absRect.getHeight() / (float)h) + 2;

        float offsetX = m_activeTables[0]->getLocation().getX() - w;
        float offsetY = m_activeTables[0]->getLocation().getY() - h;
        int startY = childRect.getY() + 1;
        if(moo)
        {
            std::cout << "TS: " << getTableScale() << " Scr: " << m_vScroll->getValue() << " LOC: " << childRect.getY() << " H: " << h << std::endl; 
        }
    if(moo)
    {
        std::cout << "S=" << startY << ",";
    }
        int numAttempts = 0;
        while(startY + h < absRect.getY() && numAttempts < 1000)
        {
            startY += h;
            if(moo)
            {
                std::cout << startY << ",";
            }

            numAttempts++;
        }


        if(moo)
        {
            std::cout << "\n";
            moo = false;
        }
        g->holdDrawing();
        for(int i = 0; i < numX; ++i)
        {
            for(int j = 0; j < numY; ++j)
            {
                g->drawScaledSprite(m_bgSprite,0,0,m_bgSprite->getWidth(),m_bgSprite->getHeight(),
                    absRect.getX() + (i * w) + (offsetX),absRect.getY() + (j * h) + startY,w,h,0);
            }
        }
        g->unholdDrawing();
        g->setClippingRect(cx,cy,cw,ch);
    }

        void LobbyTable::rescale( double scale )
        {
            setScale(scale);
            float os = getObjectScale();
            double x = m_baseHeight * os;
            if((int)(x + 0.5) > (int)x)
            {
                x++;
            }
            int oldH = getHeight();
            setSize(m_baseWidth * os, floor(x));
    ...

我添加了相关代码。滑块发送一个更改后的值,再乘以得到4%的增量(如果滑块移动了2个值,则为8%,等等)然后用这个重新调整表的比例。

前3次是当表大小增加9时,第4次增加了8px。但比例因子每次增加0.04。

为什么第四次不一致?

模式似乎是8,8,8,9,9,9,8,8,9,9,9...

它增加了1个像素,增加了几个像素,然后减少了110个,增加了1个,等等,这就是我的问题……

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-04-06 12:35:17

我仍然没有看到“添加4%”的代码(无论如何,在我可以理解的形式中),但从您的描述中,我认为我看到了问题:两次添加4%并不等于添加8%。它增加了8.16% (1.04 * 1.04 == 1.0816)。再这样做几次,你就会开始得到9个像素的跳跃。这样做更多的次数,你的跳跃将变得更大(当大小达到400x400时,它们将是16像素的跳跃)。这就是我想要的缩放方式。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10038981

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档