围绕平均点C++点的排列均匀缩放
问题描述:
我所试图做的事:围绕平均点C++点的排列均匀缩放
1.规模均匀地围绕一个点一个点的数组。 2.一个点必须是一组点的平均点。
下面的代码,似乎工作,但我不知道这是否是这样做的正确方法。
我知道,均匀缩放只需通过一些值乘以分,但这结垢0,0,0点,怎么办呢各地意思呢?
代码可以通过以下步骤进行细分:
- 获得积分的阵列的平均点,通过总结所有的位置,并通过多个点的划分。
- 比例是缩放值
- 然后我做矢量减法得到一个矢量指向点到平均点。
- 我正常化该矢量(I得到单位矢量)
- 然后,添加其归一化的向量到当前点乘以(1 - 比)* 0.5
这最后一点第五点从检查总来完全值的长度。我
所有的例子上来之前,使用矩阵数学,我真的不能够读出矩阵运算。
是否正确一致换算方法,如果你能指出什么我做错了它不是?
//Get center of a curve
//That is average of all points
MatMxN curveCenter = MatMxN::Zero(2, 1); //This is just 1 vector/point with x and y coordinates
for (int i = 0; i < n; i++)
curveCenter += points.col(i);
curveCenter /= n;
//Scaling value
float ratio = 1.3;
//Get vector pointing to center and move by ratio
for (int i = 0; i < n; i++) {
MatMxN vector = curveCenter - points.col(i);
MatMxN unit = vector.normalized();
points.col(i) += unit*(1 - ratio)*0.5; //points.col(i) this is point in array
}
答
为了扩大使用特定的中心点点(除),执行以下步骤:从点
- 。减去中心通过缩放因子
vector *= ratio
- 乘法矢量
- 添加中心缩放矢量以获得新的点
points.col(i) = vector + curveCenter
MatMxN vector = points.col(i) - curveCenter;
这种方法可以解决远程类似于你的公式。让我们称之为中心C
,扩大规模P0
点,缩放点P1
和缩放因子s
。在上述3个步骤可被写为:
v0 = P0 - C
v1 = s * v0
P1 = v1 + C
=>
P1 = s * P0 + C * (1 - s)
现在我们定义P1 = P0 + x
一些x
:
P0 + x = s * P0 + C * (1 - s)
=>
x = s * P0 + C * (1 - s) - P0
= C * (1 - s) - P0 * (1 - s)
= (C - P0) * (1 - s)
所以你PDATE可以写成如下而是采用提到的3个步骤:
MatMxN vector = curveCenter - points.col(i);
points.col(i) += vector * (1 - ratio);
不过,我喜欢写在反向substractions,因为它是更接近原始的步骤,更容易理解的直觉:
MatMxN vector = points.col(i) - curveCenter;
points.col(i) += vector * (ratio - 1);
我不知道你在哪里找到的规范和*0.5
想法。
均匀缩放空间中的点是一个半线性变换。您只需要将相同比例因子的空间点的所有分量相乘即可。如果您还想将参考坐标系的原点居中在点云云的质心中,则沿坐标平均。这是因为半线性缩放的矢量度量(模数为例)后改变(比例因子):'points.col(I)* = ratio'是你所需要的。 –
我认为你需要定义哪些点将成为缩放的中心。边框的中心?质量中心?边界框的左下角?其中一点? – Galik
您的描述不清楚,所以没有人有工作了,如果你的方法实现的任何帮助。第2点:什么比例?你打算扩展什么?第3点:你在减去什么媒介? “价值的总长度”是什么意思?一般来说,统一缩放需要选择某种中心并相对于其调整其他点。你的描述并没有向我传达任何这样的信息。 – Peter