For some reason, the Autodesk.AutoCAD.Geometry.Matrix3d struct does not have any methods to non-uniformly scale the axes. It only provides a Scaling(double scaleAll, Point3d center) method to create a uniform scaleing matrix. So I created a method to get back a non-uniform scaling matrix and use it for point transformations, but something is not right.
public static Matrix3d ScaleMatrix(double xScale, double yScale, double zScale, Point3d origin)
{
return Matrix3d.Identity
.PostMultiplyBy(Matrix3d.Displacement(origin.GetAsVector().Negate()))
.PostMultiplyBy(new Matrix3d(new double[] { xScale, 0.0, 0.0, 0.0,
0.0, yScale, 0.0, 0.0,
0.0, 0.0, zScale, 0.0,
0.0, 0.0, 0.0, 1.0 }))
.PostMultiplyBy(Matrix3d.Displacement(origin.GetAsVector()));
}
public static Matrix3d ScaleMatrix(Scale3d scaling, Point3d origin)
{
return ScaleMatrix(scaling.X, scaling.Y, scaling.Z, origin);
}
public static Point3d Transform(this Point3d point, Point3d displacement, Scale3d scaling, double rotation)
{
Matrix3d transform = Matrix3d.Identity
.PostMultiplyBy(ScaleMatrix(scaling, Point3d.Origin))
.PostMultiplyBy(Matrix3d.Rotation(rotation, Vector3d.ZAxis, Point3d.Origin))
.PostMultiplyBy(Matrix3d.Displacement(displacement.GetAsVector()));
return point.TransformBy(transform);
}
What have I done wrong?