2025-03-26 SetTransformMatrix矩阵接口使用

引用别的链接学习矩阵变换
计算机图形学一:变换矩阵-Transformation Matrices-CSDN博客

矩阵参数
m_nErr = EzdKernel.E3_MarkerSetTransformMatrix(m_idMarker, ResultMatrix.Values);
 if (m_nErr != EzdKernel.E3_ERR.SUCCESS)
 {
        return false;
  }
      return true;


public class Matrix2d
{
    public const int TRANSFORM_NO = 0;

    public const int TRANSFORM_MOVE = 1;

    public const int TRANSFORM_SCALE = 2;

    public const int TRANSFORM_MIRROR = 4;

    public const int TRANSFORM_ROTATE = 8;

    public const int TRANSFORM_SHEAR = 16;

    public const int TRANSFORM_MIX = 255;

    private double x00;

    private double x01;

    private double x02;

    private double x10;

    private double x11;

    private double x12;

    private double x20;

    private double x21;

    private double x22;

    public double[] Values => new double[9] { x00, x01, x02, x10, x11, x12, x20, x21, x22 };




    // 参数先列后行
    public static Matrix2d Identity()
    {
        Matrix2d matrix2d = new Matrix2d();
        matrix2d.x00 = 1.0;
        matrix2d.x01 = 0.0;
        matrix2d.x02 = 0.0;
        matrix2d.x10 = 0.0;
        matrix2d.x11 = 1.0;
        matrix2d.x12 = 0.0;
        matrix2d.x20 = 0.0;
        matrix2d.x21 = 0.0;
        matrix2d.x22 = 1.0;
        return matrix2d;
    }

    public static Matrix2d Move(double fx, double fy)
    {
        Matrix2d matrix2d = Identity();
        matrix2d.x20 = fx;
        matrix2d.x21 = fy;
        return matrix2d;
    }

    public static Matrix2d Scale(double fScaleX, double fScaleY)
    {
        Matrix2d matrix2d = Identity();
        matrix2d.x00 = fScaleX;
        matrix2d.x11 = fScaleY;
        return matrix2d;
    }

    public static Matrix2d Scale(double ptX, double ptY, double fScaleX, double fScaleY)
    {
        Matrix2d matrix2d = Identity();
        matrix2d.x00 = fScaleX;
        matrix2d.x11 = fScaleY;
        matrix2d.x20 = (1.0 - fScaleX) * ptX;
        matrix2d.x21 = (1.0 - fScaleY) * ptY;
        return matrix2d;
    }

    public static Matrix2d Rotate(double ptX, double ptY, double fRadAngle)
    {
        Matrix2d matrix2d = Identity();
        double num = Math.Cos(fRadAngle);
        double num2 = Math.Sin(fRadAngle);
        matrix2d.x00 = num;
        matrix2d.x01 = num2;
        matrix2d.x10 = 0.0 - num2;
        matrix2d.x11 = num;
        matrix2d.x20 = (1.0 - num) * ptX + ptY * num2;
        matrix2d.x21 = (1.0 - num) * ptY - ptX * num2;
        return matrix2d;
    }

    public static Matrix2d MirrorX()
    {
        Matrix2d matrix2d = Identity();
        matrix2d.x11 = -1.0;
        return matrix2d;
    }

    public static Matrix2d MirrorY()
    {
        Matrix2d matrix2d = Identity();
        matrix2d.x00 = -1.0;
        return matrix2d;
    }

    public static Matrix2d ShearX(double xShear, double yShear, double fRadAngle)
    {
        Matrix2d matrix2d = Move(0.0 - xShear, 0.0 - yShear);
        Matrix2d matrix2d2 = Identity();
        matrix2d2.x10 = Math.Tan(fRadAngle);
        Matrix2d matrix2d3 = Move(xShear, yShear);
        return matrix2d * matrix2d2 * matrix2d3;
    }

    public static Matrix2d ShearY(double xShear, double yShear, double fRadAngle)
    {
        Matrix2d matrix2d = Move(0.0 - xShear, 0.0 - yShear);
        Matrix2d matrix2d2 = Identity();
        matrix2d2.x01 = Math.Tan(fRadAngle);
        Matrix2d matrix2d3 = Move(xShear, yShear);
        return matrix2d * matrix2d2 * matrix2d3;
    }

    public static Matrix2d Mirror(double x1, double y1, double x2, double y2)
    {
        Matrix2d matrix2d = Identity();
        double num = x2 - x1;
        double num2 = y2 - y1;
        double num3 = Math.Sqrt(num * num + num2 * num2);
        if (num3 > 1E-12)
        {
            num /= num3;
            num2 /= num3;
        }

        matrix2d.x00 = 1.0 - 2.0 * num2 * num2;
        matrix2d.x01 = 2.0 * num * num2;
        matrix2d.x10 = 2.0 * num * num2;
        matrix2d.x11 = 1.0 - 2.0 * num * num;
        matrix2d.x20 = 2.0 * x1 * num2 * num2 - 2.0 * num * num2 * y1;
        matrix2d.x21 = 2.0 * y1 * num * num - 2.0 * num * num2 * x1;
        return matrix2d;
    }

    public static Matrix2d operator *(Matrix2d A, Matrix2d B)
    {
        Matrix2d matrix2d = new Matrix2d();
        matrix2d.x00 = A.x00 * B.x00;
        matrix2d.x00 += A.x01 * B.x10;
        matrix2d.x00 += A.x02 * B.x20;
        matrix2d.x01 = A.x00 * B.x01;
        matrix2d.x01 += A.x01 * B.x11;
        matrix2d.x01 += A.x02 * B.x21;
        matrix2d.x02 = A.x00 * B.x02;
        matrix2d.x02 += A.x01 * B.x12;
        matrix2d.x02 += A.x02 * B.x22;
        matrix2d.x10 = A.x10 * B.x00;
        matrix2d.x10 += A.x11 * B.x10;
        matrix2d.x10 += A.x12 * B.x20;
        matrix2d.x11 = A.x10 * B.x01;
        matrix2d.x11 += A.x11 * B.x11;
        matrix2d.x11 += A.x12 * B.x21;
        matrix2d.x12 = A.x10 * B.x02;
        matrix2d.x12 += A.x11 * B.x12;
        matrix2d.x12 += A.x12 * B.x22;
        matrix2d.x20 = A.x20 * B.x00;
        matrix2d.x20 += A.x21 * B.x10;
        matrix2d.x20 += A.x22 * B.x20;
        matrix2d.x21 = A.x20 * B.x01;
        matrix2d.x21 += A.x21 * B.x11;
        matrix2d.x21 += A.x22 * B.x21;
        matrix2d.x22 = A.x20 * B.x02;
        matrix2d.x22 += A.x21 * B.x12;
        matrix2d.x22 += A.x22 * B.x22;
        return matrix2d;
    }

    public static Pt2d operator *(Matrix2d M, Pt2d pt)
    {
        return new Pt2d(pt.X * M.x00 + pt.Y * M.x10 + M.x20, pt.X * M.x01 + pt.Y * M.x11 + M.x21);
    }

    public static Pt2d operator *(Pt2d pt, Matrix2d M)
    {
        return new Pt2d(pt.X * M.x00 + pt.Y * M.x10 + M.x20, pt.X * M.x01 + pt.Y * M.x11 + M.x21);
    }

    public static Matrix2d TwoPointMap(Pt2d ptOld1, Pt2d ptOld2, Pt2d ptNew1, Pt2d ptNew2)
    {
        double num = ptOld1.Dist(ptOld2);
        double num2 = ptNew1.Dist(ptNew2);
        double num3 = num2 / num;
        double angle = ptOld2.GetAngle(ptOld1);
        double angle2 = ptNew2.GetAngle(ptNew1);
        Matrix2d matrix2d = Rotate(ptOld1.X, ptOld1.Y, 0.0 - angle);
        Matrix2d matrix2d2 = Scale(ptOld1.X, ptOld1.Y, num3, num3);
        Matrix2d matrix2d3 = Rotate(ptOld1.X, ptOld1.Y, angle2);
        Matrix2d matrix2d4 = Move(ptNew1.X - ptOld1.X, ptNew1.Y - ptOld1.Y);
        return matrix2d * matrix2d2 * matrix2d3 * matrix2d4;
    }

    public static Matrix2d ThreePointMap(Pt2d ptOld1, Pt2d ptOld2, Pt2d ptOld3, Pt2d ptNew1, Pt2d ptNew2, Pt2d ptNew3)
    {
        int nO = 0;
        int nX = 1;
        int nY = 2;
        Pt2d[] array = new Pt2d[3];
        Pt2d[] array2 = new Pt2d[3];
        if (JMath.Get3PtXOYCoor(ptOld1, ptOld2, ptOld3, 0.001, ref nO, ref nX, ref nY))
        {
            array[0] = ptOld1;
            array[1] = ptOld2;
            array[2] = ptOld3;
            array2[0] = ptNew1;
            array2[1] = ptNew2;
            array2[2] = ptNew3;
        }
        else
        {
            Pt2d ptGet = default(Pt2d);
            Pt2d ptGet2 = default(Pt2d);
            JMath.GetProjectPtToLine(ptOld1, ptOld2, ptOld3, ref ptGet);
            JMath.GetProjectPtToLine(ptNew1, ptNew2, ptNew3, ref ptGet2);
            array[0] = ptOld1;
            array[1] = ptGet;
            array[2] = ptOld3;
            array2[0] = ptNew1;
            array2[1] = ptGet2;
            array2[2] = ptNew3;
        }

        double num = array[nX].Dist(array[nO]);
        double num2 = array2[nX].Dist(array2[nO]);
        double num3 = array[nY].Dist(array[nO]);
        double num4 = array2[nY].Dist(array2[nO]);
        double fScaleX = num2 / num;
        double fScaleY = num4 / num3;
        double angle = array[nX].GetAngle(array[nO]);
        double angle2 = array2[nX].GetAngle(array2[nO]);
        Matrix2d matrix2d = Rotate(array[nO].X, array[nO].Y, 0.0 - angle);
        Matrix2d matrix2d2 = Scale(array[nO].X, array[nO].Y, fScaleX, fScaleY);
        Matrix2d matrix2d3 = Rotate(array[nO].X, array[nO].Y, angle2);
        Matrix2d matrix2d4 = Move(array2[nO].X - array[nO].X, array2[nO].Y - array[nO].Y);
        return matrix2d * matrix2d2 * matrix2d3 * matrix2d4;
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容