Math 小角度二维旋转中心最佳逼近公式

Math 小角度二维旋转中心最佳逼近公式,math,geometry,Math,Geometry,这不是家庭作业。我想看看这个问题是经典的平凡问题还是非平凡问题。表面上看起来很简单,我希望这真的是一个简单的问题 有N个点N>=2个 曲面上的坐标Xn,Yn 二维实体。 固体在Pi/180以下有一些小的旋转 再加上N的任意两点之间距离的1%以下的小位移。可能还有一些小变形计算多边形中心O1和O2。用X0,Y0确定O1的直线公式,用XX0,YY0确定O2的直线公式。求线的交点以得到C。计算多边形中心O1和O2。用X0,Y0确定O1的直线公式,用XX0,YY0确定O2的直线公式。求线的交点以得到C。

这不是家庭作业。我想看看这个问题是经典的平凡问题还是非平凡问题。表面上看起来很简单,我希望这真的是一个简单的问题

有N个点N>=2个 曲面上的坐标Xn,Yn 二维实体。 固体在Pi/180以下有一些小的旋转
再加上N的任意两点之间距离的1%以下的小位移。可能还有一些小变形计算多边形中心O1和O2。用X0,Y0确定O1的直线公式,用XX0,YY0确定O2的直线公式。求线的交点以得到C。

计算多边形中心O1和O2。用X0,Y0确定O1的直线公式,用XX0,YY0确定O2的直线公式。求线的交点以得到C。

首先,这个问题很重要

简单的孤独。当多边形类似于圆,且点分布均匀时,效果最佳

遍历N 对于旧数据集和新数据集,查找点N的2个最远点。 现在你有了变换前后的三角形。使用每个三角形中心的顺时针方向将其顶点编号为[0]=原始数据集中的第N个点[1],以及[2]最远的2个点。 计算该三角形的旋转中心和变形x和y。如果变形大于0.001%,则删除此三角形的数据,否则保存。 计算旋转中心的平均值。
正确的解决方案是:定义函数ErrPoint BEFORE[N],Point BEFORE[N],double TFORM[3][3],其中BEFORE-常量旧数据点,BEFORE-常量新数据点,TFORM[3][3]仿射变换矩阵,Err。。。函数,该函数返回标量错误值,当TFORM从之前转换为之后时为0.0,或某些>0.0的错误值。然后使用任何你想找到错误形式最小值的数字数学:例如梯度搜索。

首先,这个问题很重要

简单的孤独。当多边形类似于圆,且点分布均匀时,效果最佳

遍历N 对于旧数据集和新数据集,查找点N的2个最远点。 现在你有了变换前后的三角形。使用每个三角形中心的顺时针方向将其顶点编号为[0]=原始数据集中的第N个点[1],以及[2]最远的2个点。 计算该三角形的旋转中心和变形x和y。如果变形大于0.001%,则删除此三角形的数据,否则保存。 计算旋转中心的平均值。
正确的解决方案是:定义函数ErrPoint BEFORE[N],Point BEFORE[N],double TFORM[3][3],其中BEFORE-常量旧数据点,BEFORE-常量新数据点,TFORM[3][3]仿射变换矩阵,Err。。。函数,该函数返回标量错误值,当TFORM从之前转换为之后时为0.0,或某些>0.0的错误值。然后使用您想要找到错误形式最小值的任何数字数学:例如梯度搜索。

如果我正确理解您的问题,可以通过以下方式解决:

找到四肢最远的点,可能在几个轴上 缩放其中一个以匹配 它们的轮换现在应该是微不足道的
如果我正确理解您的问题,可以通过以下方式解决:

找到四肢最远的点,可能在几个轴上 缩放其中一个以匹配 它们的轮换现在应该是微不足道的
在旋转前后选择主体上的任意两个点P1、P2。查找这些前后点之间的向量。将这些向量与垂直于旋转平面的向量交叉。这将产生两个新向量,初始点形成的线的交点和这两个新向量是旋转的中心

{ 如果P1after=P1before返回P1after 如果P2after=P2before返回P2after 向量V1=P1after-P1before 向量V2=P2after-P2before 法线=Vn//为任意三维方向创建时可能会比较混乱,但如果知道方向,则创建起来很简单,例如,对于x,y平面中的对象,法线=0,0,1

向量VL1=V1 x Vn//向量V1与Vn的叉积 向量VL2=V2 x Vn 返回intersectLinesP1after,VL1,P2after,VL2//旋转中心是两条线的交点 } 相交线点P1,向量V1,点P2,向量V2 { //使用直线的点、方向形式相交两条直线 //返回一个点
}

选择旋转前后身体上的任意两个点P1、P2。查找这些前后点之间的向量。将这些向量与垂直于旋转平面的向量交叉。这将产生两个新向量,初始点形成的线的交点和这两个新向量是旋转的中心

{ 如果P1after=P1before返回P1after 如果P2after=P2before返回P2after 向量V1=P1after-P1before 向量V2=P2after-P2before normal=Vn//可能会很混乱 o为任意三维方向创建,但如果知道方向,则很简单,例如,对于x,y平面中的对象,法线=0,0,1

向量VL1=V1 x Vn//向量V1与Vn的叉积 向量VL2=V2 x Vn 返回intersectLinesP1after,VL1,P2after,VL2//旋转中心是两条线的交点 } 相交线点P1,向量V1,点P2,向量V2 { //使用直线的点、方向形式相交两条直线 //返回一个点 }

有关相对简单的解决方案,请参阅。我说相对简单,因为它仍然使用psuedo逆和SVD奇异值分解。这里有一个例子。另一篇论文:

如果你能处理更硬的东西,试试。

有关相对简单的解决方案,请参阅。我说相对简单,因为它仍然使用psuedo逆和SVD奇异值分解。这里有一个例子。另一篇论文:


如果你能处理更硬的东西,试试。

如果你知道对应关系,即你知道变换前后哪些点是相同的,并且你选择允许缩放,那么问题是一组线性方程。如果你有2个或更多的点,那么你可以找到一个最小平方的解决方案,几乎没有困难

初始点席、易、变换点席、易、你有形式方程

xi' = a xi + b yi + c
yi' =-b xi + a yi + d
你可以把它重新排列成一个线性系统

A x = y 
在哪里

其标准最小二乘形式为

A^T A x = A^T y
有解决办法吗

x = (A^T A)^-1 A^T y
A^T作为A的转置,A^1作为A的逆。通常,你会使用SVD或QR分解来计算解,因为它们应该比逆解更稳定,计算强度更小

一旦你找到了x,变换的四个元素a,b,c和d,那么变换的各个元素由

scale       = sqrt(a*a+b*b)
rotation    = atan2(b,a)
translation = (c,d)/scale
如果不包括缩放,则系统是非线性的,需要迭代解决方案,但不太难解决。如果你不知道对应关系,那么这个问题就更难了,对于像这样的小变换,它是有效的,对于大变换,它是非常困难的

编辑:我忘了包括旋转中心。围绕任意点p的旋转θ是一个序列

translate(p) rotate(theta) translate(-p)
如果你把它全部展开成仿射变换,基本上就是我们上面所说的,那么翻译术语就变成了

dx = px - cos(theta)*px + sin(theta)*py
dy = py - sin(theta)*px - cos(theta)*py
从上面的方程中我们知道θ旋转,dxc和dy。只要稍加修改,我们就可以解决px和py的问题

px = 0.5*(dx - sin(theta)*dy/(1-cos(theta)))
py = 0.5*(dy + sin(theta)*dx/(1-cos(theta)))
你会注意到,如果θ为零,方程是未定义的,因为没有旋转时没有旋转中心


我想这些都是正确的,但我现在没有时间仔细检查。

如果你知道对应关系,即你知道哪些点在变换前后是相同的,并且你选择允许缩放,那么问题是一组线性方程。如果你有2个或更多的点,那么你可以找到一个最小平方的解决方案,几乎没有困难

初始点席、易、变换点席、易、你有形式方程

xi' = a xi + b yi + c
yi' =-b xi + a yi + d
你可以把它重新排列成一个线性系统

A x = y 
在哪里

其标准最小二乘形式为

A^T A x = A^T y
有解决办法吗

x = (A^T A)^-1 A^T y
A^T作为A的转置,A^1作为A的逆。通常,你会使用SVD或QR分解来计算解,因为它们应该比逆解更稳定,计算强度更小

一旦你找到了x,变换的四个元素a,b,c和d,那么变换的各个元素由

scale       = sqrt(a*a+b*b)
rotation    = atan2(b,a)
translation = (c,d)/scale
如果不包括缩放,则系统是非线性的,需要迭代解决方案,但不太难解决。如果你不知道对应关系,那么这个问题就更难了,对于像这样的小变换,它是有效的,对于大变换,它是非常困难的

编辑:我忘了包括旋转中心。围绕任意点p的旋转θ是一个序列

translate(p) rotate(theta) translate(-p)
如果你把它全部展开成仿射变换,基本上就是我们上面所说的,那么翻译术语就变成了

dx = px - cos(theta)*px + sin(theta)*py
dy = py - sin(theta)*px - cos(theta)*py
从上面的方程中我们知道θ旋转,dxc和dy。只要稍加修改,我们就可以解决px和py的问题

px = 0.5*(dx - sin(theta)*dy/(1-cos(theta)))
py = 0.5*(dy + sin(theta)*dx/(1-cos(theta)))
你会注意到,如果θ为零,方程是未定义的,因为没有旋转时没有旋转中心


我想这些都是正确的,但我现在没有时间再检查一遍。

查找卡布希算法。它是一种通用算法,用于使用N个已知对创建旋转矩阵。卡布希创建它是为了帮助消除立体照片的噪声。将图片a中的某个特征旋转到图片B,如果该特征不在目标位置,则该特征为噪波。

查找Kabsch算法。它是一种通用算法,用于使用N个已知对创建旋转矩阵。卡布希c 对其进行重新处理,以帮助消除立体照片的噪声。将图片a中的某个特征旋转到图片B,如果该特征不在目标位置,则该特征为噪波。

谢谢你,但是。2个中心只需额外的N+1分。因此,在旋转/移位/变形后,将出现N+1条线,而不是N条线。好啊那么哪条线的交点是C?你能给出完整的数学表达式吗?谢谢,但是。2个中心只需额外的N+1分。因此,在旋转/移位/变形后,将出现N+1条线,而不是N条线。好啊那么哪条线的交点是C?你能给出完整的数学表达式吗?这看起来像是“图像矫正”吗?我想你需要找到一个最小二乘法来拟合从一组点到另一组点的4x4变换。然后你可以分析一个4x4变换矩阵来得到你想要的。这对我来说像是“图像校正”?我想你需要找到一个最小二乘法来拟合从一组点到另一组点的4x4变换。然后,您可以查看分析单个4x4变换矩阵以获得所需的结果。