因此,我的问题涉及到当外部容器框缩放到任意大小时,试图将绘制到矩形中的点保持在矩形的相同位置。当包含点的矩形在外部框的中心增长和收缩时,它将保持其纵横比。
我可以保持内框的长宽比不变,但是在缩放外框时,在正确的位置绘制点时遇到了问题。
我希望无论外部框如何缩放,点都保持在图片的同一位置。坐标系将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));
}
}
1条答案
按热度按时间2vuwiymt1#
请求的变换仅为平移和缩放。
若要保留内部框的原始纵横比,x轴和y轴的缩放因子必须相同。若要选择应用哪个缩放因子,用户应将新外部框的宽度和高度之间的比率与旧内部框的纵横比进行比较。如果纵横比更小,则缩放应为新宽度和旧宽度之间的比率,否则应为高度之间的比率。
要遵循正确的变换顺序,您需要 * 首先 * 应用点的平移,以使内框的旧中心与轴的原点重合(显然是外盒的左上角),* 然后 * 缩放这些点,* 最后 * 平移回外盒的新中心。这不是张贴的代码试图做的事情,因为比额表似乎是最后适用的。