You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在缩放外部容器时保持内框中点的相对位置?

问题描述
  • 需求:外部容器任意缩放时,内部矩形保持宽高比居中缩放,同时让绘制在内部矩形里的点相对于该矩形的位置不变。
  • 当前状态:内部矩形的宽高比固定逻辑已实现,但缩放容器时,点无法被绘制到正确位置。
  • 坐标系规则:外部容器左上角为(0,0),内部矩形通过偏移量居中,以最大可能尺寸维持自身宽高比。
  • 尝试的代码如下:
void PointsHandler::updatePoints()
{
    double imgRatio = boxSize.width() / boxSize.height();

    double oldXOffset = (oldContainerSize.width() - oldBoxSize.width()) / 2;
    double oldYOffset = (oldContainerSize.height() - oldBoxSize.height()) / 2;
    double newXOffset = (containerSize.width() - boxSize.width()) / 2;
    double newYOffset = (containerSize.height() - boxSize.height()) / 2;

    for(int i = 0; i < points.size(); i++){
        double newX = ((points[i].x() - oldXOffset) + newXOffset) * boxRatio;
        double newY = ((points[i].y() - oldYOffset) + newYOffset) * boxRatio;

        points.replace(i, Point(newX, newY));
    }
}
解决方案

核心问题是没有正确完成坐标的"相对位置提取-重新映射"流程,正确逻辑应该是先把点转换成内部矩形的相对比例,再用新的矩形参数还原成外部坐标:

void PointsHandler::updatePoints()
{
    // 取出旧内部矩形的尺寸
    double oldBoxW = oldBoxSize.width();
    double oldBoxH = oldBoxSize.height();
    // 计算新内部矩形的偏移和尺寸
    double newXOffset = (containerSize.width() - boxSize.width()) / 2;
    double newYOffset = (containerSize.height() - boxSize.height()) / 2;
    double newBoxW = boxSize.width();
    double newBoxH = boxSize.height();

    for(int i = 0; i < points.size(); i++){
        // 第一步:把点从外部容器坐标转成旧内部矩形的相对位置(0~1范围,基于内部矩形左上角)
        double relX = (points[i].x() - (oldContainerSize.width() - oldBoxW)/2) / oldBoxW;
        double relY = (points[i].y() - (oldContainerSize.height() - oldBoxH)/2) / oldBoxH;

        // 第二步:用相对位置计算新的外部容器坐标
        double newX = newXOffset + relX * newBoxW;
        double newY = newYOffset + relY * newBoxH;

        points.replace(i, Point(newX, newY));
    }

    // 关键:更新旧尺寸,供下次缩放计算使用
    oldContainerSize = containerSize;
    oldBoxSize = boxSize;
}

关键说明

  • 相对位置(relX/relY)是点在内部矩形中的固定比例,不会随容器缩放改变
  • 每次计算完成后必须同步oldContainerSize和oldBoxSize,否则下次缩放会基于错误的旧参数计算
  • 不需要额外引入boxRatio这类变量,直接用新旧矩形的尺寸和偏移完成映射即可

内容的提问来源于stack exchange,提问作者symanoz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 20:40:44