我已按照this文章中提供的模型显示WPF中的散点图数据。我可以轻松地在视图矩阵中旋转图像,但我需要旋转原始数据点,并将z轴值的最小二乘拟合到z = 0平面。我只需要将数据旋转5-20度,所以我认为我不需要四元数来避免gimble锁定。我尝试了以下方法,并尝试在旋转之前将数据转换为原点,但它没有按预期工作。 RotateX方法似乎有效,但其他两种方法似乎在y轴或z轴上将所有数据压缩在一起。我已经检查了大约10个不同网站的公式,但找不到任何错误,但结果仍然没有意义。
public static Point3D RotateAboutX(Point3D pt1, double aX)
{
double angleX = 3.1415926 * aX / 180;
double x2 = pt1.X;
double y2 = (pt1.Y * Math.Cos(angleX)) - (pt1.Z * Math.Sin(angleX));
double z2 = (pt1.Y * Math.Sin(angleX)) + (pt1.Z * Math.Cos(angleX));
return new Point3D(x2, y2, z2);
}
public static Point3D RotateAboutY(Point3D pt1, double aY)
{
double angleY = 3.1415926 * aY / 180;
double x2 = (pt1.X * Math.Cos(angleY)) - (pt1.Z * Math.Sin(angleY));
double y2 = pt1.Y;
double z2 = (pt1.X * Math.Sin(angleY)) + (pt1.Z * Math.Cos(angleY));
return new Point3D(x2, y2, z2);
}
public static Point3D RotateAboutZ(Point3D pt1, double aZ)
{
double angleZ = 3.1415926 * aZ / 180;
double x2 = (pt1.X * Math.Cos(angleZ)) - (pt1.Y * Math.Sin(angleZ));
double y2 = (pt1.X * Math.Sin(angleZ)) + (pt1.Y * Math.Cos(angleZ));
double z2 = pt1.Z;
return new Point3D(x2, y2, z2);
}
答案 0 :(得分:1)
我发现了自己的错误。错误在上面的RotateAboutY()方法中。正确的方法是这样的......
public static Point3D RotateAboutY(Point3D pt1, double aY)
{
double angleY = 3.1415926 * aY / 180;
double x2 = (pt1.Z * Math.Sin(angleY)) + (pt1.X * Math.Cos(angleY));
double y2 = pt1.Y;
double z2 = (pt1.Z * Math.Cos(angleY)) - (pt1.X * Math.Sin(angleY));
return new Point3D(x2, y2, z2);
}
可以使用正确的公式找到here对此主题的简短处理。在Kirupa.com上有关于此主题的更详细说明,其中还包括正确的公式。