{"id":216,"date":"2024-03-26T21:44:00","date_gmt":"2024-03-26T13:44:00","guid":{"rendered":"https:\/\/blog.bexonbai.com\/?p=216"},"modified":"2026-03-02T21:54:16","modified_gmt":"2026-03-02T13:54:16","slug":"2d-planar-coordinate-system-conversion","status":"publish","type":"post","link":"https:\/\/blog.bexonbai.com\/?p=216","title":{"rendered":"2D planar coordinate system conversion"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">The 2D planar coordinate system conversion I use at work, the demo code is implemented in Rust, and other code should be implemented in roughly the same way. \ud83e\udd14<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If you are using the standard right-handed Cartesian coordinate system you may need to transform the y-axis appropriately.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"rotation\">Rotation<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"clockwise\">clockwise<\/h3>\n\n\n\n<div class=\"wp-block-math\"><math display=\"block\"><semantics><mrow><mi>A<\/mi><mo>=<\/mo><mtable displaystyle=\"true\" class=\"tml-jot\"><mtr><mtd style=\"padding-left:0em;padding-right:0em;\"><mrow><mo fence=\"true\" form=\"prefix\">[<\/mo><mtable columnalign=\"center center center\"><mtr><mtd style=\"padding-left:0em;\"><mrow><mi>c<\/mi><mi>o<\/mi><mi>s<\/mi><mo form=\"prefix\" stretchy=\"false\">(<\/mo><mi>\u03b8<\/mi><mo form=\"postfix\" stretchy=\"false\">)<\/mo><\/mrow><\/mtd><mtd><mrow><mi>s<\/mi><mi>i<\/mi><mi>n<\/mi><mo form=\"prefix\" stretchy=\"false\">(<\/mo><mi>\u03b8<\/mi><mo form=\"postfix\" stretchy=\"false\">)<\/mo><\/mrow><\/mtd><mtd style=\"padding-right:0em;\"><mn>0<\/mn><\/mtd><\/mtr><mtr><mtd style=\"padding-left:0em;\"><mrow><mi>s<\/mi><mi>i<\/mi><mi>n<\/mi><mo form=\"prefix\" stretchy=\"false\">(<\/mo><mi>\u03b8<\/mi><mo form=\"postfix\" stretchy=\"false\">)<\/mo><\/mrow><\/mtd><mtd><mrow><mi>c<\/mi><mi>o<\/mi><mi>s<\/mi><mo form=\"prefix\" stretchy=\"false\">(<\/mo><mi>\u03b8<\/mi><mo form=\"postfix\" stretchy=\"false\">)<\/mo><\/mrow><\/mtd><mtd style=\"padding-right:0em;\"><mn>0<\/mn><\/mtd><\/mtr><mtr><mtd style=\"padding-left:0em;\"><mn>0<\/mn><\/mtd><mtd><mn>0<\/mn><\/mtd><mtd style=\"padding-right:0em;\"><mn>1<\/mn><\/mtd><\/mtr><\/mtable><mo fence=\"true\" form=\"postfix\">]<\/mo><\/mrow><\/mtd><\/mtr><\/mtable><\/mrow><annotation encoding=\"application\/x-tex\">A=\n\\begin{gathered}\n\\begin{bmatrix} \ncos(\\theta) &amp; sin(\\theta) &amp; 0 \\\\ \nsin(\\theta) &amp; cos(\\theta) &amp; 0 \\\\\n0 &amp; 0 &amp; 1\n\\end{bmatrix}\n\\end{gathered}<\/annotation><\/semantics><\/math><\/div>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"counterclockwise\">counterclockwise<\/h3>\n\n\n\n<div class=\"wp-block-math\"><math display=\"block\"><semantics><mrow><mi>A<\/mi><mo>=<\/mo><mtable displaystyle=\"true\" class=\"tml-jot\"><mtr><mtd style=\"padding-left:0em;padding-right:0em;\"><mrow><mo fence=\"true\" form=\"prefix\">[<\/mo><mtable columnalign=\"center center center\"><mtr><mtd style=\"padding-left:0em;\"><mrow><mi>c<\/mi><mi>o<\/mi><mi>s<\/mi><mo form=\"prefix\" stretchy=\"false\">(<\/mo><mi>\u03b8<\/mi><mo form=\"postfix\" stretchy=\"false\">)<\/mo><\/mrow><\/mtd><mtd><mrow><mi>s<\/mi><mi>i<\/mi><mi>n<\/mi><mo form=\"prefix\" stretchy=\"false\">(<\/mo><mo form=\"prefix\" stretchy=\"false\">\u2212<\/mo><mi>\u03b8<\/mi><mo form=\"postfix\" stretchy=\"false\">)<\/mo><\/mrow><\/mtd><mtd style=\"padding-right:0em;\"><mn>0<\/mn><\/mtd><\/mtr><mtr><mtd style=\"padding-left:0em;\"><mrow><mi>s<\/mi><mi>i<\/mi><mi>n<\/mi><mo form=\"prefix\" stretchy=\"false\">(<\/mo><mi>\u03b8<\/mi><mo form=\"postfix\" stretchy=\"false\">)<\/mo><\/mrow><\/mtd><mtd><mrow><mi>c<\/mi><mi>o<\/mi><mi>s<\/mi><mo form=\"prefix\" stretchy=\"false\">(<\/mo><mi>\u03b8<\/mi><mo form=\"postfix\" stretchy=\"false\">)<\/mo><\/mrow><\/mtd><mtd style=\"padding-right:0em;\"><mn>0<\/mn><\/mtd><\/mtr><mtr><mtd style=\"padding-left:0em;\"><mn>0<\/mn><\/mtd><mtd><mn>0<\/mn><\/mtd><mtd style=\"padding-right:0em;\"><mn>1<\/mn><\/mtd><\/mtr><\/mtable><mo fence=\"true\" form=\"postfix\">]<\/mo><\/mrow><\/mtd><\/mtr><\/mtable><\/mrow><annotation encoding=\"application\/x-tex\">A=\n\\begin{gathered}\n\\begin{bmatrix} \ncos(\\theta) &amp; sin(-\\theta) &amp; 0 \\\\ \nsin(\\theta) &amp; cos(\\theta) &amp; 0 \\\\\n0 &amp; 0 &amp; 1\n\\end{bmatrix}\n\\end{gathered}<\/annotation><\/semantics><\/math><\/div>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"matrix-equation\">matrix equation<\/h3>\n\n\n\n<div class=\"wp-block-math\"><math display=\"block\"><semantics><mrow><mtable displaystyle=\"true\" class=\"tml-jot\"><mtr><mtd style=\"padding-left:0em;padding-right:0em;\"><mrow><mo fence=\"true\" form=\"prefix\">[<\/mo><mtable columnalign=\"center\"><mtr><mtd style=\"padding-left:0em;padding-right:0em;\"><msub><mi>x<\/mi><mn>1<\/mn><\/msub><\/mtd><\/mtr><mtr><mtd style=\"padding-left:0em;padding-right:0em;\"><msub><mi>y<\/mi><mn>1<\/mn><\/msub><\/mtd><\/mtr><mtr><mtd style=\"padding-left:0em;padding-right:0em;\"><mn>1<\/mn><\/mtd><\/mtr><\/mtable><mo fence=\"true\" form=\"postfix\">]<\/mo><\/mrow><\/mtd><\/mtr><\/mtable><mo>=<\/mo><mi>A<\/mi><mo>\u22c5<\/mo><mtable displaystyle=\"true\" class=\"tml-jot\"><mtr><mtd style=\"padding-left:0em;padding-right:0em;\"><mrow><mo fence=\"true\" form=\"prefix\">[<\/mo><mtable columnalign=\"center\"><mtr><mtd style=\"padding-left:0em;padding-right:0em;\"><mi>x<\/mi><\/mtd><\/mtr><mtr><mtd style=\"padding-left:0em;padding-right:0em;\"><mi>y<\/mi><\/mtd><\/mtr><mtr><mtd style=\"padding-left:0em;padding-right:0em;\"><mn>1<\/mn><\/mtd><\/mtr><\/mtable><mo fence=\"true\" form=\"postfix\">]<\/mo><\/mrow><\/mtd><\/mtr><\/mtable><\/mrow><annotation encoding=\"application\/x-tex\">\\begin{gathered}\n\\begin{bmatrix} \nx_1 \\\\ \ny_1 \\\\\n1\n\\end{bmatrix}\n\\end{gathered}\n=\nA\n\\cdot\n\\begin{gathered}\n\\begin{bmatrix} \nx \\\\ \ny \\\\\n1\n\\end{bmatrix}\n\\end{gathered}<\/annotation><\/semantics><\/math><\/div>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"rust-demo-code\">Rust demo code<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code><strong>use<\/strong> std::f64::consts::PI;\n<strong>use<\/strong> ndarray::arr2;\n\n<strong>fn<\/strong> <strong>rotation<\/strong>() {\n    <em>\/\/ 2D point rotation 45 degrees<\/em>\n    <strong>let<\/strong> theta <strong>=<\/strong> 45.0 <strong>*<\/strong> (PI <strong>\/<\/strong> 180.0);\n\n    <em>\/\/ Convert Ordinary Coordinate (x, y) to Homogeneous Coordinate (x, y, 1)<\/em>\n    <strong>let<\/strong> point <strong>=<\/strong> <strong>arr2<\/strong>(<strong>&amp;<\/strong>&#91;&#91;0.0], &#91;10.0], &#91;1.0]]);\n\n    <em>\/\/ 2D rotated matrices<\/em>\n    <strong>let<\/strong> a <strong>=<\/strong> <strong>arr2<\/strong>(<strong>&amp;<\/strong>&#91;\n        &#91;f64::<strong>cos<\/strong>(theta), f64::<strong>sin<\/strong>(theta), 0.0],\n        &#91;f64::<strong>sin<\/strong>(theta), f64::<strong>cos<\/strong>(theta), 0.0],\n        &#91;0.0, 0.0, 1.0],\n    ]);\n\n    <strong>let<\/strong> new_point <strong>=<\/strong> a<strong>.dot<\/strong>(<strong>&amp;<\/strong>point);\n\n    println!(\"{}\", <strong>&amp;<\/strong>new_point);\n}\n<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>    Finished dev <strong>&#91;<\/strong>unoptimized + debuginfo] target<strong>(<\/strong>s<strong>)<\/strong> <strong>in <\/strong>0.11s\n     Running `target\/debug\/two_d_cover`\n<strong>&#91;&#91;<\/strong>7.071067811865475],\n <strong>&#91;<\/strong>7.0710678118654755],\n <strong>&#91;<\/strong>1]]\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"rotate-a-point-around-another-point\"><strong>Rotate a point around another point<\/strong><\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Translate the specified point to the origin to obtain the translation matrix <math data-latex=\"T_1\"><semantics><msub><mi>T<\/mi><mn>1<\/mn><\/msub><annotation encoding=\"application\/x-tex\">T_1<\/annotation><\/semantics><\/math><\/li>\n\n\n\n<li>Perform a rotation to obtain the rotation matrix <math data-latex=\"R\"><semantics><mi>R<\/mi><annotation encoding=\"application\/x-tex\">R<\/annotation><\/semantics><\/math><\/li>\n\n\n\n<li>Translate to the specified point to get the translation matrix <math data-latex=\"T_2\"><semantics><msub><mi>T<\/mi><mn>2<\/mn><\/msub><annotation encoding=\"application\/x-tex\">T_2<\/annotation><\/semantics><\/math>.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">the point <math data-latex=\"(x_0, y_0)\"><semantics><mrow><mo form=\"prefix\" stretchy=\"false\">(<\/mo><msub><mi>x<\/mi><mn>0<\/mn><\/msub><mo separator=\"true\">,<\/mo><msub><mi>y<\/mi><mn>0<\/mn><\/msub><mo form=\"postfix\" stretchy=\"false\">)<\/mo><\/mrow><annotation encoding=\"application\/x-tex\">(x_0, y_0)<\/annotation><\/semantics><\/math> is rotated around the point <math data-latex=\"(x_s, y_s)\"><semantics><mrow><mo form=\"prefix\" stretchy=\"false\">(<\/mo><msub><mi>x<\/mi><mi>s<\/mi><\/msub><mo separator=\"true\">,<\/mo><msub><mi>y<\/mi><mi>s<\/mi><\/msub><mo form=\"postfix\" stretchy=\"false\">)<\/mo><\/mrow><annotation encoding=\"application\/x-tex\">(x_s, y_s)<\/annotation><\/semantics><\/math><\/p>\n\n\n\n<div class=\"wp-block-math\"><math display=\"block\"><semantics><mrow><msub><mi>T<\/mi><mn>1<\/mn><\/msub><mo>=<\/mo><mtable displaystyle=\"true\" class=\"tml-jot\"><mtr><mtd style=\"padding-left:0em;padding-right:0em;\"><mrow><mo fence=\"true\" form=\"prefix\">[<\/mo><mtable columnalign=\"center center center\"><mtr><mtd style=\"padding-left:0em;\"><mn>1<\/mn><\/mtd><mtd><mn>0<\/mn><\/mtd><mtd style=\"padding-right:0em;\"><mn>0<\/mn><\/mtd><\/mtr><mtr><mtd style=\"padding-left:0em;\"><mn>0<\/mn><\/mtd><mtd><mn>1<\/mn><\/mtd><mtd style=\"padding-right:0em;\"><mn>0<\/mn><\/mtd><\/mtr><mtr><mtd style=\"padding-left:0em;\"><mrow><mo>\u2212<\/mo><msub><mi>x<\/mi><mi>s<\/mi><\/msub><\/mrow><\/mtd><mtd><mrow><mo>\u2212<\/mo><msub><mi>y<\/mi><mi>s<\/mi><\/msub><\/mrow><\/mtd><mtd style=\"padding-right:0em;\"><mn>1<\/mn><\/mtd><\/mtr><\/mtable><mo fence=\"true\" form=\"postfix\">]<\/mo><\/mrow><\/mtd><\/mtr><\/mtable><\/mrow><annotation encoding=\"application\/x-tex\">T_1=\n\\begin{gathered}\n\\begin{bmatrix} \n1 &amp; 0 &amp; 0 \\\\ \n0 &amp; 1 &amp; 0 \\\\\n-x_s &amp; -y_s &amp; 1\n\\end{bmatrix}\n\\end{gathered}<\/annotation><\/semantics><\/math><\/div>\n\n\n\n<div class=\"wp-block-math\"><math display=\"block\"><semantics><mrow><mi>R<\/mi><mo>=<\/mo><mtable displaystyle=\"true\" class=\"tml-jot\"><mtr><mtd style=\"padding-left:0em;padding-right:0em;\"><mrow><mo fence=\"true\" form=\"prefix\">[<\/mo><mtable columnalign=\"center center center\"><mtr><mtd style=\"padding-left:0em;\"><mrow><mi>c<\/mi><mi>o<\/mi><mi>s<\/mi><mo form=\"prefix\" stretchy=\"false\">(<\/mo><mi>\u03b8<\/mi><mo form=\"postfix\" stretchy=\"false\">)<\/mo><\/mrow><\/mtd><mtd><mrow><mo>\u2212<\/mo><mi>s<\/mi><mi>i<\/mi><mi>n<\/mi><mo form=\"prefix\" stretchy=\"false\">(<\/mo><mi>\u03b8<\/mi><mo form=\"postfix\" stretchy=\"false\">)<\/mo><\/mrow><\/mtd><mtd style=\"padding-right:0em;\"><mn>0<\/mn><\/mtd><\/mtr><mtr><mtd style=\"padding-left:0em;\"><mrow><mi>s<\/mi><mi>i<\/mi><mi>n<\/mi><mo form=\"prefix\" stretchy=\"false\">(<\/mo><mi>\u03b8<\/mi><mo form=\"postfix\" stretchy=\"false\">)<\/mo><\/mrow><\/mtd><mtd><mrow><mi>c<\/mi><mi>o<\/mi><mi>s<\/mi><mo form=\"prefix\" stretchy=\"false\">(<\/mo><mi>\u03b8<\/mi><mo form=\"postfix\" stretchy=\"false\">)<\/mo><\/mrow><\/mtd><mtd style=\"padding-right:0em;\"><mn>0<\/mn><\/mtd><\/mtr><mtr><mtd style=\"padding-left:0em;\"><mn>0<\/mn><\/mtd><mtd><mn>0<\/mn><\/mtd><mtd style=\"padding-right:0em;\"><mn>1<\/mn><\/mtd><\/mtr><\/mtable><mo fence=\"true\" form=\"postfix\">]<\/mo><\/mrow><\/mtd><\/mtr><\/mtable><\/mrow><annotation encoding=\"application\/x-tex\">R=\n\\begin{gathered}\n\\begin{bmatrix} \ncos(\\theta) &amp; -sin(\\theta) &amp; 0 \\\\ \nsin(\\theta) &amp; cos(\\theta) &amp; 0 \\\\\n0 &amp; 0 &amp; 1\n\\end{bmatrix}\n\\end{gathered}<\/annotation><\/semantics><\/math><\/div>\n\n\n\n<div class=\"wp-block-math\"><math display=\"block\"><semantics><mrow><msub><mi>T<\/mi><mn>2<\/mn><\/msub><mo>=<\/mo><mtable displaystyle=\"true\" class=\"tml-jot\"><mtr><mtd style=\"padding-left:0em;padding-right:0em;\"><mrow><mo fence=\"true\" form=\"prefix\">[<\/mo><mtable columnalign=\"center center center\"><mtr><mtd style=\"padding-left:0em;\"><mn>1<\/mn><\/mtd><mtd><mn>0<\/mn><\/mtd><mtd style=\"padding-right:0em;\"><mn>0<\/mn><\/mtd><\/mtr><mtr><mtd style=\"padding-left:0em;\"><mn>0<\/mn><\/mtd><mtd><mn>1<\/mn><\/mtd><mtd style=\"padding-right:0em;\"><mn>0<\/mn><\/mtd><\/mtr><mtr><mtd style=\"padding-left:0em;\"><msub><mi>x<\/mi><mi>s<\/mi><\/msub><\/mtd><mtd><msub><mi>y<\/mi><mi>s<\/mi><\/msub><\/mtd><mtd style=\"padding-right:0em;\"><mn>1<\/mn><\/mtd><\/mtr><\/mtable><mo fence=\"true\" form=\"postfix\">]<\/mo><\/mrow><\/mtd><\/mtr><\/mtable><\/mrow><annotation encoding=\"application\/x-tex\">T_2=\n\\begin{gathered}\n\\begin{bmatrix} \n1 &amp; 0 &amp; 0 \\\\ \n0 &amp; 1 &amp; 0 \\\\\nx_s &amp; y_s &amp; 1\n\\end{bmatrix}\n\\end{gathered}<\/annotation><\/semantics><\/math><\/div>\n\n\n\n<div class=\"wp-block-math\"><math display=\"block\"><semantics><mrow><mtable displaystyle=\"true\" class=\"tml-jot\"><mtr><mtd style=\"padding-left:0em;padding-right:0em;\"><mrow><mo fence=\"true\" form=\"prefix\">[<\/mo><mtable columnalign=\"center\"><mtr><mtd style=\"padding-left:0em;padding-right:0em;\"><msub><mi>x<\/mi><mn>1<\/mn><\/msub><\/mtd><\/mtr><mtr><mtd style=\"padding-left:0em;padding-right:0em;\"><msub><mi>y<\/mi><mn>1<\/mn><\/msub><\/mtd><\/mtr><mtr><mtd style=\"padding-left:0em;padding-right:0em;\"><mn>1<\/mn><\/mtd><\/mtr><\/mtable><mo fence=\"true\" form=\"postfix\">]<\/mo><\/mrow><\/mtd><\/mtr><\/mtable><mo>=<\/mo><mtable displaystyle=\"true\" class=\"tml-jot\"><mtr><mtd style=\"padding-left:0em;padding-right:0em;\"><mrow><mo fence=\"true\" form=\"prefix\">[<\/mo><mtable columnalign=\"center\"><mtr><mtd style=\"padding-left:0em;padding-right:0em;\"><msub><mi>x<\/mi><mn>0<\/mn><\/msub><\/mtd><\/mtr><mtr><mtd style=\"padding-left:0em;padding-right:0em;\"><msub><mi>y<\/mi><mn>0<\/mn><\/msub><\/mtd><\/mtr><mtr><mtd style=\"padding-left:0em;padding-right:0em;\"><mn>1<\/mn><\/mtd><\/mtr><\/mtable><mo fence=\"true\" form=\"postfix\">]<\/mo><\/mrow><\/mtd><\/mtr><\/mtable><mo>\u22c5<\/mo><msub><mi>T<\/mi><mn>1<\/mn><\/msub><mo>\u22c5<\/mo><mi>R<\/mi><mo>\u22c5<\/mo><msub><mi>T<\/mi><mn>2<\/mn><\/msub><\/mrow><annotation encoding=\"application\/x-tex\">\\begin{gathered}\n\\begin{bmatrix} \nx_1 \\\\ \ny_1 \\\\\n1\n\\end{bmatrix}\n\\end{gathered}\n=\n\\begin{gathered}\n\\begin{bmatrix} \nx_0 \\\\ \ny_0 \\\\\n1\n\\end{bmatrix}\n\\end{gathered}\n\\cdot\nT_1 \\cdot R \\cdot T_2<\/annotation><\/semantics><\/math><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"translation\">Translation<\/h2>\n\n\n\n<div class=\"wp-block-math\"><math display=\"block\"><semantics><mrow><mtable displaystyle=\"true\" class=\"tml-jot\"><mtr><mtd style=\"padding-left:0em;padding-right:0em;\"><mrow><mo fence=\"true\" form=\"prefix\">[<\/mo><mtable columnalign=\"center\"><mtr><mtd style=\"padding-left:0em;padding-right:0em;\"><msub><mi>x<\/mi><mn>1<\/mn><\/msub><\/mtd><\/mtr><mtr><mtd style=\"padding-left:0em;padding-right:0em;\"><msub><mi>y<\/mi><mn>1<\/mn><\/msub><\/mtd><\/mtr><mtr><mtd style=\"padding-left:0em;padding-right:0em;\"><mn>1<\/mn><\/mtd><\/mtr><\/mtable><mo fence=\"true\" form=\"postfix\">]<\/mo><\/mrow><\/mtd><\/mtr><\/mtable><mo>=<\/mo><mtable displaystyle=\"true\" class=\"tml-jot\"><mtr><mtd style=\"padding-left:0em;padding-right:0em;\"><mrow><mo fence=\"true\" form=\"prefix\">[<\/mo><mtable columnalign=\"center center center\"><mtr><mtd style=\"padding-left:0em;\"><mn>1<\/mn><\/mtd><mtd><mn>0<\/mn><\/mtd><mtd style=\"padding-right:0em;\"><mn>0<\/mn><\/mtd><\/mtr><mtr><mtd style=\"padding-left:0em;\"><mn>0<\/mn><\/mtd><mtd><mn>1<\/mn><\/mtd><mtd style=\"padding-right:0em;\"><mn>0<\/mn><\/mtd><\/mtr><mtr><mtd style=\"padding-left:0em;\"><mrow><mi>d<\/mi><mi>x<\/mi><\/mrow><\/mtd><mtd><mrow><mi>d<\/mi><mi>y<\/mi><\/mrow><\/mtd><mtd style=\"padding-right:0em;\"><mn>1<\/mn><\/mtd><\/mtr><\/mtable><mo fence=\"true\" form=\"postfix\">]<\/mo><\/mrow><\/mtd><\/mtr><\/mtable><mo>\u22c5<\/mo><mtable displaystyle=\"true\" class=\"tml-jot\"><mtr><mtd style=\"padding-left:0em;padding-right:0em;\"><mrow><mo fence=\"true\" form=\"prefix\">[<\/mo><mtable columnalign=\"center\"><mtr><mtd style=\"padding-left:0em;padding-right:0em;\"><msub><mi>x<\/mi><mn>0<\/mn><\/msub><\/mtd><\/mtr><mtr><mtd style=\"padding-left:0em;padding-right:0em;\"><msub><mi>y<\/mi><mn>0<\/mn><\/msub><\/mtd><\/mtr><mtr><mtd style=\"padding-left:0em;padding-right:0em;\"><mn>1<\/mn><\/mtd><\/mtr><\/mtable><mo fence=\"true\" form=\"postfix\">]<\/mo><\/mrow><\/mtd><\/mtr><\/mtable><\/mrow><annotation encoding=\"application\/x-tex\">\\begin{gathered}\n\\begin{bmatrix} \nx_1 \\\\ \ny_1 \\\\\n1\n\\end{bmatrix}\n\\end{gathered}\n=\n\\begin{gathered}\n\\begin{bmatrix} \n1 &amp; 0 &amp; 0 \\\\ \n0 &amp; 1 &amp; 0 \\\\\ndx &amp; dy &amp; 1\n\\end{bmatrix}\n\\end{gathered}\n\\cdot\n\\begin{gathered}\n\\begin{bmatrix} \nx_0 \\\\ \ny_0 \\\\\n1\n\\end{bmatrix}\n\\end{gathered}<\/annotation><\/semantics><\/math><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"zoom\">Zoom<\/h2>\n\n\n\n<div class=\"wp-block-math\"><math display=\"block\"><semantics><mrow><mtable displaystyle=\"true\" class=\"tml-jot\"><mtr><mtd style=\"padding-left:0em;padding-right:0em;\"><mrow><mo fence=\"true\" form=\"prefix\">[<\/mo><mtable columnalign=\"center\"><mtr><mtd style=\"padding-left:0em;padding-right:0em;\"><msub><mi>x<\/mi><mn>1<\/mn><\/msub><\/mtd><\/mtr><mtr><mtd style=\"padding-left:0em;padding-right:0em;\"><msub><mi>y<\/mi><mn>1<\/mn><\/msub><\/mtd><\/mtr><mtr><mtd style=\"padding-left:0em;padding-right:0em;\"><mn>1<\/mn><\/mtd><\/mtr><\/mtable><mo fence=\"true\" form=\"postfix\">]<\/mo><\/mrow><\/mtd><\/mtr><\/mtable><mo>=<\/mo><mtable displaystyle=\"true\" class=\"tml-jot\"><mtr><mtd style=\"padding-left:0em;padding-right:0em;\"><mrow><mo fence=\"true\" form=\"prefix\">[<\/mo><mtable columnalign=\"center center center\"><mtr><mtd style=\"padding-left:0em;\"><msub><mi>s<\/mi><mi>x<\/mi><\/msub><\/mtd><mtd><mn>0<\/mn><\/mtd><mtd style=\"padding-right:0em;\"><mn>0<\/mn><\/mtd><\/mtr><mtr><mtd style=\"padding-left:0em;\"><mn>0<\/mn><\/mtd><mtd><msub><mi>s<\/mi><mi>y<\/mi><\/msub><\/mtd><mtd style=\"padding-right:0em;\"><mn>0<\/mn><\/mtd><\/mtr><mtr><mtd style=\"padding-left:0em;\"><mn>0<\/mn><\/mtd><mtd><mn>0<\/mn><\/mtd><mtd style=\"padding-right:0em;\"><mn>1<\/mn><\/mtd><\/mtr><\/mtable><mo fence=\"true\" form=\"postfix\">]<\/mo><\/mrow><\/mtd><\/mtr><\/mtable><mo>\u22c5<\/mo><mtable displaystyle=\"true\" class=\"tml-jot\"><mtr><mtd style=\"padding-left:0em;padding-right:0em;\"><mrow><mo fence=\"true\" form=\"prefix\">[<\/mo><mtable columnalign=\"center\"><mtr><mtd style=\"padding-left:0em;padding-right:0em;\"><msub><mi>x<\/mi><mn>0<\/mn><\/msub><\/mtd><\/mtr><mtr><mtd style=\"padding-left:0em;padding-right:0em;\"><msub><mi>y<\/mi><mn>0<\/mn><\/msub><\/mtd><\/mtr><mtr><mtd style=\"padding-left:0em;padding-right:0em;\"><mn>1<\/mn><\/mtd><\/mtr><\/mtable><mo fence=\"true\" form=\"postfix\">]<\/mo><\/mrow><\/mtd><\/mtr><\/mtable><\/mrow><annotation encoding=\"application\/x-tex\">\\begin{gathered}\n\\begin{bmatrix} \nx_1 \\\\ \ny_1 \\\\\n1\n\\end{bmatrix}\n\\end{gathered}\n=\n\\begin{gathered}\n\\begin{bmatrix} \ns_x &amp; 0 &amp; 0 \\\\ \n0 &amp; s_y &amp; 0 \\\\\n0 &amp; 0 &amp; 1\n\\end{bmatrix}\n\\end{gathered}\n\\cdot\n\\begin{gathered}\n\\begin{bmatrix} \nx_0 \\\\ \ny_0 \\\\\n1\n\\end{bmatrix}\n\\end{gathered}<\/annotation><\/semantics><\/math><\/div>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"rust-demo-code-1\">Rust demo code<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code><strong>use<\/strong> ndarray::arr2;\n\n<strong>fn<\/strong> <strong>main<\/strong>() {\n    <strong>zoom<\/strong>(10.0, 10.0, 1.2, 1.2);\n}\n\n<strong>fn<\/strong> <strong>zoom<\/strong>(x_0: f64, y_0: f64, s_x: f64, s_y: f64) {\n    <strong>let<\/strong> point <strong>=<\/strong> <strong>arr2<\/strong>(<strong>&amp;<\/strong>&#91;&#91;x_0], &#91;y_0], &#91;1.0]]);\n\n    <strong>let<\/strong> s <strong>=<\/strong> <strong>arr2<\/strong>(<strong>&amp;<\/strong>&#91;\n        &#91;s_x, 0.0, 0.0],\n        &#91;0.0, s_y, 0.0],\n        &#91;0.0, 0.0, 1.0],\n    ]);\n\n    <strong>let<\/strong> new_point <strong>=<\/strong> s<strong>.dot<\/strong>(<strong>&amp;<\/strong>point);\n    println!(\"{}\", <strong>&amp;<\/strong>new_point);\n}\n<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>    Finished dev <strong>&#91;<\/strong>unoptimized + debuginfo] target<strong>(<\/strong>s<strong>)<\/strong> <strong>in <\/strong>0.34s\n     Running `target\/debug\/two_d_cover`\n<strong>&#91;&#91;<\/strong>12],\n <strong>&#91;<\/strong>12],\n <strong>&#91;<\/strong>1]]<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Record the formulas commonly used for the conversion of 2D coordinate systems.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7],"tags":[],"class_list":["post-216","post","type-post","status-publish","format-standard","hentry","category-develop"],"_links":{"self":[{"href":"https:\/\/blog.bexonbai.com\/index.php?rest_route=\/wp\/v2\/posts\/216","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.bexonbai.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.bexonbai.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.bexonbai.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.bexonbai.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=216"}],"version-history":[{"count":1,"href":"https:\/\/blog.bexonbai.com\/index.php?rest_route=\/wp\/v2\/posts\/216\/revisions"}],"predecessor-version":[{"id":217,"href":"https:\/\/blog.bexonbai.com\/index.php?rest_route=\/wp\/v2\/posts\/216\/revisions\/217"}],"wp:attachment":[{"href":"https:\/\/blog.bexonbai.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=216"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.bexonbai.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=216"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.bexonbai.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=216"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}