如何使给定的新坐标与旧坐标成比例
How to make new given coordinates proportional to old ones?
我有一个对象。它有一些原始的宽度和高度。我给出了新的宽度和高度。如何采用新的给定宽度和高度的对象原始的?(假设我们有一个正方形1000x1000
,并给出了一些期望的最大可能坐标,比如1900x1200
什么算法可以从中产生1200x1200
?或者在其他情况下,我们有1000x1000
原件,并给予400x600
,它应该返回400x400
…)
void resize_coefs(const int & original_w, const int & original_h, int & new_w, int & new_h)
{
double VW = new_w;
double VH = new_h;
double rw = original_w/VW;
double rh = original_h/VH;
if (rw>=rh){
new_h = VH;
new_w = rh*new_w + 2;
}
else
{
new_w = VW;
new_h= rw*new_h;
}
}
这样做:
- 计算宽度的比例因子
- 计算高度的比例因子
- 使用最小的缩放因子来缩放宽度和高度。
示例代码:
void resize_coefs(const int original_w, const int original_h, int & new_w, int & new_h)
{
double scale = std::min(
((double) new_w) / original_w ,
((double) new_h) / original_h );
new_w = std::min( scale * original_w, new_w );
new_h = std::min( scale * original_h, new_h );
}
由于可能存在舍入误差,建议检查new_w
和new_h
在缩放后是否仍在边界内。
编辑:这里有一个版本,使用Kerrek在他的回答中提供的提示,只对整数算术做同样的事情。很难看出它们遵循的是完全相同的逻辑。
void resize_coefs(const int original_w, const int original_h, int & new_w, int & new_h)
{
int num, den;
if (new_w * original_h < new_h * original_w) {
num = new_w;
den = original_w;
} else {
num = new_h;
den = original_h;
}
new_w = original_w * num / den;
new_h = original_h * num / den;
}
计算出原边界和新边界的宽高比。然后比较,并适当地横向或纵向缩放:
const double orig_width, orig_height;
const double max_new_width, max_new_height;
const double orig_ar = orig_width / orig_height;
const double new_ar = max_new_width / max_new_height;
const double scale = new_ar < orig_ar ? max_new_width / orig_width : max_new_height / orig_height;
const double new_height = orig_height * scale;
const double new_width = orig_width * scale;
如果你愿意,你可以完全用整数来做这个。请记住,a/b == c/d
等同于a*d == b*c
(您甚至不必担心分母为零)。
Update:这是我要使用的具体整数函数:
void scale(unsigned int orig_width, unsigned int orig_height,
unsigned int max_new_width, unsigned int max_new_height)
{
const bool scale_width = max_new_width * orig_height < orig_width * max_new_height;
const unsigned int new_height = scale_width ?
orig_height * max_new_width / orig_width :
orig_height * max_new_height / orig_height;
const unsigned int new_width = scale_width ?
orig_width * max_new_width / orig_width :
orig_width * max_new_height / orig_height;
std::cout << "New dims: " << new_width << " x " << new_height << std::endl;
}
相关文章:
- QGraphicsPolygonItem在拖动时未更新QPolygonF坐标
- 在C++中使用GDAL可以将图像的像素坐标转换为lat,long吗
- UE4-如何在给定4个屏幕坐标的情况下缩放纹理或材质
- 将寄存器设计成可由C和C++访问的外设的最佳实践
- 计算缩放多边形的比例,得到给定的多边形面积
- 将数字打印成文字
- 用c++把小数点转换成八进制
- 模板元编程:如何将参数包组合成新的参数包
- OpenGL 和 GLM 矩阵无法正确扩展,总是按比例缩小
- 如何在加密++中将两个源组合成新的源
- 需要将一行代码从C++ Qt翻译成PyQt
- 为什么有时我输入一个整数,程序将第一个输入的数字打印成十进制数?
- OpenGL 4.3 错误地将第 4 个纹理坐标映射到与第 3 个纹理坐标相同的位置
- 将多个 for 循环组合成单个迭代器
- 比较两个节点坐标的最佳方法是什么?
- 在 OpenGL 中将笛卡尔世界坐标转换为球面局部坐标
- SDL2 调整窗口大小后如何缩放鼠标坐标?
- 如何在C++中获取坐标?
- 如何使给定的新坐标与旧坐标成比例
- David Lowe's SIFT -- 关于比例空间和图像坐标的问题(奇怪的偏移问题)