<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <author>
    <name>Last</name>
  </author>
  <generator uri="https://hexo.io/">Hexo</generator>
  <id>https://blog.imlast.top/</id>
  <link href="https://blog.imlast.top/" rel="alternate"/>
  <link href="https://blog.imlast.top/atom.xml" rel="self"/>
  <rights>All rights reserved 2026, Last</rights>
  <subtitle>void of myself</subtitle>
  <title>Last Blog</title>
  <updated>2026-08-31T15:51:43.000Z</updated>
  <entry>
    <author>
      <name>Last</name>
    </author>
    <category term="笔记" scheme="https://blog.imlast.top/categories/%E7%AC%94%E8%AE%B0/"/>
    <category term="c" scheme="https://blog.imlast.top/tags/c/"/>
    <category term="cmu15213" scheme="https://blog.imlast.top/tags/cmu15213/"/>
    <category term="asm" scheme="https://blog.imlast.top/tags/asm/"/>
    <content>
      <![CDATA[<h1 id="Attack-Lab"><a href="#Attack-Lab" class="headerlink" title="Attack Lab"></a>Attack Lab</h1><ul><li><p>It is quite reasonable to put this lab along with bomb lab as they rely on basically the same skill, which is the ability to read and decipher and understand the control flow of the assembly code compiled from c source code.</p></li><li><p>Funny enough, these two labs are far easier than the first data lab in my opinion. It is such a pain in the ass to play with machine level data representation convention, considering all its corner cases and magic bit level tricks.</p></li></ul><h1 id="Records"><a href="#Records" class="headerlink" title="Records"></a>Records</h1><h2 id="Code-Injection-Attacks"><a href="#Code-Injection-Attacks" class="headerlink" title="Code Injection Attacks"></a>Code Injection Attacks</h2><h3 id="Level-1"><a href="#Level-1" class="headerlink" title="Level 1"></a>Level 1</h3><ul><li><p>This is kinda like a warm-up phase for this lab, requiring an input to manipulate the program towards another function while not calling it from source code.</p></li><li><p>By looking at the assembly code of function <code>getbuf</code>:</p>  <div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">00000000004017a8 &lt;getbuf&gt;:</span><br><span class="line">    4017a8:448 83 ec 28          sub    $0x28,%rsp</span><br><span class="line">    4017ac:448 89 e7             mov    %rsp,%rdi</span><br><span class="line">    4017af:4e8 8c 02 00 00       call   401a40 &lt;Gets&gt;</span><br><span class="line">    4017b4:4b8 01 00 00 00       mov    $0x1,%eax</span><br><span class="line">    4017b9:448 83 c4 28          add    $0x28,%rsp</span><br><span class="line">    4017bd:4c3                   ret</span><br><span class="line">    4017be:490                   nop</span><br><span class="line">    4017bf:490                   nop</span><br></pre></td></tr></table></figure></div></li><li><p>We can see that the function allocates <code>0x28</code> bytes on the stack as the buffer holding user input.</p></li><li><p>To understand how a buffer-overflow attack happens, we need a graph:</p></li></ul><img src="https://files.seeusercontent.com/2026/09/02/dk9K/getbuf.png" alt="getbuf.png" width="600" /><ul><li><p>We are required to modify the return address stored at the top of <code>getbuf</code>‘s stack frame, which is at address <code>0x5561dca0</code>.</p></li><li><p>The saved return address is 40 bytes after the beginning of the buffer. Therefore, the payload nees 40 characters(each takes up 1 byte) of padding followed by the 8-byte address of <code>touch1</code>.</p></li><li><p>Immediately can we use <code>hex2raw</code> to generate an ASCII representation of the hexadecimal address of the target function <code>touch1</code>, which is <code>0x4017c0</code>. Following 40 characters taking up 40 bytes which fills up the prepared buffer, we can override the return address to where we want the next instruction pointer points to.</p></li><li><p>Keep in mind the on a litte-edian machine, data is stored reversed byte-wise:</p>  <div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">c0 17 40 00 00 00 00 00     /* 8-byte address reversed byte-wise */</span><br></pre></td></tr></table></figure></div></li></ul><h3 id="Level-2"><a href="#Level-2" class="headerlink" title="Level 2"></a>Level 2</h3><ul><li><p>Now we need to jump into another function with an parameter. Recall that the positions of the parameters of a function call:</p><blockquote><p>For a standard function call, 6 of its parameters goes into <code>RDI, RSI, RDX, RCX, R8, R9</code> in order.</p></blockquote></li><li><p>That means we should put our desired parameter in <code>%rdi</code> before jumping, which requires injected instructions.</p></li><li><p>As the instruction pointer stored in <code>%rip</code> increments each time it completes an instuction, the injected instructions on stack should be arranged in positive order by address. As a result, the input should consist:</p>  <div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&lt;placeholder&gt; + &lt;instructions&gt; + &lt;override address&gt;</span><br></pre></td></tr></table></figure></div></li><li><p>We want to execute the injected instructions when <code>getbuf</code> returns, so the 8 bytes at <code>0x5561dca0</code> should be the address of the first injected instruction. And after putting the desired variable into <code>%rdi</code>, we should override the value stored at the address pointed to by <code>%rsp</code> to function <code>touch2</code>.</p></li><li><p>By looking at the assembly, we can find that the desired <code>cookie</code> is located at <code>0x6044e4</code>:</p>  <div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">4017fc:43b 3d e2 2c 20 00    cmp    0x202ce2(%rip),%edi        # 6044e4 &lt;cookie&gt;</span><br></pre></td></tr></table></figure></div></li><li><p>And its value:</p>  <div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">(gdb) x/wx 0x6044e4</span><br><span class="line">0x6044e4 &lt;cookie&gt;:      0x59b997fa</span><br></pre></td></tr></table></figure></div></li><li><p>So the instructions should be:</p>  <div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">mov    $0x59b997fa,%rdi</span><br><span class="line">movl   $0x4017ec,(%rsp)</span><br><span class="line">ret</span><br></pre></td></tr></table></figure></div><blockquote><p>[!TIP]<br>May be we should use <code>pushq</code>? Well, <code>movl</code> works well this time as the upper 32 bits are filled with 0 at the moment.</p></blockquote></li><li><p>Each of the <code>mov</code> instruction takes 7 bytes, and 1 byte for <code>ret</code>. That leaves a <code>40 - 15 = 25</code> bytes space remaining in the buffer that needs to be filled up.</p></li><li><p>And the starting address of the injected instructions is <code>0x5561dca0 - 0xf = 0x5561dc91</code>.</p><blockquote><p>[!TIP]<br>May be we should place the injected instructions at the beginning of the buffer? That way we wouldn’t need to calculate the start address of the instructions.</p></blockquote></li></ul><h3 id="Level-3"><a href="#Level-3" class="headerlink" title="Level 3"></a>Level 3</h3><ul><li><p>This time we are required to implant a string into the memory in order to pass the <code>strncmp</code> in <code>hexmatch</code>.</p></li><li><p>Turns out the string required in this phase is cookie in hexadecimal without the prefix ‘0x’, <code>59b997fa</code>, with a trailing <code>\0</code>.</p></li><li><p>The most tricky thing about this phase is that calling <code>hexmatch</code> and <code>touch3</code> would cause the program to push some of the callee-saved registers’ values onto the stack, which may override our injected string as <code>%rsp</code> increases after each return from our injected instructions and move on to <code>touch3</code>.</p></li><li><p>Especially the large local array allocated by <code>hexmatch</code>: <code>char cbuf[110]</code>, which completely annihilate the feasibility to put the string inside the <code>getbuf</code> buffer as it would be override completely at the moment.</p></li><li><p>We can observe the program’s behavior and record the values of <code>%rsp</code> to see where we can get a memory area untouched to save our injected string:</p>  <div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">0x5561dc78 ... 0x5561dca0 : buffer / padding</span><br><span class="line">0x5561dca0                : saved return address -&gt; injected code</span><br><span class="line">0x5561dca8                : next return address -&gt; touch3</span><br><span class="line">0x5561dcb0                : random data from upper stack frame</span><br></pre></td></tr></table></figure></div></li><li><p>Then <code>touch3</code> and <code>hexmatch</code> would push registers onto the stack and allocate local array, meaning that we cannot choose any address lower than <code>0x5561dcb0</code> to store our string.</p></li><li><p>Let’s place the string at <code>0x5561dcb0</code>.</p></li></ul><details class="relative my-4 border border-border-color bg-second-background-color rounded-md  blue" data-header-exclude><summary class="px-4 py-2 rounded-md shadow-[0_0_2px_0_var(--shadow-color-1)] cursor-pointer not-markdown"><i class="fa-solid fa-chevron-right"></i>NOTE</summary><div class="content p-4 "><ul><li>Also noted that <code>strncmp</code> does not compare the integer cookie directly. <code>hexmatch</code> first formats the cookie as an eight-character hexadecimal string, and then compares that string pointed to by <code>sval</code>:</li></ul><div class="code-container" data-rel="C"><figure class="iseeu highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> <span class="title function_">hexmatch</span><span class="params">(<span class="type">unsigned</span> val, <span class="type">char</span> *sval)</span> &#123;</span><br><span class="line">    <span class="type">char</span> cbuf[<span class="number">110</span>];</span><br><span class="line">    <span class="comment">/* Make position of check string unpredictable */</span></span><br><span class="line">    <span class="type">char</span> *s = cbuf + random() % <span class="number">100</span>;</span><br><span class="line">    <span class="built_in">sprintf</span>(s, <span class="string">&quot;%.8x&quot;</span>, val);</span><br><span class="line">    <span class="keyword">return</span> <span class="built_in">strncmp</span>(sval, s, <span class="number">9</span>) == <span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="type">void</span> <span class="title function_">touch3</span><span class="params">(<span class="type">char</span> *sval)</span> &#123;</span><br><span class="line">    vlevel = <span class="number">3</span>; <span class="comment">/* Part of validation protocol */</span></span><br><span class="line">    <span class="keyword">if</span> (hexmatch(cookie, sval)) &#123;</span><br><span class="line">        <span class="built_in">printf</span>(<span class="string">&quot;Touch3!: You called touch3(\&quot;%s\&quot;)\n&quot;</span>, sval);</span><br><span class="line">        validate(<span class="number">3</span>);</span><br><span class="line">    &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">        <span class="built_in">printf</span>(<span class="string">&quot;Misfire: You called touch3(\&quot;%s\&quot;)\n&quot;</span>, sval);</span><br><span class="line">        fail(<span class="number">3</span>);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="built_in">exit</span>(<span class="number">0</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></div><ul><li><p>We can clearly see that we are required to put a pointer to the injected string into <code>%rdi</code> before jumping to <code>touch3</code>, and the actual value that is being compared to that injected string is the value of the cookie: <code>59b997fa</code> as a <strong>string</strong> (<code>\0</code> as terminator ofc) instead of actual value in memory, as <code>sprintf</code> would convert that <code>val</code> into ASCII representation.</p></li><li><p>So there’s no way we can get the ready-made ASCII representation from the memory. We’ll have to inject the string ourselves.</p></li></ul></div></details><ul><li><p>Quite like the previous phase, we still need to override the return address of <code>getbuf</code> to our injected code. Then put the address of the injected string to <code>%rdi</code>, then modify the return address again to <code>touch3</code>, then <code>ret</code>.</p>  <div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">mov    $0x5561dcb0,%rdi     /* address of the injected string */</span><br><span class="line">movl   $0x4018fa,(%rsp)</span><br><span class="line">ret</span><br></pre></td></tr></table></figure></div></li><li><p>Then we’ll override the return address to <code>0x5561dc91</code>, the same as level 2 as the length of the injected instructions doesn’t change.</p></li><li><p>Moreover we need to gap the space between <code>0x5561dca8</code> to <code>0x5561dcb0</code>, which is 8 byte long. Just fill in anything in hexadecimal representation.</p></li><li><p>At last the ASCII string. Checking <code>man ascii</code>:</p>  <div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">35 39 62 39 39 37 66 61         /* injected string */</span><br><span class="line">00                              /* \0 */</span><br></pre></td></tr></table></figure></div></li><li><p>Now we’ve constructed the whole thing, put them together and use <code>hex2raw</code> to generate the final input.</p></li></ul><h2 id="Return-Oriented-Programming"><a href="#Return-Oriented-Programming" class="headerlink" title="Return-Oriented Programming"></a>Return-Oriented Programming</h2><ul><li>This time the modern OS’s defenses against code injection are online, including randomizing the stack address and marking the stack as nonexecutable. This makes it impossible for injected instructions to work, we’ll have to find helpful gadgets from the program itself to perform the attack.</li></ul><h3 id="Level-4"><a href="#Level-4" class="headerlink" title="Level 4"></a>Level 4</h3><ul><li><p>Though previous injection won’t work this time, the logic of the attack is the same:</p><ul><li>overflow buffer to override return address</li><li>put <code>0x59b997fa</code> into <code>%rdi</code></li><li>jump to <code>touch3</code></li></ul></li><li><p>We can find useful two gadgets from the <em>farm</em> provided in this new <code>rtarget</code>:</p>  <div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">00000000004019a0 &lt;addval_273&gt;:</span><br><span class="line">    c:48d 87 48 89 c7 c3    lea    -0x3c3876b8(%rdi),%eax</span><br><span class="line">    12:4c3                   ret</span><br><span class="line"></span><br><span class="line">00000000004019a7 &lt;addval_219&gt;:</span><br><span class="line">    13:48d 87 51 73 58 90    lea    -0x6fa78caf(%rdi),%eax</span><br><span class="line">    19:4c3                   ret</span><br></pre></td></tr></table></figure></div><ul><li><p>The first one (addval_273) contains:</p>  <div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">00000000004019a2 &lt;addval_273 + 2&gt;:</span><br><span class="line">    48 89 c7        movq    %rax,%rdi</span><br><span class="line">    c3              ret</span><br></pre></td></tr></table></figure></div></li><li><p>While the second contains:</p>  <div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">00000000004019ab &lt;addval_219 + 4&gt;</span><br><span class="line">    58              popq    %rax</span><br><span class="line">    90              nop</span><br><span class="line">    c3              ret</span><br></pre></td></tr></table></figure></div></li></ul></li><li><p>Now we have a plan: inject the cookie on to the stack, pop it to <code>%rax</code> then move it to <code>%rdi</code>, finally jump to <code>touch2</code>.</p></li><li><p>Since the <code>ret</code> at the end of each gadget would increment <code>%rsp</code> by 8, there’s no need of jumping to injected instructions.</p>  <div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">ab 19 40 00 00 00 00 00         /* 219+4: popq %rax */</span><br><span class="line">fa 97 b9 59 00 00 00 00         /* cookie */</span><br><span class="line">a2 19 40 00 00 00 00 00         /* 273+2: movq %rax,%rdi */</span><br><span class="line">ec 17 40 00 00 00 00 00         /* touch 2 */</span><br></pre></td></tr></table></figure></div></li></ul><h3 id="Level-5"><a href="#Level-5" class="headerlink" title="Level 5"></a>Level 5</h3><ul><li><p>You know what, I’m scared when the handout says:</p><blockquote><p>That may not seem significantly more difficult than using an ROP attack to invoke touch2, except that we have made it so.</p></blockquote></li><li><p>So I’m stopping here.</p></li></ul><h1 id="End"><a href="#End" class="headerlink" title="End"></a>End</h1><ul><li><p>Nice little lab.</p></li><li><p>Actually I think buffer-overflow attacks are more interesting than ROP, though they do not work these days. It feels kinda boring to find all the gadgets across the program(without a farm) and composing them together.</p></li></ul>]]>
    </content>
    <id>https://blog.imlast.top/2026/08/31/cmu15213-attacklab/</id>
    <link href="https://blog.imlast.top/2026/08/31/cmu15213-attacklab/"/>
    <published>2026-08-31T15:51:43.000Z</published>
    <summary>Fun puzzles in attacklab</summary>
    <title>CMU 15-213 Attack Lab</title>
    <updated>2026-08-31T15:51:43.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>Last</name>
    </author>
    <category term="笔记" scheme="https://blog.imlast.top/categories/%E7%AC%94%E8%AE%B0/"/>
    <category term="games101" scheme="https://blog.imlast.top/tags/games101/"/>
    <category term="linear_algebra" scheme="https://blog.imlast.top/tags/linear-algebra/"/>
    <content>
      <![CDATA[<h1 id="仿射变换-Affine-Transformation"><a href="#仿射变换-Affine-Transformation" class="headerlink" title="仿射变换 Affine Transformation"></a>仿射变换 Affine Transformation</h1><h2 id="线性变换-Linear-Transformation"><a href="#线性变换-Linear-Transformation" class="headerlink" title="线性变换 Linear Transformation"></a>线性变换 Linear Transformation</h2><ul><li><p>本质上，二维空间中某一个点/向量的旋转和缩放都是对其坐标值进行某种线性变换，因此二维空间图形的线性变换可以通过一个二维方阵来实现。</p><p>  <mjx-container class="MathJax" jax="SVG" overflow="overflow" display="true"><svg style="vertical-align: 0;" xmlns="http://www.w3.org/2000/svg" width="9.756ex" height="1.813ex" role="img" focusable="false" viewBox="0 -801.2 4311.9 801.2"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="  P’ = MP  "><g data-mml-node="msup"><g data-mml-node="mi" data-latex="P"><path data-c="1D443" d="M555 683L235 683C212 683 201 682 201 660C201 649 212 644 234 644C254 644 294 647 294 631C294 629 293 623 290 613L158 82C152 60 142 47 128 42C121 40 103 39 72 39C50 39 40 37 40 16C40 5 46 0 59 0L184 3L248 2C259 2 299 0 312 0C328 0 336 8 336 24C336 34 325 39 304 39C264 39 244 43 244 52C244 52 245 55 247 68L307 312L472 312C537 312 599 332 657 371C722 414 754 467 754 530C754 629 660 683 555 683M524 644C611 644 654 614 654 554C654 498 626 423 597 397C559 363 509 346 447 346L313 346L379 610C387 644 387 644 429 644Z"></path></g><g data-mml-node="mo" transform="translate(842.6,413) scale(0.707)" data-latex="’"><path data-c="2032" d="M284 549C259 549 242 539 233 518L65 96L110 96L332 463C337 472 340 482 340 493C340 523 314 549 284 549Z"></path></g></g><g data-mml-node="mo" data-latex="=" transform="translate(1458.2,0)"><path data-c="3D" d="M698 367L80 367C64 367 56 359 56 344C56 329 64 321 80 321L698 321C714 321 722 329 722 344C722 356 711 367 698 367M698 179L80 179C64 179 56 171 56 156C56 141 64 133 80 133L698 133C714 133 722 141 722 156C722 169 711 179 698 179Z"></path></g><g data-mml-node="mi" data-latex="M" transform="translate(2513.9,0)"><path data-c="1D440" d="M594 16C594 5 600 0 613 0L736 3C759 4 840 0 859 0C874 0 882 8 882 24C882 34 872 39 851 39C810 39 790 43 790 52C790 55 792 62 795 75L927 602C932 623 942 636 955 641C961 643 979 644 1008 644C1033 644 1044 645 1044 668C1044 678 1034 683 1013 683L882 683C853 683 853 681 840 662L484 108L408 657C404 682 402 683 373 683L237 683C215 683 204 682 204 660C204 649 215 644 236 644C256 644 297 647 297 631C297 629 296 623 293 613L167 110C158 72 135 49 100 42C75 39 42 43 42 16C42 5 48 0 60 0C78 0 141 3 159 3C178 3 242 0 261 0C276 0 283 8 283 24C283 33 276 38 261 39C219 39 198 52 198 78C198 82 199 89 202 100L332 621L415 26C418 9 424 0 434 0C442 0 450 7 459 20L848 627L712 82C706 60 696 47 681 42C675 40 656 39 625 39C604 39 594 37 594 16Z"></path></g><g data-mml-node="mi" data-latex="P" transform="translate(3557.9,0)"><path data-c="1D443" d="M555 683L235 683C212 683 201 682 201 660C201 649 212 644 234 644C254 644 294 647 294 631C294 629 293 623 290 613L158 82C152 60 142 47 128 42C121 40 103 39 72 39C50 39 40 37 40 16C40 5 46 0 59 0L184 3L248 2C259 2 299 0 312 0C328 0 336 8 336 24C336 34 325 39 304 39C264 39 244 43 244 52C244 52 245 55 247 68L307 312L472 312C537 312 599 332 657 371C722 414 754 467 754 530C754 629 660 683 555 683M524 644C611 644 654 614 654 554C654 498 626 423 597 397C559 363 509 346 447 346L313 346L379 610C387 644 387 644 429 644Z"></path></g></g></g></svg></mjx-container></p></li></ul><h3 id="旋转-Rotation"><a href="#旋转-Rotation" class="headerlink" title="旋转 Rotation"></a>旋转 Rotation</h3><ul><li>对于旋转，可以取两个特殊点来简单推导旋转变换矩阵（类似于用基向量变换的方式来理解），<mjx-container class="MathJax" jax="SVG" overflow="overflow"><svg style="vertical-align: -0.561ex;" xmlns="http://www.w3.org/2000/svg" width="5.029ex" height="2.253ex" role="img" focusable="false" viewBox="0 -748 2222.7 996"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="(1, 0)"><g data-mml-node="mo" data-latex="("><path data-c="28" d="M318-248C327-248 332-243 332-234C332-231 330-227 327-223C275-183 233-117 202-26C175 53 161 131 161 208L161 292C161 369 175 447 202 526C233 617 275 683 327 723C330 726 332 730 332 734C332 743 327 748 318 748C317 748 314 747 311 745C251 699 201 631 160 540C121 453 101 371 101 292L101 208C101 129 121 47 160-40C201-131 251-199 311-245C314-247 317-248 318-248Z"></path></g><g data-mml-node="mn" data-latex="1" transform="translate(389,0)"><path data-c="31" d="M269 666C228 624 168 603 89 603L89 564C141 564 184 572 217 588L217 82C217 64 213 52 204 47C195 42 170 39 130 39L95 39L95 0C120 2 174 3 257 3C340 3 394 2 419 0L419 39L384 39C343 39 318 42 310 47C302 52 297 64 297 82L297 636C297 660 295 666 269 666Z"></path></g><g data-mml-node="mo" data-latex="," transform="translate(889,0)"><path data-c="2C" d="M139 106C107 106 86 82 86 50C86 20 109-5 139-5C153-5 165-1 174 8L175 0C175-63 154-117 112-160C105-168 101-174 101-178C101-188 105-193 114-193C123-193 135-181 152-158C186-110 203-57 203 0C203 53 185 106 139 106Z"></path></g><g data-mml-node="mn" data-latex="0" transform="translate(1333.7,0)"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g><g data-mml-node="mo" data-latex=")" transform="translate(1833.7,0)"><path data-c="29" d="M78-245C138-199 188-131 229-40C268 47 288 129 288 208L288 292C288 371 268 453 229 540C188 631 138 699 78 745C75 747 72 748 71 748C62 748 57 743 57 734C57 730 59 726 62 723C114 683 156 617 187 526C214 447 228 369 228 292L228 208C228 131 214 53 187-26C156-117 114-183 62-223C59-227 57-231 57-234C57-243 62-248 71-248C72-248 75-247 78-245Z"></path></g></g></g></svg></mjx-container> 和 <mjx-container class="MathJax" jax="SVG" overflow="overflow"><svg style="vertical-align: -0.561ex;" xmlns="http://www.w3.org/2000/svg" width="5.029ex" height="2.253ex" role="img" focusable="false" viewBox="0 -748 2222.7 996"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="(0, 1)"><g data-mml-node="mo" data-latex="("><path data-c="28" d="M318-248C327-248 332-243 332-234C332-231 330-227 327-223C275-183 233-117 202-26C175 53 161 131 161 208L161 292C161 369 175 447 202 526C233 617 275 683 327 723C330 726 332 730 332 734C332 743 327 748 318 748C317 748 314 747 311 745C251 699 201 631 160 540C121 453 101 371 101 292L101 208C101 129 121 47 160-40C201-131 251-199 311-245C314-247 317-248 318-248Z"></path></g><g data-mml-node="mn" data-latex="0" transform="translate(389,0)"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g><g data-mml-node="mo" data-latex="," transform="translate(889,0)"><path data-c="2C" d="M139 106C107 106 86 82 86 50C86 20 109-5 139-5C153-5 165-1 174 8L175 0C175-63 154-117 112-160C105-168 101-174 101-178C101-188 105-193 114-193C123-193 135-181 152-158C186-110 203-57 203 0C203 53 185 106 139 106Z"></path></g><g data-mml-node="mn" data-latex="1" transform="translate(1333.7,0)"><path data-c="31" d="M269 666C228 624 168 603 89 603L89 564C141 564 184 572 217 588L217 82C217 64 213 52 204 47C195 42 170 39 130 39L95 39L95 0C120 2 174 3 257 3C340 3 394 2 419 0L419 39L384 39C343 39 318 42 310 47C302 52 297 64 297 82L297 636C297 660 295 666 269 666Z"></path></g><g data-mml-node="mo" data-latex=")" transform="translate(1833.7,0)"><path data-c="29" d="M78-245C138-199 188-131 229-40C268 47 288 129 288 208L288 292C288 371 268 453 229 540C188 631 138 699 78 745C75 747 72 748 71 748C62 748 57 743 57 734C57 730 59 726 62 723C114 683 156 617 187 526C214 447 228 369 228 292L228 208C228 131 214 53 187-26C156-117 114-183 62-223C59-227 57-231 57-234C57-243 62-248 71-248C72-248 75-247 78-245Z"></path></g></g></g></svg></mjx-container>，逆时针旋转 <mjx-container class="MathJax" jax="SVG" overflow="overflow"><svg style="vertical-align: -0.025ex;" xmlns="http://www.w3.org/2000/svg" width="1.061ex" height="1.62ex" role="img" focusable="false" viewBox="0 -705 469 716"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="\theta"><g data-mml-node="mi" data-latex="\theta"><path data-c="1D703" d="M164-11C209-11 256 16 302 70C382 163 455 335 455 498C455 539 448 582 434 625C416 678 382 705 333 705C288 705 243 678 196 624C116 532 42 360 42 196C42 94 75-11 164-11M332 675C365 675 382 637 382 560C382 517 372 452 352 367L155 367C180 460 204 529 229 574C266 641 301 675 332 675M145 327L341 327C322 246 299 181 274 132C235 57 199 19 164 19C131 19 115 58 115 135C115 185 125 249 145 327Z"></path></g></g></g></svg></mjx-container> ：</li></ul><img src="https://files.seeusercontent.com/2026/08/21/m9Tx/rotation.png" alt="rotation.png" width="500"><ul><li><p>观察图像可知：</p><p>  <mjx-container class="MathJax" jax="SVG" overflow="overflow" display="true"><svg style="vertical-align: -0.561ex;" xmlns="http://www.w3.org/2000/svg" width="19.996ex" height="2.253ex" role="img" focusable="false" viewBox="0 -748 8838.2 996"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="  (1, 0) \to (\cos{\theta}, \sin{\theta})  "><g data-mml-node="mo" data-latex="("><path data-c="28" d="M318-248C327-248 332-243 332-234C332-231 330-227 327-223C275-183 233-117 202-26C175 53 161 131 161 208L161 292C161 369 175 447 202 526C233 617 275 683 327 723C330 726 332 730 332 734C332 743 327 748 318 748C317 748 314 747 311 745C251 699 201 631 160 540C121 453 101 371 101 292L101 208C101 129 121 47 160-40C201-131 251-199 311-245C314-247 317-248 318-248Z"></path></g><g data-mml-node="mn" data-latex="1" transform="translate(389,0)"><path data-c="31" d="M269 666C228 624 168 603 89 603L89 564C141 564 184 572 217 588L217 82C217 64 213 52 204 47C195 42 170 39 130 39L95 39L95 0C120 2 174 3 257 3C340 3 394 2 419 0L419 39L384 39C343 39 318 42 310 47C302 52 297 64 297 82L297 636C297 660 295 666 269 666Z"></path></g><g data-mml-node="mo" data-latex="," transform="translate(889,0)"><path data-c="2C" d="M139 106C107 106 86 82 86 50C86 20 109-5 139-5C153-5 165-1 174 8L175 0C175-63 154-117 112-160C105-168 101-174 101-178C101-188 105-193 114-193C123-193 135-181 152-158C186-110 203-57 203 0C203 53 185 106 139 106Z"></path></g><g data-mml-node="mn" data-latex="0" transform="translate(1333.7,0)"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g><g data-mml-node="mo" data-latex=")" transform="translate(1833.7,0)"><path data-c="29" d="M78-245C138-199 188-131 229-40C268 47 288 129 288 208L288 292C288 371 268 453 229 540C188 631 138 699 78 745C75 747 72 748 71 748C62 748 57 743 57 734C57 730 59 726 62 723C114 683 156 617 187 526C214 447 228 369 228 292L228 208C228 131 214 53 187-26C156-117 114-183 62-223C59-227 57-231 57-234C57-243 62-248 71-248C72-248 75-247 78-245Z"></path></g><g data-mml-node="mo" data-latex="\to" transform="translate(2500.4,0)"><path data-c="2192" d="M932 234C939 237 943 243 943 250C943 257 939 263 932 266C884 282 839 316 797 368C769 403 750 444 741 491C738 504 730 510 717 510C701 510 693 502 693 485L694 483L694 482C711 395 755 326 828 274L82 274C66 274 58 266 58 250C58 234 66 226 82 226L828 226C755 174 711 105 694 18L694 17L693 15C693-2 701-10 717-10C730-10 738-4 741 9C750 56 769 97 797 132C839 184 884 218 932 234Z"></path></g><g data-mml-node="mo" data-latex="(" transform="translate(3778.2,0)"><path data-c="28" d="M318-248C327-248 332-243 332-234C332-231 330-227 327-223C275-183 233-117 202-26C175 53 161 131 161 208L161 292C161 369 175 447 202 526C233 617 275 683 327 723C330 726 332 730 332 734C332 743 327 748 318 748C317 748 314 747 311 745C251 699 201 631 160 540C121 453 101 371 101 292L101 208C101 129 121 47 160-40C201-131 251-199 311-245C314-247 317-248 318-248Z"></path></g><g data-mml-node="mi" data-latex="\cos" transform="translate(4167.2,0)"><path data-c="63" d="M251 416C293 416 325 406 347 386C323 383 306 361 306 338C306 305 322 289 355 289C388 289 404 306 404 339C404 410 327 448 250 448C188 448 137 426 96 380C55 334 34 279 34 216C34 155 55 101 96 56C137 11 187-11 248-11C298-11 337 3 365 32C388 55 403 78 411 102C414 111 415 117 415 121C415 130 409 134 398 134C390 134 385 130 382 122C361 55 320 21 257 21C228 21 200 34 172 61C139 92 123 144 123 218C123 318 161 416 251 416Z"></path><path data-c="6F" d="M249-11C311-11 363 11 406 55C449 99 471 152 471 214C471 277 450 332 408 378C366 424 313 448 250 448C187 448 135 424 92 378C49 332 28 277 28 214C28 152 49 99 92 55C135 11 188-11 249-11M250 21C202 21 166 42 141 85C125 113 117 159 117 222C117 283 125 327 140 355C164 398 200 419 249 419C296 419 332 398 357 357C374 329 382 284 382 222C382 106 348 21 250 21Z" transform="translate(444,0)"></path><path data-c="73" d="M360 130C360 206 308 254 205 274C158 283 128 294 112 305C96 316 88 332 88 351C88 398 123 421 193 421C261 421 298 383 303 306C304 298 309 294 319 294C330 294 336 303 336 321L336 420C336 439 331 448 321 448C310 448 295 430 285 422C260 439 229 448 193 448C104 448 33 408 33 323C33 289 47 260 76 237C111 208 144 202 207 191C272 178 305 149 305 104C305 47 270 18 199 18C130 18 86 64 67 155C64 168 59 175 50 175C39 175 33 165 33 146L33 17C33-2 38-11 48-11C51-11 56-8 64-1C82 15 74 12 92 30C121 3 157-11 199-11C294-11 360 38 360 130Z" transform="translate(944,0)"></path></g><g data-mml-node="mo" transform="translate(5505.2,0)"><path data-c="2061" d=""></path></g><g data-mml-node="TeXAtom" data-latex="{\theta}" data-mjx-texclass="ORD" transform="translate(5671.9,0)"><g data-mml-node="mi" data-latex="\theta"><path data-c="1D703" d="M164-11C209-11 256 16 302 70C382 163 455 335 455 498C455 539 448 582 434 625C416 678 382 705 333 705C288 705 243 678 196 624C116 532 42 360 42 196C42 94 75-11 164-11M332 675C365 675 382 637 382 560C382 517 372 452 352 367L155 367C180 460 204 529 229 574C266 641 301 675 332 675M145 327L341 327C322 246 299 181 274 132C235 57 199 19 164 19C131 19 115 58 115 135C115 185 125 249 145 327Z"></path></g></g><g data-mml-node="mo" data-latex="," transform="translate(6140.9,0)"><path data-c="2C" d="M139 106C107 106 86 82 86 50C86 20 109-5 139-5C153-5 165-1 174 8L175 0C175-63 154-117 112-160C105-168 101-174 101-178C101-188 105-193 114-193C123-193 135-181 152-158C186-110 203-57 203 0C203 53 185 106 139 106Z"></path></g><g data-mml-node="mi" data-latex="\sin" transform="translate(6585.6,0)"><path data-c="73" d="M360 130C360 206 308 254 205 274C158 283 128 294 112 305C96 316 88 332 88 351C88 398 123 421 193 421C261 421 298 383 303 306C304 298 309 294 319 294C330 294 336 303 336 321L336 420C336 439 331 448 321 448C310 448 295 430 285 422C260 439 229 448 193 448C104 448 33 408 33 323C33 289 47 260 76 237C111 208 144 202 207 191C272 178 305 149 305 104C305 47 270 18 199 18C130 18 86 64 67 155C64 168 59 175 50 175C39 175 33 165 33 146L33 17C33-2 38-11 48-11C51-11 56-8 64-1C82 15 74 12 92 30C121 3 157-11 199-11C294-11 360 38 360 130Z"></path><path data-c="69" d="M194 601C194 631 169 657 139 657C109 657 83 631 83 601C83 571 108 544 138 544C169 544 194 570 194 601M143 3L247 0L247 39C214 39 194 41 188 45C182 49 180 60 180 78L180 445L37 433L37 395C70 395 91 392 98 387C105 382 108 368 108 345L108 79C108 60 105 48 98 44C91 40 69 39 33 39L33 0Z" transform="translate(394,0)"></path><path data-c="6E" d="M314 413C359 413 382 378 382 307L382 79C382 60 379 48 372 44C365 40 343 38 306 38L306 0L421 3L535 0L535 38C503 38 482 39 472 42C462 45 458 52 458 64L458 251C458 298 457 331 454 350C444 411 399 442 320 442C257 442 210 412 179 352L179 442L32 431L32 393C68 393 90 390 98 384C106 378 109 365 109 342L109 79C109 60 105 48 98 44C91 40 69 38 32 38L32 0L147 3L261 0L261 38C224 38 203 40 196 44C189 48 185 60 185 79L185 259C185 340 236 413 314 413Z" transform="translate(672,0)"></path></g><g data-mml-node="mo" transform="translate(7813.6,0)"><path data-c="2061" d=""></path></g><g data-mml-node="TeXAtom" data-latex="{\theta}" data-mjx-texclass="ORD" transform="translate(7980.2,0)"><g data-mml-node="mi" data-latex="\theta"><path data-c="1D703" d="M164-11C209-11 256 16 302 70C382 163 455 335 455 498C455 539 448 582 434 625C416 678 382 705 333 705C288 705 243 678 196 624C116 532 42 360 42 196C42 94 75-11 164-11M332 675C365 675 382 637 382 560C382 517 372 452 352 367L155 367C180 460 204 529 229 574C266 641 301 675 332 675M145 327L341 327C322 246 299 181 274 132C235 57 199 19 164 19C131 19 115 58 115 135C115 185 125 249 145 327Z"></path></g></g><g data-mml-node="mo" data-latex=")" transform="translate(8449.2,0)"><path data-c="29" d="M78-245C138-199 188-131 229-40C268 47 288 129 288 208L288 292C288 371 268 453 229 540C188 631 138 699 78 745C75 747 72 748 71 748C62 748 57 743 57 734C57 730 59 726 62 723C114 683 156 617 187 526C214 447 228 369 228 292L228 208C228 131 214 53 187-26C156-117 114-183 62-223C59-227 57-231 57-234C57-243 62-248 71-248C72-248 75-247 78-245Z"></path></g></g></g></svg></mjx-container></p><p>  <mjx-container class="MathJax" jax="SVG" overflow="overflow" display="true"><svg style="vertical-align: -0.561ex;" xmlns="http://www.w3.org/2000/svg" width="22.133ex" height="2.253ex" role="img" focusable="false" viewBox="0 -748 9782.9 996"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="  (0, 1) \to (-\sin{\theta}, \cos{\theta})  "><g data-mml-node="mo" data-latex="("><path data-c="28" d="M318-248C327-248 332-243 332-234C332-231 330-227 327-223C275-183 233-117 202-26C175 53 161 131 161 208L161 292C161 369 175 447 202 526C233 617 275 683 327 723C330 726 332 730 332 734C332 743 327 748 318 748C317 748 314 747 311 745C251 699 201 631 160 540C121 453 101 371 101 292L101 208C101 129 121 47 160-40C201-131 251-199 311-245C314-247 317-248 318-248Z"></path></g><g data-mml-node="mn" data-latex="0" transform="translate(389,0)"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g><g data-mml-node="mo" data-latex="," transform="translate(889,0)"><path data-c="2C" d="M139 106C107 106 86 82 86 50C86 20 109-5 139-5C153-5 165-1 174 8L175 0C175-63 154-117 112-160C105-168 101-174 101-178C101-188 105-193 114-193C123-193 135-181 152-158C186-110 203-57 203 0C203 53 185 106 139 106Z"></path></g><g data-mml-node="mn" data-latex="1" transform="translate(1333.7,0)"><path data-c="31" d="M269 666C228 624 168 603 89 603L89 564C141 564 184 572 217 588L217 82C217 64 213 52 204 47C195 42 170 39 130 39L95 39L95 0C120 2 174 3 257 3C340 3 394 2 419 0L419 39L384 39C343 39 318 42 310 47C302 52 297 64 297 82L297 636C297 660 295 666 269 666Z"></path></g><g data-mml-node="mo" data-latex=")" transform="translate(1833.7,0)"><path data-c="29" d="M78-245C138-199 188-131 229-40C268 47 288 129 288 208L288 292C288 371 268 453 229 540C188 631 138 699 78 745C75 747 72 748 71 748C62 748 57 743 57 734C57 730 59 726 62 723C114 683 156 617 187 526C214 447 228 369 228 292L228 208C228 131 214 53 187-26C156-117 114-183 62-223C59-227 57-231 57-234C57-243 62-248 71-248C72-248 75-247 78-245Z"></path></g><g data-mml-node="mo" data-latex="\to" transform="translate(2500.4,0)"><path data-c="2192" d="M932 234C939 237 943 243 943 250C943 257 939 263 932 266C884 282 839 316 797 368C769 403 750 444 741 491C738 504 730 510 717 510C701 510 693 502 693 485L694 483L694 482C711 395 755 326 828 274L82 274C66 274 58 266 58 250C58 234 66 226 82 226L828 226C755 174 711 105 694 18L694 17L693 15C693-2 701-10 717-10C730-10 738-4 741 9C750 56 769 97 797 132C839 184 884 218 932 234Z"></path></g><g data-mml-node="mo" data-latex="(" transform="translate(3778.2,0)"><path data-c="28" d="M318-248C327-248 332-243 332-234C332-231 330-227 327-223C275-183 233-117 202-26C175 53 161 131 161 208L161 292C161 369 175 447 202 526C233 617 275 683 327 723C330 726 332 730 332 734C332 743 327 748 318 748C317 748 314 747 311 745C251 699 201 631 160 540C121 453 101 371 101 292L101 208C101 129 121 47 160-40C201-131 251-199 311-245C314-247 317-248 318-248Z"></path></g><g data-mml-node="mo" data-latex="-" transform="translate(4167.2,0)"><path data-c="2212" d="M698 270L80 270C64 270 56 263 56 250C56 237 64 230 80 230L698 230C714 230 722 237 722 250C722 262 710 270 698 270Z"></path></g><g data-mml-node="mi" data-latex="\sin" transform="translate(5111.9,0)"><path data-c="73" d="M360 130C360 206 308 254 205 274C158 283 128 294 112 305C96 316 88 332 88 351C88 398 123 421 193 421C261 421 298 383 303 306C304 298 309 294 319 294C330 294 336 303 336 321L336 420C336 439 331 448 321 448C310 448 295 430 285 422C260 439 229 448 193 448C104 448 33 408 33 323C33 289 47 260 76 237C111 208 144 202 207 191C272 178 305 149 305 104C305 47 270 18 199 18C130 18 86 64 67 155C64 168 59 175 50 175C39 175 33 165 33 146L33 17C33-2 38-11 48-11C51-11 56-8 64-1C82 15 74 12 92 30C121 3 157-11 199-11C294-11 360 38 360 130Z"></path><path data-c="69" d="M194 601C194 631 169 657 139 657C109 657 83 631 83 601C83 571 108 544 138 544C169 544 194 570 194 601M143 3L247 0L247 39C214 39 194 41 188 45C182 49 180 60 180 78L180 445L37 433L37 395C70 395 91 392 98 387C105 382 108 368 108 345L108 79C108 60 105 48 98 44C91 40 69 39 33 39L33 0Z" transform="translate(394,0)"></path><path data-c="6E" d="M314 413C359 413 382 378 382 307L382 79C382 60 379 48 372 44C365 40 343 38 306 38L306 0L421 3L535 0L535 38C503 38 482 39 472 42C462 45 458 52 458 64L458 251C458 298 457 331 454 350C444 411 399 442 320 442C257 442 210 412 179 352L179 442L32 431L32 393C68 393 90 390 98 384C106 378 109 365 109 342L109 79C109 60 105 48 98 44C91 40 69 38 32 38L32 0L147 3L261 0L261 38C224 38 203 40 196 44C189 48 185 60 185 79L185 259C185 340 236 413 314 413Z" transform="translate(672,0)"></path></g><g data-mml-node="mo" transform="translate(6339.9,0)"><path data-c="2061" d=""></path></g><g data-mml-node="TeXAtom" data-latex="{\theta}" data-mjx-texclass="ORD" transform="translate(6506.6,0)"><g data-mml-node="mi" data-latex="\theta"><path data-c="1D703" d="M164-11C209-11 256 16 302 70C382 163 455 335 455 498C455 539 448 582 434 625C416 678 382 705 333 705C288 705 243 678 196 624C116 532 42 360 42 196C42 94 75-11 164-11M332 675C365 675 382 637 382 560C382 517 372 452 352 367L155 367C180 460 204 529 229 574C266 641 301 675 332 675M145 327L341 327C322 246 299 181 274 132C235 57 199 19 164 19C131 19 115 58 115 135C115 185 125 249 145 327Z"></path></g></g><g data-mml-node="mo" data-latex="," transform="translate(6975.6,0)"><path data-c="2C" d="M139 106C107 106 86 82 86 50C86 20 109-5 139-5C153-5 165-1 174 8L175 0C175-63 154-117 112-160C105-168 101-174 101-178C101-188 105-193 114-193C123-193 135-181 152-158C186-110 203-57 203 0C203 53 185 106 139 106Z"></path></g><g data-mml-node="mi" data-latex="\cos" transform="translate(7420.2,0)"><path data-c="63" d="M251 416C293 416 325 406 347 386C323 383 306 361 306 338C306 305 322 289 355 289C388 289 404 306 404 339C404 410 327 448 250 448C188 448 137 426 96 380C55 334 34 279 34 216C34 155 55 101 96 56C137 11 187-11 248-11C298-11 337 3 365 32C388 55 403 78 411 102C414 111 415 117 415 121C415 130 409 134 398 134C390 134 385 130 382 122C361 55 320 21 257 21C228 21 200 34 172 61C139 92 123 144 123 218C123 318 161 416 251 416Z"></path><path data-c="6F" d="M249-11C311-11 363 11 406 55C449 99 471 152 471 214C471 277 450 332 408 378C366 424 313 448 250 448C187 448 135 424 92 378C49 332 28 277 28 214C28 152 49 99 92 55C135 11 188-11 249-11M250 21C202 21 166 42 141 85C125 113 117 159 117 222C117 283 125 327 140 355C164 398 200 419 249 419C296 419 332 398 357 357C374 329 382 284 382 222C382 106 348 21 250 21Z" transform="translate(444,0)"></path><path data-c="73" d="M360 130C360 206 308 254 205 274C158 283 128 294 112 305C96 316 88 332 88 351C88 398 123 421 193 421C261 421 298 383 303 306C304 298 309 294 319 294C330 294 336 303 336 321L336 420C336 439 331 448 321 448C310 448 295 430 285 422C260 439 229 448 193 448C104 448 33 408 33 323C33 289 47 260 76 237C111 208 144 202 207 191C272 178 305 149 305 104C305 47 270 18 199 18C130 18 86 64 67 155C64 168 59 175 50 175C39 175 33 165 33 146L33 17C33-2 38-11 48-11C51-11 56-8 64-1C82 15 74 12 92 30C121 3 157-11 199-11C294-11 360 38 360 130Z" transform="translate(944,0)"></path></g><g data-mml-node="mo" transform="translate(8758.2,0)"><path data-c="2061" d=""></path></g><g data-mml-node="TeXAtom" data-latex="{\theta}" data-mjx-texclass="ORD" transform="translate(8924.9,0)"><g data-mml-node="mi" data-latex="\theta"><path data-c="1D703" d="M164-11C209-11 256 16 302 70C382 163 455 335 455 498C455 539 448 582 434 625C416 678 382 705 333 705C288 705 243 678 196 624C116 532 42 360 42 196C42 94 75-11 164-11M332 675C365 675 382 637 382 560C382 517 372 452 352 367L155 367C180 460 204 529 229 574C266 641 301 675 332 675M145 327L341 327C322 246 299 181 274 132C235 57 199 19 164 19C131 19 115 58 115 135C115 185 125 249 145 327Z"></path></g></g><g data-mml-node="mo" data-latex=")" transform="translate(9393.9,0)"><path data-c="29" d="M78-245C138-199 188-131 229-40C268 47 288 129 288 208L288 292C288 371 268 453 229 540C188 631 138 699 78 745C75 747 72 748 71 748C62 748 57 743 57 734C57 730 59 726 62 723C114 683 156 617 187 526C214 447 228 369 228 292L228 208C228 131 214 53 187-26C156-117 114-183 62-223C59-227 57-231 57-234C57-243 62-248 71-248C72-248 75-247 78-245Z"></path></g></g></g></svg></mjx-container></p></li><li><p>由此可以写出变换矩阵 <mjx-container class="MathJax" jax="SVG" overflow="overflow"><svg style="vertical-align: 0;" xmlns="http://www.w3.org/2000/svg" width="2.362ex" height="1.545ex" role="img" focusable="false" viewBox="0 -683 1044 683"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="M"><g data-mml-node="mi" data-latex="M"><path data-c="1D440" d="M594 16C594 5 600 0 613 0L736 3C759 4 840 0 859 0C874 0 882 8 882 24C882 34 872 39 851 39C810 39 790 43 790 52C790 55 792 62 795 75L927 602C932 623 942 636 955 641C961 643 979 644 1008 644C1033 644 1044 645 1044 668C1044 678 1034 683 1013 683L882 683C853 683 853 681 840 662L484 108L408 657C404 682 402 683 373 683L237 683C215 683 204 682 204 660C204 649 215 644 236 644C256 644 297 647 297 631C297 629 296 623 293 613L167 110C158 72 135 49 100 42C75 39 42 43 42 16C42 5 48 0 60 0C78 0 141 3 159 3C178 3 242 0 261 0C276 0 283 8 283 24C283 33 276 38 261 39C219 39 198 52 198 78C198 82 199 89 202 100L332 621L415 26C418 9 424 0 434 0C442 0 450 7 459 20L848 627L712 82C706 60 696 47 681 42C675 40 656 39 625 39C604 39 594 37 594 16Z"></path></g></g></g></svg></mjx-container> ：</p><p>  <mjx-container class="MathJax" jax="SVG" overflow="overflow" display="true"><svg style="vertical-align: -2.152ex;" xmlns="http://www.w3.org/2000/svg" width="29.894ex" height="5.435ex" role="img" focusable="false" viewBox="0 -1451.2 13213 2402.4"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="  \begin{pmatrix}  x’ \\  y’  \end{pmatrix} =  \begin{pmatrix}  \cos{\theta} &amp; -\sin{\theta} \\  \sin{\theta} &amp; \cos{\theta}  \end{pmatrix}  \begin{pmatrix}  x \\  y  \end{pmatrix}  "><g data-mml-node="mrow" data-latex="{pmatrix}"><g data-mml-node="mo"><path data-c="28" d="M660-946C675-946 682-939 682-924C682-917 679-911 674-907C606-856 545-777 490-670C393-480 320-209 320 65L320 435C320 560 335 686 364 813C416 1043 523 1293 674 1407C679 1411 682 1417 682 1424C682 1439 675 1446 660 1446C656 1446 652 1444 647 1441C574 1386 505 1304 440 1195C327 1005 226 718 226 435L226 65C226-202 320-477 422-664C490-787 565-880 647-941C652-944 656-946 660-946Z"></path></g><g data-mml-node="mtable" transform="translate(736,0)"><g data-mml-node="mtr" transform="translate(0,700)"><g data-mml-node="mtd"><g data-mml-node="msup"><g data-mml-node="mi" data-latex="x"><path data-c="1D465" d="M527 373C527 419 482 442 432 442C389 442 355 419 329 373C308 419 273 442 222 442C173 442 133 419 101 374C74 335 60 306 60 287C60 278 65 273 75 273C84 273 90 278 92 287C111 345 153 413 220 413C253 413 269 392 269 351C269 330 251 252 216 118C199 51 169 18 126 18C112 18 99 21 88 26C114 36 127 54 127 80C127 106 114 119 87 119C54 119 29 91 29 58C29 12 76-11 125-11C167-11 201 12 228 58C247 12 283-11 335-11C383-11 423 12 455 57C482 96 496 125 496 144C496 153 491 158 481 158C472 158 467 153 464 144C447 87 402 18 337 18C304 18 287 38 287 79C287 92 292 120 303 165L337 300C356 375 387 413 431 413C445 413 458 410 469 405C442 396 429 378 429 351C429 325 443 312 470 312C502 312 527 341 527 373Z"></path></g><g data-mml-node="mo" transform="translate(605,363) scale(0.707)" data-latex="’"><path data-c="2032" d="M284 549C259 549 242 539 233 518L65 96L110 96L332 463C337 472 340 482 340 493C340 523 314 549 284 549Z"></path></g></g></g></g><g data-mml-node="mtr" transform="translate(0,-701.2)"><g data-mml-node="mtd" transform="translate(41,0)"><g data-mml-node="msup"><g data-mml-node="mi" data-latex="y"><path data-c="1D466" d="M163 442C118 442 83 417 58 367C39 328 29 301 29 286C29 277 34 272 45 272C59 272 60 278 64 293C87 372 119 412 160 412C173 412 180 403 180 385C180 369 175 346 164 317C126 214 107 145 107 108C107 32 154-13 231-13C264-13 295-1 323 23C288-109 233-175 158-175C124-175 101-164 89-142C129-140 149-121 149-85C149-60 136-47 109-47C72-47 50-78 50-115C50-170 100-205 158-205C273-205 367-99 392-1L486 377C489 388 490 396 490 401C490 421 479 431 458 431C442 431 429 423 420 408C414 387 409 369 406 354L342 97C332 61 279 16 234 16C196 16 177 41 177 92C177 134 194 198 227 284C240 319 247 343 247 357C247 406 212 442 163 442Z"></path></g><g data-mml-node="mo" transform="translate(523,363) scale(0.707)" data-latex="’"><path data-c="2032" d="M284 549C259 549 242 539 233 518L65 96L110 96L332 463C337 472 340 482 340 493C340 523 314 549 284 549Z"></path></g></g></g></g></g><g data-mml-node="mo" transform="translate(1678.8,0)"><path data-c="29" d="M89-941C162-886 231-804 296-695C409-506 510-218 510 65L510 435C510 702 416 977 314 1164C246 1287 171 1380 89 1441C84 1444 80 1446 76 1446C61 1446 54 1439 54 1424C54 1417 57 1411 62 1407C130 1356 191 1277 246 1170C343 980 416 709 416 435L416 65C416-60 401-186 372-313C320-543 213-793 62-907C57-911 54-917 54-924C54-939 61-946 76-946C80-946 84-944 89-941Z"></path></g></g><g data-mml-node="mo" data-latex="=" transform="translate(2692.6,0)"><path data-c="3D" d="M698 367L80 367C64 367 56 359 56 344C56 329 64 321 80 321L698 321C714 321 722 329 722 344C722 356 711 367 698 367M698 179L80 179C64 179 56 171 56 156C56 141 64 133 80 133L698 133C714 133 722 141 722 156C722 169 711 179 698 179Z"></path></g><g data-mml-node="mrow" data-latex="{pmatrix}" transform="translate(3748.3,0)"><g data-mml-node="mo"><path data-c="28" d="M660-946C675-946 682-939 682-924C682-917 679-911 674-907C606-856 545-777 490-670C393-480 320-209 320 65L320 435C320 560 335 686 364 813C416 1043 523 1293 674 1407C679 1411 682 1417 682 1424C682 1439 675 1446 660 1446C656 1446 652 1444 647 1441C574 1386 505 1304 440 1195C327 1005 226 718 226 435L226 65C226-202 320-477 422-664C490-787 565-880 647-941C652-944 656-946 660-946Z"></path></g><g data-mml-node="mtable" transform="translate(736,0)"><g data-mml-node="mtr" transform="translate(0,700)"><g data-mml-node="mtd"><g data-mml-node="mi" data-latex="\cos"><path data-c="63" d="M251 416C293 416 325 406 347 386C323 383 306 361 306 338C306 305 322 289 355 289C388 289 404 306 404 339C404 410 327 448 250 448C188 448 137 426 96 380C55 334 34 279 34 216C34 155 55 101 96 56C137 11 187-11 248-11C298-11 337 3 365 32C388 55 403 78 411 102C414 111 415 117 415 121C415 130 409 134 398 134C390 134 385 130 382 122C361 55 320 21 257 21C228 21 200 34 172 61C139 92 123 144 123 218C123 318 161 416 251 416Z"></path><path data-c="6F" d="M249-11C311-11 363 11 406 55C449 99 471 152 471 214C471 277 450 332 408 378C366 424 313 448 250 448C187 448 135 424 92 378C49 332 28 277 28 214C28 152 49 99 92 55C135 11 188-11 249-11M250 21C202 21 166 42 141 85C125 113 117 159 117 222C117 283 125 327 140 355C164 398 200 419 249 419C296 419 332 398 357 357C374 329 382 284 382 222C382 106 348 21 250 21Z" transform="translate(444,0)"></path><path data-c="73" d="M360 130C360 206 308 254 205 274C158 283 128 294 112 305C96 316 88 332 88 351C88 398 123 421 193 421C261 421 298 383 303 306C304 298 309 294 319 294C330 294 336 303 336 321L336 420C336 439 331 448 321 448C310 448 295 430 285 422C260 439 229 448 193 448C104 448 33 408 33 323C33 289 47 260 76 237C111 208 144 202 207 191C272 178 305 149 305 104C305 47 270 18 199 18C130 18 86 64 67 155C64 168 59 175 50 175C39 175 33 165 33 146L33 17C33-2 38-11 48-11C51-11 56-8 64-1C82 15 74 12 92 30C121 3 157-11 199-11C294-11 360 38 360 130Z" transform="translate(944,0)"></path></g><g data-mml-node="mo" transform="translate(1338,0)"><path data-c="2061" d=""></path></g><g data-mml-node="TeXAtom" data-latex="{\theta}" data-mjx-texclass="ORD" transform="translate(1504.7,0)"><g data-mml-node="mi" data-latex="\theta"><path data-c="1D703" d="M164-11C209-11 256 16 302 70C382 163 455 335 455 498C455 539 448 582 434 625C416 678 382 705 333 705C288 705 243 678 196 624C116 532 42 360 42 196C42 94 75-11 164-11M332 675C365 675 382 637 382 560C382 517 372 452 352 367L155 367C180 460 204 529 229 574C266 641 301 675 332 675M145 327L341 327C322 246 299 181 274 132C235 57 199 19 164 19C131 19 115 58 115 135C115 185 125 249 145 327Z"></path></g></g></g><g data-mml-node="mtd" transform="translate(2973.7,0)"><g data-mml-node="mo" data-latex="-"><path data-c="2212" d="M698 270L80 270C64 270 56 263 56 250C56 237 64 230 80 230L698 230C714 230 722 237 722 250C722 262 710 270 698 270Z"></path></g><g data-mml-node="mi" data-latex="\sin" transform="translate(944.7,0)"><path data-c="73" d="M360 130C360 206 308 254 205 274C158 283 128 294 112 305C96 316 88 332 88 351C88 398 123 421 193 421C261 421 298 383 303 306C304 298 309 294 319 294C330 294 336 303 336 321L336 420C336 439 331 448 321 448C310 448 295 430 285 422C260 439 229 448 193 448C104 448 33 408 33 323C33 289 47 260 76 237C111 208 144 202 207 191C272 178 305 149 305 104C305 47 270 18 199 18C130 18 86 64 67 155C64 168 59 175 50 175C39 175 33 165 33 146L33 17C33-2 38-11 48-11C51-11 56-8 64-1C82 15 74 12 92 30C121 3 157-11 199-11C294-11 360 38 360 130Z"></path><path data-c="69" d="M194 601C194 631 169 657 139 657C109 657 83 631 83 601C83 571 108 544 138 544C169 544 194 570 194 601M143 3L247 0L247 39C214 39 194 41 188 45C182 49 180 60 180 78L180 445L37 433L37 395C70 395 91 392 98 387C105 382 108 368 108 345L108 79C108 60 105 48 98 44C91 40 69 39 33 39L33 0Z" transform="translate(394,0)"></path><path data-c="6E" d="M314 413C359 413 382 378 382 307L382 79C382 60 379 48 372 44C365 40 343 38 306 38L306 0L421 3L535 0L535 38C503 38 482 39 472 42C462 45 458 52 458 64L458 251C458 298 457 331 454 350C444 411 399 442 320 442C257 442 210 412 179 352L179 442L32 431L32 393C68 393 90 390 98 384C106 378 109 365 109 342L109 79C109 60 105 48 98 44C91 40 69 38 32 38L32 0L147 3L261 0L261 38C224 38 203 40 196 44C189 48 185 60 185 79L185 259C185 340 236 413 314 413Z" transform="translate(672,0)"></path></g><g data-mml-node="mo" transform="translate(2172.7,0)"><path data-c="2061" d=""></path></g><g data-mml-node="TeXAtom" data-latex="{\theta}" data-mjx-texclass="ORD" transform="translate(2339.3,0)"><g data-mml-node="mi" data-latex="\theta"><path data-c="1D703" d="M164-11C209-11 256 16 302 70C382 163 455 335 455 498C455 539 448 582 434 625C416 678 382 705 333 705C288 705 243 678 196 624C116 532 42 360 42 196C42 94 75-11 164-11M332 675C365 675 382 637 382 560C382 517 372 452 352 367L155 367C180 460 204 529 229 574C266 641 301 675 332 675M145 327L341 327C322 246 299 181 274 132C235 57 199 19 164 19C131 19 115 58 115 135C115 185 125 249 145 327Z"></path></g></g></g></g><g data-mml-node="mtr" transform="translate(0,-700)"><g data-mml-node="mtd" transform="translate(55,0)"><g data-mml-node="mi" data-latex="\sin"><path data-c="73" d="M360 130C360 206 308 254 205 274C158 283 128 294 112 305C96 316 88 332 88 351C88 398 123 421 193 421C261 421 298 383 303 306C304 298 309 294 319 294C330 294 336 303 336 321L336 420C336 439 331 448 321 448C310 448 295 430 285 422C260 439 229 448 193 448C104 448 33 408 33 323C33 289 47 260 76 237C111 208 144 202 207 191C272 178 305 149 305 104C305 47 270 18 199 18C130 18 86 64 67 155C64 168 59 175 50 175C39 175 33 165 33 146L33 17C33-2 38-11 48-11C51-11 56-8 64-1C82 15 74 12 92 30C121 3 157-11 199-11C294-11 360 38 360 130Z"></path><path data-c="69" d="M194 601C194 631 169 657 139 657C109 657 83 631 83 601C83 571 108 544 138 544C169 544 194 570 194 601M143 3L247 0L247 39C214 39 194 41 188 45C182 49 180 60 180 78L180 445L37 433L37 395C70 395 91 392 98 387C105 382 108 368 108 345L108 79C108 60 105 48 98 44C91 40 69 39 33 39L33 0Z" transform="translate(394,0)"></path><path data-c="6E" d="M314 413C359 413 382 378 382 307L382 79C382 60 379 48 372 44C365 40 343 38 306 38L306 0L421 3L535 0L535 38C503 38 482 39 472 42C462 45 458 52 458 64L458 251C458 298 457 331 454 350C444 411 399 442 320 442C257 442 210 412 179 352L179 442L32 431L32 393C68 393 90 390 98 384C106 378 109 365 109 342L109 79C109 60 105 48 98 44C91 40 69 38 32 38L32 0L147 3L261 0L261 38C224 38 203 40 196 44C189 48 185 60 185 79L185 259C185 340 236 413 314 413Z" transform="translate(672,0)"></path></g><g data-mml-node="mo" transform="translate(1228,0)"><path data-c="2061" d=""></path></g><g data-mml-node="TeXAtom" data-latex="{\theta}" data-mjx-texclass="ORD" transform="translate(1394.7,0)"><g data-mml-node="mi" data-latex="\theta"><path data-c="1D703" d="M164-11C209-11 256 16 302 70C382 163 455 335 455 498C455 539 448 582 434 625C416 678 382 705 333 705C288 705 243 678 196 624C116 532 42 360 42 196C42 94 75-11 164-11M332 675C365 675 382 637 382 560C382 517 372 452 352 367L155 367C180 460 204 529 229 574C266 641 301 675 332 675M145 327L341 327C322 246 299 181 274 132C235 57 199 19 164 19C131 19 115 58 115 135C115 185 125 249 145 327Z"></path></g></g></g><g data-mml-node="mtd" transform="translate(3391,0)"><g data-mml-node="mi" data-latex="\cos"><path data-c="63" d="M251 416C293 416 325 406 347 386C323 383 306 361 306 338C306 305 322 289 355 289C388 289 404 306 404 339C404 410 327 448 250 448C188 448 137 426 96 380C55 334 34 279 34 216C34 155 55 101 96 56C137 11 187-11 248-11C298-11 337 3 365 32C388 55 403 78 411 102C414 111 415 117 415 121C415 130 409 134 398 134C390 134 385 130 382 122C361 55 320 21 257 21C228 21 200 34 172 61C139 92 123 144 123 218C123 318 161 416 251 416Z"></path><path data-c="6F" d="M249-11C311-11 363 11 406 55C449 99 471 152 471 214C471 277 450 332 408 378C366 424 313 448 250 448C187 448 135 424 92 378C49 332 28 277 28 214C28 152 49 99 92 55C135 11 188-11 249-11M250 21C202 21 166 42 141 85C125 113 117 159 117 222C117 283 125 327 140 355C164 398 200 419 249 419C296 419 332 398 357 357C374 329 382 284 382 222C382 106 348 21 250 21Z" transform="translate(444,0)"></path><path data-c="73" d="M360 130C360 206 308 254 205 274C158 283 128 294 112 305C96 316 88 332 88 351C88 398 123 421 193 421C261 421 298 383 303 306C304 298 309 294 319 294C330 294 336 303 336 321L336 420C336 439 331 448 321 448C310 448 295 430 285 422C260 439 229 448 193 448C104 448 33 408 33 323C33 289 47 260 76 237C111 208 144 202 207 191C272 178 305 149 305 104C305 47 270 18 199 18C130 18 86 64 67 155C64 168 59 175 50 175C39 175 33 165 33 146L33 17C33-2 38-11 48-11C51-11 56-8 64-1C82 15 74 12 92 30C121 3 157-11 199-11C294-11 360 38 360 130Z" transform="translate(944,0)"></path></g><g data-mml-node="mo" transform="translate(1338,0)"><path data-c="2061" d=""></path></g><g data-mml-node="TeXAtom" data-latex="{\theta}" data-mjx-texclass="ORD" transform="translate(1504.7,0)"><g data-mml-node="mi" data-latex="\theta"><path data-c="1D703" d="M164-11C209-11 256 16 302 70C382 163 455 335 455 498C455 539 448 582 434 625C416 678 382 705 333 705C288 705 243 678 196 624C116 532 42 360 42 196C42 94 75-11 164-11M332 675C365 675 382 637 382 560C382 517 372 452 352 367L155 367C180 460 204 529 229 574C266 641 301 675 332 675M145 327L341 327C322 246 299 181 274 132C235 57 199 19 164 19C131 19 115 58 115 135C115 185 125 249 145 327Z"></path></g></g></g></g></g><g data-mml-node="mo" transform="translate(6518,0)"><path data-c="29" d="M89-941C162-886 231-804 296-695C409-506 510-218 510 65L510 435C510 702 416 977 314 1164C246 1287 171 1380 89 1441C84 1444 80 1446 76 1446C61 1446 54 1439 54 1424C54 1417 57 1411 62 1407C130 1356 191 1277 246 1170C343 980 416 709 416 435L416 65C416-60 401-186 372-313C320-543 213-793 62-907C57-911 54-917 54-924C54-939 61-946 76-946C80-946 84-944 89-941Z"></path></g></g><g data-mml-node="mrow" data-latex="{pmatrix}" transform="translate(11169,0)"><g data-mml-node="mo"><path data-c="28" d="M660-946C675-946 682-939 682-924C682-917 679-911 674-907C606-856 545-777 490-670C393-480 320-209 320 65L320 435C320 560 335 686 364 813C416 1043 523 1293 674 1407C679 1411 682 1417 682 1424C682 1439 675 1446 660 1446C656 1446 652 1444 647 1441C574 1386 505 1304 440 1195C327 1005 226 718 226 435L226 65C226-202 320-477 422-664C490-787 565-880 647-941C652-944 656-946 660-946Z"></path></g><g data-mml-node="mtable" transform="translate(736,0)"><g data-mml-node="mtr" transform="translate(0,700)"><g data-mml-node="mtd"><g data-mml-node="mi" data-latex="x"><path data-c="1D465" d="M527 373C527 419 482 442 432 442C389 442 355 419 329 373C308 419 273 442 222 442C173 442 133 419 101 374C74 335 60 306 60 287C60 278 65 273 75 273C84 273 90 278 92 287C111 345 153 413 220 413C253 413 269 392 269 351C269 330 251 252 216 118C199 51 169 18 126 18C112 18 99 21 88 26C114 36 127 54 127 80C127 106 114 119 87 119C54 119 29 91 29 58C29 12 76-11 125-11C167-11 201 12 228 58C247 12 283-11 335-11C383-11 423 12 455 57C482 96 496 125 496 144C496 153 491 158 481 158C472 158 467 153 464 144C447 87 402 18 337 18C304 18 287 38 287 79C287 92 292 120 303 165L337 300C356 375 387 413 431 413C445 413 458 410 469 405C442 396 429 378 429 351C429 325 443 312 470 312C502 312 527 341 527 373Z"></path></g></g></g><g data-mml-node="mtr" transform="translate(0,-700)"><g data-mml-node="mtd" transform="translate(41,0)"><g data-mml-node="mi" data-latex="y"><path data-c="1D466" d="M163 442C118 442 83 417 58 367C39 328 29 301 29 286C29 277 34 272 45 272C59 272 60 278 64 293C87 372 119 412 160 412C173 412 180 403 180 385C180 369 175 346 164 317C126 214 107 145 107 108C107 32 154-13 231-13C264-13 295-1 323 23C288-109 233-175 158-175C124-175 101-164 89-142C129-140 149-121 149-85C149-60 136-47 109-47C72-47 50-78 50-115C50-170 100-205 158-205C273-205 367-99 392-1L486 377C489 388 490 396 490 401C490 421 479 431 458 431C442 431 429 423 420 408C414 387 409 369 406 354L342 97C332 61 279 16 234 16C196 16 177 41 177 92C177 134 194 198 227 284C240 319 247 343 247 357C247 406 212 442 163 442Z"></path></g></g></g></g><g data-mml-node="mo" transform="translate(1308,0)"><path data-c="29" d="M89-941C162-886 231-804 296-695C409-506 510-218 510 65L510 435C510 702 416 977 314 1164C246 1287 171 1380 89 1441C84 1444 80 1446 76 1446C61 1446 54 1439 54 1424C54 1417 57 1411 62 1407C130 1356 191 1277 246 1170C343 980 416 709 416 435L416 65C416-60 401-186 372-313C320-543 213-793 62-907C57-911 54-917 54-924C54-939 61-946 76-946C80-946 84-944 89-941Z"></path></g></g></g></g></svg></mjx-container></p></li></ul><h3 id="缩放-Scale"><a href="#缩放-Scale" class="headerlink" title="缩放 Scale"></a>缩放 Scale</h3><ul><li><p>同理可得缩放矩阵 <mjx-container class="MathJax" jax="SVG" overflow="overflow"><svg style="vertical-align: 0;" xmlns="http://www.w3.org/2000/svg" width="2.362ex" height="1.545ex" role="img" focusable="false" viewBox="0 -683 1044 683"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="M"><g data-mml-node="mi" data-latex="M"><path data-c="1D440" d="M594 16C594 5 600 0 613 0L736 3C759 4 840 0 859 0C874 0 882 8 882 24C882 34 872 39 851 39C810 39 790 43 790 52C790 55 792 62 795 75L927 602C932 623 942 636 955 641C961 643 979 644 1008 644C1033 644 1044 645 1044 668C1044 678 1034 683 1013 683L882 683C853 683 853 681 840 662L484 108L408 657C404 682 402 683 373 683L237 683C215 683 204 682 204 660C204 649 215 644 236 644C256 644 297 647 297 631C297 629 296 623 293 613L167 110C158 72 135 49 100 42C75 39 42 43 42 16C42 5 48 0 60 0C78 0 141 3 159 3C178 3 242 0 261 0C276 0 283 8 283 24C283 33 276 38 261 39C219 39 198 52 198 78C198 82 199 89 202 100L332 621L415 26C418 9 424 0 434 0C442 0 450 7 459 20L848 627L712 82C706 60 696 47 681 42C675 40 656 39 625 39C604 39 594 37 594 16Z"></path></g></g></g></svg></mjx-container> ：</p><p>  <mjx-container class="MathJax" jax="SVG" overflow="overflow" display="true"><svg style="vertical-align: -2.149ex;" xmlns="http://www.w3.org/2000/svg" width="21.761ex" height="5.43ex" role="img" focusable="false" viewBox="0 -1450 9618.2 2400"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="  \begin{pmatrix}  ax \\  by  \end{pmatrix} =  \begin{pmatrix}  a &amp; 0 \\  0 &amp; b  \end{pmatrix}  \begin{pmatrix}  x \\  y  \end{pmatrix}  "><g data-mml-node="mrow" data-latex="{pmatrix}"><g data-mml-node="mo"><path data-c="28" d="M660-946C675-946 682-939 682-924C682-917 679-911 674-907C606-856 545-777 490-670C393-480 320-209 320 65L320 435C320 560 335 686 364 813C416 1043 523 1293 674 1407C679 1411 682 1417 682 1424C682 1439 675 1446 660 1446C656 1446 652 1444 647 1441C574 1386 505 1304 440 1195C327 1005 226 718 226 435L226 65C226-202 320-477 422-664C490-787 565-880 647-941C652-944 656-946 660-946Z"></path></g><g data-mml-node="mtable" transform="translate(736,0)"><g data-mml-node="mtr" transform="translate(0,700)"><g data-mml-node="mtd"><g data-mml-node="mi" data-latex="a"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g><g data-mml-node="mi" data-latex="x" transform="translate(529,0)"><path data-c="1D465" d="M527 373C527 419 482 442 432 442C389 442 355 419 329 373C308 419 273 442 222 442C173 442 133 419 101 374C74 335 60 306 60 287C60 278 65 273 75 273C84 273 90 278 92 287C111 345 153 413 220 413C253 413 269 392 269 351C269 330 251 252 216 118C199 51 169 18 126 18C112 18 99 21 88 26C114 36 127 54 127 80C127 106 114 119 87 119C54 119 29 91 29 58C29 12 76-11 125-11C167-11 201 12 228 58C247 12 283-11 335-11C383-11 423 12 455 57C482 96 496 125 496 144C496 153 491 158 481 158C472 158 467 153 464 144C447 87 402 18 337 18C304 18 287 38 287 79C287 92 292 120 303 165L337 300C356 375 387 413 431 413C445 413 458 410 469 405C442 396 429 378 429 351C429 325 443 312 470 312C502 312 527 341 527 373Z"></path></g></g></g><g data-mml-node="mtr" transform="translate(0,-700)"><g data-mml-node="mtd" transform="translate(91,0)"><g data-mml-node="mi" data-latex="b"><path data-c="1D44F" d="M281 445C245 445 209 428 174 394L243 679C241 688 238 694 226 694C193 694 120 685 107 684C92 682 84 675 84 660C84 650 93 645 112 645C131 645 157 646 157 632C157 628 152 608 143 571L63 249C52 207 47 173 47 148C47 62 93-11 175-11C240-11 297 22 347 89C392 151 415 216 415 283C415 370 364 445 281 445M279 415C318 415 337 385 337 326C337 299 331 263 319 218C297 133 268 75 233 44C213 27 194 19 175 19C134 19 114 51 114 115C114 137 119 170 129 214L151 304C154 319 159 330 165 338C204 389 242 415 279 415Z"></path></g><g data-mml-node="mi" data-latex="y" transform="translate(429,0)"><path data-c="1D466" d="M163 442C118 442 83 417 58 367C39 328 29 301 29 286C29 277 34 272 45 272C59 272 60 278 64 293C87 372 119 412 160 412C173 412 180 403 180 385C180 369 175 346 164 317C126 214 107 145 107 108C107 32 154-13 231-13C264-13 295-1 323 23C288-109 233-175 158-175C124-175 101-164 89-142C129-140 149-121 149-85C149-60 136-47 109-47C72-47 50-78 50-115C50-170 100-205 158-205C273-205 367-99 392-1L486 377C489 388 490 396 490 401C490 421 479 431 458 431C442 431 429 423 420 408C414 387 409 369 406 354L342 97C332 61 279 16 234 16C196 16 177 41 177 92C177 134 194 198 227 284C240 319 247 343 247 357C247 406 212 442 163 442Z"></path></g></g></g></g><g data-mml-node="mo" transform="translate(1837,0)"><path data-c="29" d="M89-941C162-886 231-804 296-695C409-506 510-218 510 65L510 435C510 702 416 977 314 1164C246 1287 171 1380 89 1441C84 1444 80 1446 76 1446C61 1446 54 1439 54 1424C54 1417 57 1411 62 1407C130 1356 191 1277 246 1170C343 980 416 709 416 435L416 65C416-60 401-186 372-313C320-543 213-793 62-907C57-911 54-917 54-924C54-939 61-946 76-946C80-946 84-944 89-941Z"></path></g></g><g data-mml-node="mo" data-latex="=" transform="translate(2850.8,0)"><path data-c="3D" d="M698 367L80 367C64 367 56 359 56 344C56 329 64 321 80 321L698 321C714 321 722 329 722 344C722 356 711 367 698 367M698 179L80 179C64 179 56 171 56 156C56 141 64 133 80 133L698 133C714 133 722 141 722 156C722 169 711 179 698 179Z"></path></g><g data-mml-node="mrow" data-latex="{pmatrix}" transform="translate(3906.6,0)"><g data-mml-node="mo"><path data-c="28" d="M660-946C675-946 682-939 682-924C682-917 679-911 674-907C606-856 545-777 490-670C393-480 320-209 320 65L320 435C320 560 335 686 364 813C416 1043 523 1293 674 1407C679 1411 682 1417 682 1424C682 1439 675 1446 660 1446C656 1446 652 1444 647 1441C574 1386 505 1304 440 1195C327 1005 226 718 226 435L226 65C226-202 320-477 422-664C490-787 565-880 647-941C652-944 656-946 660-946Z"></path></g><g data-mml-node="mtable" transform="translate(736,0)"><g data-mml-node="mtr" transform="translate(0,700)"><g data-mml-node="mtd"><g data-mml-node="mi" data-latex="a"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g></g><g data-mml-node="mtd" transform="translate(1529,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g></g><g data-mml-node="mtr" transform="translate(0,-700)"><g data-mml-node="mtd" transform="translate(14.5,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(1564.5,0)"><g data-mml-node="mi" data-latex="b"><path data-c="1D44F" d="M281 445C245 445 209 428 174 394L243 679C241 688 238 694 226 694C193 694 120 685 107 684C92 682 84 675 84 660C84 650 93 645 112 645C131 645 157 646 157 632C157 628 152 608 143 571L63 249C52 207 47 173 47 148C47 62 93-11 175-11C240-11 297 22 347 89C392 151 415 216 415 283C415 370 364 445 281 445M279 415C318 415 337 385 337 326C337 299 331 263 319 218C297 133 268 75 233 44C213 27 194 19 175 19C134 19 114 51 114 115C114 137 119 170 129 214L151 304C154 319 159 330 165 338C204 389 242 415 279 415Z"></path></g></g></g></g><g data-mml-node="mo" transform="translate(2765,0)"><path data-c="29" d="M89-941C162-886 231-804 296-695C409-506 510-218 510 65L510 435C510 702 416 977 314 1164C246 1287 171 1380 89 1441C84 1444 80 1446 76 1446C61 1446 54 1439 54 1424C54 1417 57 1411 62 1407C130 1356 191 1277 246 1170C343 980 416 709 416 435L416 65C416-60 401-186 372-313C320-543 213-793 62-907C57-911 54-917 54-924C54-939 61-946 76-946C80-946 84-944 89-941Z"></path></g></g><g data-mml-node="mrow" data-latex="{pmatrix}" transform="translate(7574.2,0)"><g data-mml-node="mo"><path data-c="28" d="M660-946C675-946 682-939 682-924C682-917 679-911 674-907C606-856 545-777 490-670C393-480 320-209 320 65L320 435C320 560 335 686 364 813C416 1043 523 1293 674 1407C679 1411 682 1417 682 1424C682 1439 675 1446 660 1446C656 1446 652 1444 647 1441C574 1386 505 1304 440 1195C327 1005 226 718 226 435L226 65C226-202 320-477 422-664C490-787 565-880 647-941C652-944 656-946 660-946Z"></path></g><g data-mml-node="mtable" transform="translate(736,0)"><g data-mml-node="mtr" transform="translate(0,700)"><g data-mml-node="mtd"><g data-mml-node="mi" data-latex="x"><path data-c="1D465" d="M527 373C527 419 482 442 432 442C389 442 355 419 329 373C308 419 273 442 222 442C173 442 133 419 101 374C74 335 60 306 60 287C60 278 65 273 75 273C84 273 90 278 92 287C111 345 153 413 220 413C253 413 269 392 269 351C269 330 251 252 216 118C199 51 169 18 126 18C112 18 99 21 88 26C114 36 127 54 127 80C127 106 114 119 87 119C54 119 29 91 29 58C29 12 76-11 125-11C167-11 201 12 228 58C247 12 283-11 335-11C383-11 423 12 455 57C482 96 496 125 496 144C496 153 491 158 481 158C472 158 467 153 464 144C447 87 402 18 337 18C304 18 287 38 287 79C287 92 292 120 303 165L337 300C356 375 387 413 431 413C445 413 458 410 469 405C442 396 429 378 429 351C429 325 443 312 470 312C502 312 527 341 527 373Z"></path></g></g></g><g data-mml-node="mtr" transform="translate(0,-700)"><g data-mml-node="mtd" transform="translate(41,0)"><g data-mml-node="mi" data-latex="y"><path data-c="1D466" d="M163 442C118 442 83 417 58 367C39 328 29 301 29 286C29 277 34 272 45 272C59 272 60 278 64 293C87 372 119 412 160 412C173 412 180 403 180 385C180 369 175 346 164 317C126 214 107 145 107 108C107 32 154-13 231-13C264-13 295-1 323 23C288-109 233-175 158-175C124-175 101-164 89-142C129-140 149-121 149-85C149-60 136-47 109-47C72-47 50-78 50-115C50-170 100-205 158-205C273-205 367-99 392-1L486 377C489 388 490 396 490 401C490 421 479 431 458 431C442 431 429 423 420 408C414 387 409 369 406 354L342 97C332 61 279 16 234 16C196 16 177 41 177 92C177 134 194 198 227 284C240 319 247 343 247 357C247 406 212 442 163 442Z"></path></g></g></g></g><g data-mml-node="mo" transform="translate(1308,0)"><path data-c="29" d="M89-941C162-886 231-804 296-695C409-506 510-218 510 65L510 435C510 702 416 977 314 1164C246 1287 171 1380 89 1441C84 1444 80 1446 76 1446C61 1446 54 1439 54 1424C54 1417 57 1411 62 1407C130 1356 191 1277 246 1170C343 980 416 709 416 435L416 65C416-60 401-186 372-313C320-543 213-793 62-907C57-911 54-917 54-924C54-939 61-946 76-946C80-946 84-944 89-941Z"></path></g></g></g></g></svg></mjx-container></p></li></ul><h2 id="平移变换-齐次坐标-Translation-Homogeneous-Coordinates"><a href="#平移变换-齐次坐标-Translation-Homogeneous-Coordinates" class="headerlink" title="平移变换 &amp; 齐次坐标 Translation &amp; Homogeneous Coordinates"></a>平移变换 &amp; 齐次坐标 Translation &amp; Homogeneous Coordinates</h2><ul><li><p>由于平移变换并非线性变换，因此无法使用一个与空间维度同维的方阵来表示。解决方法是给变换矩阵添加一个新的维度，也就是引入齐次坐标 Homogeneous coordinates，以此来为坐标值增加平移量。</p></li><li><p>在二维里，我们把点写成三维的形式：</p><p>  <mjx-container class="MathJax" jax="SVG" overflow="overflow" display="true"><svg style="vertical-align: -3.733ex;" xmlns="http://www.w3.org/2000/svg" width="5.253ex" height="8.597ex" role="img" focusable="false" viewBox="0 -2150 2322 3800"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="  \begin{pmatrix}  x \\  y \\  1  \end{pmatrix}  "><g data-mml-node="mrow" data-latex="\begin{pmatrix}  x \\  y \\  1  \end{pmatrix}"><g data-mml-node="mo"><path data-c="239B" d="M813 1450C820 1455 823 1462 823 1470C823 1487 815 1495 798 1495C793 1495 788 1493 784 1490C697 1423 614 1324 536 1192C399 956 277 603 277 253L277 0L385 0L385 253C385 407 403 562 438 719C500 999 630 1313 813 1450Z" transform="translate(0,655)"></path><path data-c="239D" d="M798 0C815 0 823 8 823 25C823 34 819 40 812 44C731 106 658 202 592 334C474 569 385 903 385 1242L385 1495L277 1495L277 1242C277 914 388 575 512 345C594 193 685 80 784 5C788 2 793 0 798 0Z" transform="translate(0,-1650)"></path><svg width="875" height="950" y="-225" x="0" viewBox="0 237.5 875 950"><path data-c="239C" d="M277 0L385 0L385 498L277 498Z" transform="scale(1,2.861)"></path></svg></g><g data-mml-node="mtable" transform="translate(875,0)"><g data-mml-node="mtr" transform="translate(0,1400)"><g data-mml-node="mtd"><g data-mml-node="mi" data-latex="x"><path data-c="1D465" d="M527 373C527 419 482 442 432 442C389 442 355 419 329 373C308 419 273 442 222 442C173 442 133 419 101 374C74 335 60 306 60 287C60 278 65 273 75 273C84 273 90 278 92 287C111 345 153 413 220 413C253 413 269 392 269 351C269 330 251 252 216 118C199 51 169 18 126 18C112 18 99 21 88 26C114 36 127 54 127 80C127 106 114 119 87 119C54 119 29 91 29 58C29 12 76-11 125-11C167-11 201 12 228 58C247 12 283-11 335-11C383-11 423 12 455 57C482 96 496 125 496 144C496 153 491 158 481 158C472 158 467 153 464 144C447 87 402 18 337 18C304 18 287 38 287 79C287 92 292 120 303 165L337 300C356 375 387 413 431 413C445 413 458 410 469 405C442 396 429 378 429 351C429 325 443 312 470 312C502 312 527 341 527 373Z"></path></g></g></g><g data-mml-node="mtr"><g data-mml-node="mtd" transform="translate(41,0)"><g data-mml-node="mi" data-latex="y"><path data-c="1D466" d="M163 442C118 442 83 417 58 367C39 328 29 301 29 286C29 277 34 272 45 272C59 272 60 278 64 293C87 372 119 412 160 412C173 412 180 403 180 385C180 369 175 346 164 317C126 214 107 145 107 108C107 32 154-13 231-13C264-13 295-1 323 23C288-109 233-175 158-175C124-175 101-164 89-142C129-140 149-121 149-85C149-60 136-47 109-47C72-47 50-78 50-115C50-170 100-205 158-205C273-205 367-99 392-1L486 377C489 388 490 396 490 401C490 421 479 431 458 431C442 431 429 423 420 408C414 387 409 369 406 354L342 97C332 61 279 16 234 16C196 16 177 41 177 92C177 134 194 198 227 284C240 319 247 343 247 357C247 406 212 442 163 442Z"></path></g></g></g><g data-mml-node="mtr" transform="translate(0,-1400)"><g data-mml-node="mtd" transform="translate(36,0)"><g data-mml-node="mn" data-latex="1"><path data-c="31" d="M269 666C228 624 168 603 89 603L89 564C141 564 184 572 217 588L217 82C217 64 213 52 204 47C195 42 170 39 130 39L95 39L95 0C120 2 174 3 257 3C340 3 394 2 419 0L419 39L384 39C343 39 318 42 310 47C302 52 297 64 297 82L297 636C297 660 295 666 269 666Z"></path></g></g></g></g><g data-mml-node="mo" transform="translate(1447,0)"><path data-c="239E" d="M490 0L598 0L598 253C598 581 487 920 363 1150C281 1301 190 1415 91 1490C87 1493 82 1495 77 1495C60 1495 52 1487 52 1470C52 1462 55 1455 62 1450C143 1389 216 1292 283 1160C402 924 490 593 490 253Z" transform="translate(0,655)"></path><path data-c="23A0" d="M598 1242L598 1495L490 1495L490 1242C490 1088 472 933 437 776C375 494 246 184 63 44C56 40 52 34 52 25C52 8 60 0 77 0C82 0 87 2 91 5C178 71 261 170 339 303C477 539 598 892 598 1242Z" transform="translate(0,-1650)"></path><svg width="875" height="950" y="-225" x="0" viewBox="0 237.5 875 950"><path data-c="239F" d="M490 0L598 0L598 498L490 498Z" transform="scale(1,2.861)"></path></svg></g></g></g></g></svg></mjx-container></p></li><li><p>如此一来，我们就能使用一个 <mjx-container class="MathJax" jax="SVG" overflow="overflow"><svg style="vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="1.131ex" height="2.262ex" role="img" focusable="false" viewBox="0 -750 500 1000"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="3 \times 3"><g data-mml-node="mn" data-latex="3"><path data-c="33" d="M303 353C369 378 431 441 431 526C431 569 410 604 369 631C333 654 292 666 246 666C201 666 162 654 127 631C88 605 68 571 68 528C68 495 90 472 122 472C154 472 176 495 176 527C176 560 157 578 119 580C145 615 186 633 242 633C302 633 332 598 332 527C332 485 324 450 309 421C282 373 245 364 183 364C171 362 165 357 165 348C165 333 172 333 192 333L235 333C310 333 348 280 348 173C348 88 317 14 241 14C176 14 128 36 99 80C134 79 160 105 160 139C160 173 135 198 101 198C62 198 42 178 42 137C42 88 64 49 108 18C147-9 193-22 244-22C301-22 350-3 393 34C436 71 457 117 457 173C457 267 383 332 303 353Z"></path></g></g></g></svg><mjx-break size="3"> </mjx-break><svg style="vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="3.394ex" height="2.262ex" role="img" focusable="false" viewBox="0 -750 1500.2 1000"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="3 \times 3"><g data-mml-node="mo" data-latex="\times"><path data-c="D7" d="M630 32C630 39 628 44 623 49L422 250L623 451C628 456 630 461 630 468C630 481 620 491 607 491C600 491 595 489 590 484L389 283L188 484C183 489 178 491 171 491C158 491 148 481 148 468C148 461 150 456 155 451L356 250L155 49C150 44 148 39 148 32C148 19 158 9 171 9C178 9 183 11 188 16L389 217L590 16C595 11 600 9 607 9C620 9 630 19 630 32Z"></path></g><g data-mml-node="mn" data-latex="3" transform="translate(1000.2,0)"><path data-c="33" d="M303 353C369 378 431 441 431 526C431 569 410 604 369 631C333 654 292 666 246 666C201 666 162 654 127 631C88 605 68 571 68 528C68 495 90 472 122 472C154 472 176 495 176 527C176 560 157 578 119 580C145 615 186 633 242 633C302 633 332 598 332 527C332 485 324 450 309 421C282 373 245 364 183 364C171 362 165 357 165 348C165 333 172 333 192 333L235 333C310 333 348 280 348 173C348 88 317 14 241 14C176 14 128 36 99 80C134 79 160 105 160 139C160 173 135 198 101 198C62 198 42 178 42 137C42 88 64 49 108 18C147-9 193-22 244-22C301-22 350-3 393 34C436 71 457 117 457 173C457 267 383 332 303 353Z"></path></g></g></g></svg></mjx-container> 的矩阵同时表示线性变换和平移变换。</p><ul><li><p>以向上平移 1 个单位，向右平移 2 个单位的二维变换矩阵为例：</p><p>  <mjx-container class="MathJax" jax="SVG" overflow="overflow" display="true"><svg style="vertical-align: -3.733ex;" xmlns="http://www.w3.org/2000/svg" width="29.676ex" height="8.597ex" role="img" focusable="false" viewBox="0 -2150 13116.7 3800"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="  \begin{pmatrix}  x + 2 \\  y + 1 \\  1  \end{pmatrix} =  \begin{pmatrix}  1 &amp; 0 &amp; 2 \\  0 &amp; 1 &amp; 1 \\  0 &amp; 0 &amp; 1  \end{pmatrix}  \begin{pmatrix}  x \\  y \\  1  \end{pmatrix}  "><g data-mml-node="mrow" data-latex="{pmatrix}"><g data-mml-node="mo"><path data-c="239B" d="M813 1450C820 1455 823 1462 823 1470C823 1487 815 1495 798 1495C793 1495 788 1493 784 1490C697 1423 614 1324 536 1192C399 956 277 603 277 253L277 0L385 0L385 253C385 407 403 562 438 719C500 999 630 1313 813 1450Z" transform="translate(0,655)"></path><path data-c="239D" d="M798 0C815 0 823 8 823 25C823 34 819 40 812 44C731 106 658 202 592 334C474 569 385 903 385 1242L385 1495L277 1495L277 1242C277 914 388 575 512 345C594 193 685 80 784 5C788 2 793 0 798 0Z" transform="translate(0,-1650)"></path><svg width="875" height="950" y="-225" x="0" viewBox="0 237.5 875 950"><path data-c="239C" d="M277 0L385 0L385 498L277 498Z" transform="scale(1,2.861)"></path></svg></g><g data-mml-node="mtable" transform="translate(875,0)"><g data-mml-node="mtr" transform="translate(0,1400)"><g data-mml-node="mtd"><g data-mml-node="mi" data-latex="x"><path data-c="1D465" d="M527 373C527 419 482 442 432 442C389 442 355 419 329 373C308 419 273 442 222 442C173 442 133 419 101 374C74 335 60 306 60 287C60 278 65 273 75 273C84 273 90 278 92 287C111 345 153 413 220 413C253 413 269 392 269 351C269 330 251 252 216 118C199 51 169 18 126 18C112 18 99 21 88 26C114 36 127 54 127 80C127 106 114 119 87 119C54 119 29 91 29 58C29 12 76-11 125-11C167-11 201 12 228 58C247 12 283-11 335-11C383-11 423 12 455 57C482 96 496 125 496 144C496 153 491 158 481 158C472 158 467 153 464 144C447 87 402 18 337 18C304 18 287 38 287 79C287 92 292 120 303 165L337 300C356 375 387 413 431 413C445 413 458 410 469 405C442 396 429 378 429 351C429 325 443 312 470 312C502 312 527 341 527 373Z"></path></g><g data-mml-node="mo" data-latex="+" transform="translate(794.2,0)"><path data-c="2B" d="M698 274L413 274L413 559C413 575 405 583 389 583C373 583 365 575 365 559L365 274L80 274C64 274 56 266 56 250C56 234 64 226 80 226L365 226L365-59C365-75 373-83 389-83C405-83 413-75 413-59L413 226L698 226C714 226 722 234 722 250C722 263 711 274 698 274Z"></path></g><g data-mml-node="mn" data-latex="2" transform="translate(1794.4,0)"><path data-c="32" d="M237 666C186 666 143 648 106 612C69 576 50 534 50 483C50 449 75 424 106 424C136 424 161 450 161 480C161 513 137 536 105 536C102 536 100 536 98 535C117 584 161 627 224 627C306 627 352 556 352 470C352 403 318 331 250 255L62 43C49 28 50 29 50 0L421 0L450 180L417 180C409 129 402 100 396 91C391 86 361 84 306 84L139 84L236 179C304 243 390 312 419 365C439 400 449 435 449 470C449 588 357 666 237 666Z"></path></g></g></g><g data-mml-node="mtr"><g data-mml-node="mtd" transform="translate(41,0)"><g data-mml-node="mi" data-latex="y"><path data-c="1D466" d="M163 442C118 442 83 417 58 367C39 328 29 301 29 286C29 277 34 272 45 272C59 272 60 278 64 293C87 372 119 412 160 412C173 412 180 403 180 385C180 369 175 346 164 317C126 214 107 145 107 108C107 32 154-13 231-13C264-13 295-1 323 23C288-109 233-175 158-175C124-175 101-164 89-142C129-140 149-121 149-85C149-60 136-47 109-47C72-47 50-78 50-115C50-170 100-205 158-205C273-205 367-99 392-1L486 377C489 388 490 396 490 401C490 421 479 431 458 431C442 431 429 423 420 408C414 387 409 369 406 354L342 97C332 61 279 16 234 16C196 16 177 41 177 92C177 134 194 198 227 284C240 319 247 343 247 357C247 406 212 442 163 442Z"></path></g><g data-mml-node="mo" data-latex="+" transform="translate(712.2,0)"><path data-c="2B" d="M698 274L413 274L413 559C413 575 405 583 389 583C373 583 365 575 365 559L365 274L80 274C64 274 56 266 56 250C56 234 64 226 80 226L365 226L365-59C365-75 373-83 389-83C405-83 413-75 413-59L413 226L698 226C714 226 722 234 722 250C722 263 711 274 698 274Z"></path></g><g data-mml-node="mn" data-latex="1" transform="translate(1712.4,0)"><path data-c="31" d="M269 666C228 624 168 603 89 603L89 564C141 564 184 572 217 588L217 82C217 64 213 52 204 47C195 42 170 39 130 39L95 39L95 0C120 2 174 3 257 3C340 3 394 2 419 0L419 39L384 39C343 39 318 42 310 47C302 52 297 64 297 82L297 636C297 660 295 666 269 666Z"></path></g></g></g><g data-mml-node="mtr" transform="translate(0,-1400)"><g data-mml-node="mtd" transform="translate(897.2,0)"><g data-mml-node="mn" data-latex="1"><path data-c="31" d="M269 666C228 624 168 603 89 603L89 564C141 564 184 572 217 588L217 82C217 64 213 52 204 47C195 42 170 39 130 39L95 39L95 0C120 2 174 3 257 3C340 3 394 2 419 0L419 39L384 39C343 39 318 42 310 47C302 52 297 64 297 82L297 636C297 660 295 666 269 666Z"></path></g></g></g></g><g data-mml-node="mo" transform="translate(3169.4,0)"><path data-c="239E" d="M490 0L598 0L598 253C598 581 487 920 363 1150C281 1301 190 1415 91 1490C87 1493 82 1495 77 1495C60 1495 52 1487 52 1470C52 1462 55 1455 62 1450C143 1389 216 1292 283 1160C402 924 490 593 490 253Z" transform="translate(0,655)"></path><path data-c="23A0" d="M598 1242L598 1495L490 1495L490 1242C490 1088 472 933 437 776C375 494 246 184 63 44C56 40 52 34 52 25C52 8 60 0 77 0C82 0 87 2 91 5C178 71 261 170 339 303C477 539 598 892 598 1242Z" transform="translate(0,-1650)"></path><svg width="875" height="950" y="-225" x="0" viewBox="0 237.5 875 950"><path data-c="239F" d="M490 0L598 0L598 498L490 498Z" transform="scale(1,2.861)"></path></svg></g></g><g data-mml-node="mo" data-latex="=" transform="translate(4322.2,0)"><path data-c="3D" d="M698 367L80 367C64 367 56 359 56 344C56 329 64 321 80 321L698 321C714 321 722 329 722 344C722 356 711 367 698 367M698 179L80 179C64 179 56 171 56 156C56 141 64 133 80 133L698 133C714 133 722 141 722 156C722 169 711 179 698 179Z"></path></g><g data-mml-node="mrow" data-latex="{pmatrix}" transform="translate(5378,0)"><g data-mml-node="mo"><path data-c="239B" d="M813 1450C820 1455 823 1462 823 1470C823 1487 815 1495 798 1495C793 1495 788 1493 784 1490C697 1423 614 1324 536 1192C399 956 277 603 277 253L277 0L385 0L385 253C385 407 403 562 438 719C500 999 630 1313 813 1450Z" transform="translate(0,655)"></path><path data-c="239D" d="M798 0C815 0 823 8 823 25C823 34 819 40 812 44C731 106 658 202 592 334C474 569 385 903 385 1242L385 1495L277 1495L277 1242C277 914 388 575 512 345C594 193 685 80 784 5C788 2 793 0 798 0Z" transform="translate(0,-1650)"></path><svg width="875" height="950" y="-225" x="0" viewBox="0 237.5 875 950"><path data-c="239C" d="M277 0L385 0L385 498L277 498Z" transform="scale(1,2.861)"></path></svg></g><g data-mml-node="mtable" transform="translate(875,0)"><g data-mml-node="mtr" transform="translate(0,1400)"><g data-mml-node="mtd"><g data-mml-node="mn" data-latex="1"><path data-c="31" d="M269 666C228 624 168 603 89 603L89 564C141 564 184 572 217 588L217 82C217 64 213 52 204 47C195 42 170 39 130 39L95 39L95 0C120 2 174 3 257 3C340 3 394 2 419 0L419 39L384 39C343 39 318 42 310 47C302 52 297 64 297 82L297 636C297 660 295 666 269 666Z"></path></g></g><g data-mml-node="mtd" transform="translate(1500,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(3000,0)"><g data-mml-node="mn" data-latex="2"><path data-c="32" d="M237 666C186 666 143 648 106 612C69 576 50 534 50 483C50 449 75 424 106 424C136 424 161 450 161 480C161 513 137 536 105 536C102 536 100 536 98 535C117 584 161 627 224 627C306 627 352 556 352 470C352 403 318 331 250 255L62 43C49 28 50 29 50 0L421 0L450 180L417 180C409 129 402 100 396 91C391 86 361 84 306 84L139 84L236 179C304 243 390 312 419 365C439 400 449 435 449 470C449 588 357 666 237 666Z"></path></g></g></g><g data-mml-node="mtr"><g data-mml-node="mtd"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(1500,0)"><g data-mml-node="mn" data-latex="1"><path data-c="31" d="M269 666C228 624 168 603 89 603L89 564C141 564 184 572 217 588L217 82C217 64 213 52 204 47C195 42 170 39 130 39L95 39L95 0C120 2 174 3 257 3C340 3 394 2 419 0L419 39L384 39C343 39 318 42 310 47C302 52 297 64 297 82L297 636C297 660 295 666 269 666Z"></path></g></g><g data-mml-node="mtd" transform="translate(3000,0)"><g data-mml-node="mn" data-latex="1"><path data-c="31" d="M269 666C228 624 168 603 89 603L89 564C141 564 184 572 217 588L217 82C217 64 213 52 204 47C195 42 170 39 130 39L95 39L95 0C120 2 174 3 257 3C340 3 394 2 419 0L419 39L384 39C343 39 318 42 310 47C302 52 297 64 297 82L297 636C297 660 295 666 269 666Z"></path></g></g></g><g data-mml-node="mtr" transform="translate(0,-1400)"><g data-mml-node="mtd"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(1500,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(3000,0)"><g data-mml-node="mn" data-latex="1"><path data-c="31" d="M269 666C228 624 168 603 89 603L89 564C141 564 184 572 217 588L217 82C217 64 213 52 204 47C195 42 170 39 130 39L95 39L95 0C120 2 174 3 257 3C340 3 394 2 419 0L419 39L384 39C343 39 318 42 310 47C302 52 297 64 297 82L297 636C297 660 295 666 269 666Z"></path></g></g></g></g><g data-mml-node="mo" transform="translate(4375,0)"><path data-c="239E" d="M490 0L598 0L598 253C598 581 487 920 363 1150C281 1301 190 1415 91 1490C87 1493 82 1495 77 1495C60 1495 52 1487 52 1470C52 1462 55 1455 62 1450C143 1389 216 1292 283 1160C402 924 490 593 490 253Z" transform="translate(0,655)"></path><path data-c="23A0" d="M598 1242L598 1495L490 1495L490 1242C490 1088 472 933 437 776C375 494 246 184 63 44C56 40 52 34 52 25C52 8 60 0 77 0C82 0 87 2 91 5C178 71 261 170 339 303C477 539 598 892 598 1242Z" transform="translate(0,-1650)"></path><svg width="875" height="950" y="-225" x="0" viewBox="0 237.5 875 950"><path data-c="239F" d="M490 0L598 0L598 498L490 498Z" transform="scale(1,2.861)"></path></svg></g></g><g data-mml-node="mrow" data-latex="{pmatrix}" transform="translate(10794.7,0)"><g data-mml-node="mo"><path data-c="239B" d="M813 1450C820 1455 823 1462 823 1470C823 1487 815 1495 798 1495C793 1495 788 1493 784 1490C697 1423 614 1324 536 1192C399 956 277 603 277 253L277 0L385 0L385 253C385 407 403 562 438 719C500 999 630 1313 813 1450Z" transform="translate(0,655)"></path><path data-c="239D" d="M798 0C815 0 823 8 823 25C823 34 819 40 812 44C731 106 658 202 592 334C474 569 385 903 385 1242L385 1495L277 1495L277 1242C277 914 388 575 512 345C594 193 685 80 784 5C788 2 793 0 798 0Z" transform="translate(0,-1650)"></path><svg width="875" height="950" y="-225" x="0" viewBox="0 237.5 875 950"><path data-c="239C" d="M277 0L385 0L385 498L277 498Z" transform="scale(1,2.861)"></path></svg></g><g data-mml-node="mtable" transform="translate(875,0)"><g data-mml-node="mtr" transform="translate(0,1400)"><g data-mml-node="mtd"><g data-mml-node="mi" data-latex="x"><path data-c="1D465" d="M527 373C527 419 482 442 432 442C389 442 355 419 329 373C308 419 273 442 222 442C173 442 133 419 101 374C74 335 60 306 60 287C60 278 65 273 75 273C84 273 90 278 92 287C111 345 153 413 220 413C253 413 269 392 269 351C269 330 251 252 216 118C199 51 169 18 126 18C112 18 99 21 88 26C114 36 127 54 127 80C127 106 114 119 87 119C54 119 29 91 29 58C29 12 76-11 125-11C167-11 201 12 228 58C247 12 283-11 335-11C383-11 423 12 455 57C482 96 496 125 496 144C496 153 491 158 481 158C472 158 467 153 464 144C447 87 402 18 337 18C304 18 287 38 287 79C287 92 292 120 303 165L337 300C356 375 387 413 431 413C445 413 458 410 469 405C442 396 429 378 429 351C429 325 443 312 470 312C502 312 527 341 527 373Z"></path></g></g></g><g data-mml-node="mtr"><g data-mml-node="mtd" transform="translate(41,0)"><g data-mml-node="mi" data-latex="y"><path data-c="1D466" d="M163 442C118 442 83 417 58 367C39 328 29 301 29 286C29 277 34 272 45 272C59 272 60 278 64 293C87 372 119 412 160 412C173 412 180 403 180 385C180 369 175 346 164 317C126 214 107 145 107 108C107 32 154-13 231-13C264-13 295-1 323 23C288-109 233-175 158-175C124-175 101-164 89-142C129-140 149-121 149-85C149-60 136-47 109-47C72-47 50-78 50-115C50-170 100-205 158-205C273-205 367-99 392-1L486 377C489 388 490 396 490 401C490 421 479 431 458 431C442 431 429 423 420 408C414 387 409 369 406 354L342 97C332 61 279 16 234 16C196 16 177 41 177 92C177 134 194 198 227 284C240 319 247 343 247 357C247 406 212 442 163 442Z"></path></g></g></g><g data-mml-node="mtr" transform="translate(0,-1400)"><g data-mml-node="mtd" transform="translate(36,0)"><g data-mml-node="mn" data-latex="1"><path data-c="31" d="M269 666C228 624 168 603 89 603L89 564C141 564 184 572 217 588L217 82C217 64 213 52 204 47C195 42 170 39 130 39L95 39L95 0C120 2 174 3 257 3C340 3 394 2 419 0L419 39L384 39C343 39 318 42 310 47C302 52 297 64 297 82L297 636C297 660 295 666 269 666Z"></path></g></g></g></g><g data-mml-node="mo" transform="translate(1447,0)"><path data-c="239E" d="M490 0L598 0L598 253C598 581 487 920 363 1150C281 1301 190 1415 91 1490C87 1493 82 1495 77 1495C60 1495 52 1487 52 1470C52 1462 55 1455 62 1450C143 1389 216 1292 283 1160C402 924 490 593 490 253Z" transform="translate(0,655)"></path><path data-c="23A0" d="M598 1242L598 1495L490 1495L490 1242C490 1088 472 933 437 776C375 494 246 184 63 44C56 40 52 34 52 25C52 8 60 0 77 0C82 0 87 2 91 5C178 71 261 170 339 303C477 539 598 892 598 1242Z" transform="translate(0,-1650)"></path><svg width="875" height="950" y="-225" x="0" viewBox="0 237.5 875 950"><path data-c="239F" d="M490 0L598 0L598 498L490 498Z" transform="scale(1,2.861)"></path></svg></g></g></g></g></svg></mjx-container></p></li></ul></li><li><p>将矩阵的第三列写为 <mjx-container class="MathJax" jax="SVG" overflow="overflow"><svg style="vertical-align: -3.733ex;" xmlns="http://www.w3.org/2000/svg" width="5.09ex" height="8.597ex" role="img" focusable="false" viewBox="0 -2150 2250 3800"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="\begin{pmatrix} 0 \\ 0 \\ 1 \end{pmatrix}"><g data-mml-node="mrow" data-latex="\begin{pmatrix} 0 \\ 0 \\ 1 \end{pmatrix}"><g data-mml-node="mo"><path data-c="239B" d="M813 1450C820 1455 823 1462 823 1470C823 1487 815 1495 798 1495C793 1495 788 1493 784 1490C697 1423 614 1324 536 1192C399 956 277 603 277 253L277 0L385 0L385 253C385 407 403 562 438 719C500 999 630 1313 813 1450Z" transform="translate(0,655)"></path><path data-c="239D" d="M798 0C815 0 823 8 823 25C823 34 819 40 812 44C731 106 658 202 592 334C474 569 385 903 385 1242L385 1495L277 1495L277 1242C277 914 388 575 512 345C594 193 685 80 784 5C788 2 793 0 798 0Z" transform="translate(0,-1650)"></path><svg width="875" height="950" y="-225" x="0" viewBox="0 237.5 875 950"><path data-c="239C" d="M277 0L385 0L385 498L277 498Z" transform="scale(1,2.861)"></path></svg></g><g data-mml-node="mtable" transform="translate(875,0)"><g data-mml-node="mtr" transform="translate(0,1400)"><g data-mml-node="mtd"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g></g><g data-mml-node="mtr"><g data-mml-node="mtd"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g></g><g data-mml-node="mtr" transform="translate(0,-1400)"><g data-mml-node="mtd"><g data-mml-node="mn" data-latex="1"><path data-c="31" d="M269 666C228 624 168 603 89 603L89 564C141 564 184 572 217 588L217 82C217 64 213 52 204 47C195 42 170 39 130 39L95 39L95 0C120 2 174 3 257 3C340 3 394 2 419 0L419 39L384 39C343 39 318 42 310 47C302 52 297 64 297 82L297 636C297 660 295 666 269 666Z"></path></g></g></g></g><g data-mml-node="mo" transform="translate(1375,0)"><path data-c="239E" d="M490 0L598 0L598 253C598 581 487 920 363 1150C281 1301 190 1415 91 1490C87 1493 82 1495 77 1495C60 1495 52 1487 52 1470C52 1462 55 1455 62 1450C143 1389 216 1292 283 1160C402 924 490 593 490 253Z" transform="translate(0,655)"></path><path data-c="23A0" d="M598 1242L598 1495L490 1495L490 1242C490 1088 472 933 437 776C375 494 246 184 63 44C56 40 52 34 52 25C52 8 60 0 77 0C82 0 87 2 91 5C178 71 261 170 339 303C477 539 598 892 598 1242Z" transform="translate(0,-1650)"></path><svg width="875" height="950" y="-225" x="0" viewBox="0 237.5 875 950"><path data-c="239F" d="M490 0L598 0L598 498L490 498Z" transform="scale(1,2.861)"></path></svg></g></g></g></g></svg></mjx-container> 意味着图像在变换中没有发生平移，左上角 <mjx-container class="MathJax" jax="SVG" overflow="overflow"><svg style="vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="1.131ex" height="2.262ex" role="img" focusable="false" viewBox="0 -750 500 1000"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="2 \times 2"><g data-mml-node="mn" data-latex="2"><path data-c="32" d="M237 666C186 666 143 648 106 612C69 576 50 534 50 483C50 449 75 424 106 424C136 424 161 450 161 480C161 513 137 536 105 536C102 536 100 536 98 535C117 584 161 627 224 627C306 627 352 556 352 470C352 403 318 331 250 255L62 43C49 28 50 29 50 0L421 0L450 180L417 180C409 129 402 100 396 91C391 86 361 84 306 84L139 84L236 179C304 243 390 312 419 365C439 400 449 435 449 470C449 588 357 666 237 666Z"></path></g></g></g></svg><mjx-break size="3"> </mjx-break><svg style="vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="3.394ex" height="2.262ex" role="img" focusable="false" viewBox="0 -750 1500.2 1000"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="2 \times 2"><g data-mml-node="mo" data-latex="\times"><path data-c="D7" d="M630 32C630 39 628 44 623 49L422 250L623 451C628 456 630 461 630 468C630 481 620 491 607 491C600 491 595 489 590 484L389 283L188 484C183 489 178 491 171 491C158 491 148 481 148 468C148 461 150 456 155 451L356 250L155 49C150 44 148 39 148 32C148 19 158 9 171 9C178 9 183 11 188 16L389 217L590 16C595 11 600 9 607 9C620 9 630 19 630 32Z"></path></g><g data-mml-node="mn" data-latex="2" transform="translate(1000.2,0)"><path data-c="32" d="M237 666C186 666 143 648 106 612C69 576 50 534 50 483C50 449 75 424 106 424C136 424 161 450 161 480C161 513 137 536 105 536C102 536 100 536 98 535C117 584 161 627 224 627C306 627 352 556 352 470C352 403 318 331 250 255L62 43C49 28 50 29 50 0L421 0L450 180L417 180C409 129 402 100 396 91C391 86 361 84 306 84L139 84L236 179C304 243 390 312 419 365C439 400 449 435 449 470C449 588 357 666 237 666Z"></path></g></g></g></svg></mjx-container> 的分块矩阵仍表示二维图形的线性变换。</p></li></ul><h2 id="齐次坐标表示法的妙用"><a href="#齐次坐标表示法的妙用" class="headerlink" title="齐次坐标表示法的妙用"></a>齐次坐标表示法的妙用</h2><ul><li><p>齐次坐标表示法中，第三个新填入的值在表示“点”时写为 <mjx-container class="MathJax" jax="SVG" overflow="overflow"><svg style="vertical-align: 0;" xmlns="http://www.w3.org/2000/svg" width="1.131ex" height="1.507ex" role="img" focusable="false" viewBox="0 -666 500 666"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="1"><g data-mml-node="mn" data-latex="1"><path data-c="31" d="M269 666C228 624 168 603 89 603L89 564C141 564 184 572 217 588L217 82C217 64 213 52 204 47C195 42 170 39 130 39L95 39L95 0C120 2 174 3 257 3C340 3 394 2 419 0L419 39L384 39C343 39 318 42 310 47C302 52 297 64 297 82L297 636C297 660 295 666 269 666Z"></path></g></g></g></svg></mjx-container>，而表示“向量”时写为 <mjx-container class="MathJax" jax="SVG" overflow="overflow"><svg style="vertical-align: -0.05ex;" xmlns="http://www.w3.org/2000/svg" width="1.131ex" height="1.557ex" role="img" focusable="false" viewBox="0 -666 500 688"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="0"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g></g></svg></mjx-container>。这是一个非常巧妙的设计，原因如下：</p></li><li><p>我们希望点和向量在进行变换的前后遵循如下规则：</p><ol><li>点 + 向量 = 点</li><li>向量 + 向量 = 向量</li><li>点 - 点 = 向量</li><li>点 + 点 = 中点（<strong>非一般规则</strong>）</li></ol></li><li><p>上述的规则刚好满足这些要求。</p><ul><li><p>例如，点与点相减得到向量（第三项为 <mjx-container class="MathJax" jax="SVG" overflow="overflow"><svg style="vertical-align: -0.05ex;" xmlns="http://www.w3.org/2000/svg" width="1.131ex" height="1.557ex" role="img" focusable="false" viewBox="0 -666 500 688"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="0"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g></g></svg></mjx-container>）：</p><p>  <mjx-container class="MathJax" jax="SVG" overflow="overflow" display="true"><svg style="vertical-align: -3.733ex;" xmlns="http://www.w3.org/2000/svg" width="24.976ex" height="8.597ex" role="img" focusable="false" viewBox="0 -2150 11039.4 3800"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="  \begin{pmatrix}  a \\  b \\  1  \end{pmatrix} -  \begin{pmatrix}  c \\  d \\  1  \end{pmatrix} =  \begin{pmatrix}  a - c \\  b - d \\  0  \end{pmatrix}  "><g data-mml-node="mrow" data-latex="{pmatrix}"><g data-mml-node="mo"><path data-c="239B" d="M813 1450C820 1455 823 1462 823 1470C823 1487 815 1495 798 1495C793 1495 788 1493 784 1490C697 1423 614 1324 536 1192C399 956 277 603 277 253L277 0L385 0L385 253C385 407 403 562 438 719C500 999 630 1313 813 1450Z" transform="translate(0,655)"></path><path data-c="239D" d="M798 0C815 0 823 8 823 25C823 34 819 40 812 44C731 106 658 202 592 334C474 569 385 903 385 1242L385 1495L277 1495L277 1242C277 914 388 575 512 345C594 193 685 80 784 5C788 2 793 0 798 0Z" transform="translate(0,-1650)"></path><svg width="875" height="950" y="-225" x="0" viewBox="0 237.5 875 950"><path data-c="239C" d="M277 0L385 0L385 498L277 498Z" transform="scale(1,2.861)"></path></svg></g><g data-mml-node="mtable" transform="translate(875,0)"><g data-mml-node="mtr" transform="translate(0,1400)"><g data-mml-node="mtd"><g data-mml-node="mi" data-latex="a"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g></g></g><g data-mml-node="mtr"><g data-mml-node="mtd" transform="translate(50,0)"><g data-mml-node="mi" data-latex="b"><path data-c="1D44F" d="M281 445C245 445 209 428 174 394L243 679C241 688 238 694 226 694C193 694 120 685 107 684C92 682 84 675 84 660C84 650 93 645 112 645C131 645 157 646 157 632C157 628 152 608 143 571L63 249C52 207 47 173 47 148C47 62 93-11 175-11C240-11 297 22 347 89C392 151 415 216 415 283C415 370 364 445 281 445M279 415C318 415 337 385 337 326C337 299 331 263 319 218C297 133 268 75 233 44C213 27 194 19 175 19C134 19 114 51 114 115C114 137 119 170 129 214L151 304C154 319 159 330 165 338C204 389 242 415 279 415Z"></path></g></g></g><g data-mml-node="mtr" transform="translate(0,-1400)"><g data-mml-node="mtd" transform="translate(14.5,0)"><g data-mml-node="mn" data-latex="1"><path data-c="31" d="M269 666C228 624 168 603 89 603L89 564C141 564 184 572 217 588L217 82C217 64 213 52 204 47C195 42 170 39 130 39L95 39L95 0C120 2 174 3 257 3C340 3 394 2 419 0L419 39L384 39C343 39 318 42 310 47C302 52 297 64 297 82L297 636C297 660 295 666 269 666Z"></path></g></g></g></g><g data-mml-node="mo" transform="translate(1404,0)"><path data-c="239E" d="M490 0L598 0L598 253C598 581 487 920 363 1150C281 1301 190 1415 91 1490C87 1493 82 1495 77 1495C60 1495 52 1487 52 1470C52 1462 55 1455 62 1450C143 1389 216 1292 283 1160C402 924 490 593 490 253Z" transform="translate(0,655)"></path><path data-c="23A0" d="M598 1242L598 1495L490 1495L490 1242C490 1088 472 933 437 776C375 494 246 184 63 44C56 40 52 34 52 25C52 8 60 0 77 0C82 0 87 2 91 5C178 71 261 170 339 303C477 539 598 892 598 1242Z" transform="translate(0,-1650)"></path><svg width="875" height="950" y="-225" x="0" viewBox="0 237.5 875 950"><path data-c="239F" d="M490 0L598 0L598 498L490 498Z" transform="scale(1,2.861)"></path></svg></g></g><g data-mml-node="mo" data-latex="-" transform="translate(2501.2,0)"><path data-c="2212" d="M698 270L80 270C64 270 56 263 56 250C56 237 64 230 80 230L698 230C714 230 722 237 722 250C722 262 710 270 698 270Z"></path></g><g data-mml-node="mrow" data-latex="{pmatrix}" transform="translate(3501.4,0)"><g data-mml-node="mo"><path data-c="239B" d="M813 1450C820 1455 823 1462 823 1470C823 1487 815 1495 798 1495C793 1495 788 1493 784 1490C697 1423 614 1324 536 1192C399 956 277 603 277 253L277 0L385 0L385 253C385 407 403 562 438 719C500 999 630 1313 813 1450Z" transform="translate(0,655)"></path><path data-c="239D" d="M798 0C815 0 823 8 823 25C823 34 819 40 812 44C731 106 658 202 592 334C474 569 385 903 385 1242L385 1495L277 1495L277 1242C277 914 388 575 512 345C594 193 685 80 784 5C788 2 793 0 798 0Z" transform="translate(0,-1650)"></path><svg width="875" height="950" y="-225" x="0" viewBox="0 237.5 875 950"><path data-c="239C" d="M277 0L385 0L385 498L277 498Z" transform="scale(1,2.861)"></path></svg></g><g data-mml-node="mtable" transform="translate(875,0)"><g data-mml-node="mtr" transform="translate(0,1400)"><g data-mml-node="mtd" transform="translate(43.5,0)"><g data-mml-node="mi" data-latex="c"><path data-c="1D450" d="M328 325C328 300 341 287 368 287C404 287 427 318 427 354C427 410 368 442 308 442C239 442 176 412 122 353C68 294 41 229 41 159C41 61 106-11 204-11C257-11 304 2 345 27C379 48 404 69 420 90C427 99 430 106 430 109C430 120 425 126 414 126C409 126 404 122 398 114C365 70 324 42 277 30C246 22 223 18 206 18C149 18 121 53 121 122C121 184 150 274 174 317C198 361 249 413 308 413C346 413 372 402 386 381C355 378 328 358 328 325Z"></path></g></g></g><g data-mml-node="mtr"><g data-mml-node="mtd"><g data-mml-node="mi" data-latex="d"><path data-c="1D451" d="M429 632L370 389C349 426 320 445 281 445C216 445 159 412 109 345C63 283 40 218 40 151C40 63 91-11 175-11C218-11 260 12 300 59C311 21 345-11 392-11C461-11 483 71 498 145C498 154 493 159 483 159C474 159 468 152 465 138C445 59 421 19 394 19C377 19 368 33 368 60C368 75 370 91 374 107L516 679L516 683C513 690 507 694 499 694C476 694 434 690 374 683C363 682 357 674 357 660C357 650 366 645 384 645C403 645 429 646 429 632M341 376C351 355 356 341 356 332C355 328 354 323 353 316L304 122C301 111 294 99 285 87C248 42 212 19 177 19C138 19 118 49 118 108C118 132 124 168 136 216C157 301 187 359 224 390C244 407 263 415 282 415C309 415 329 402 341 376Z"></path></g></g></g><g data-mml-node="mtr" transform="translate(0,-1400)"><g data-mml-node="mtd" transform="translate(10,0)"><g data-mml-node="mn" data-latex="1"><path data-c="31" d="M269 666C228 624 168 603 89 603L89 564C141 564 184 572 217 588L217 82C217 64 213 52 204 47C195 42 170 39 130 39L95 39L95 0C120 2 174 3 257 3C340 3 394 2 419 0L419 39L384 39C343 39 318 42 310 47C302 52 297 64 297 82L297 636C297 660 295 666 269 666Z"></path></g></g></g></g><g data-mml-node="mo" transform="translate(1395,0)"><path data-c="239E" d="M490 0L598 0L598 253C598 581 487 920 363 1150C281 1301 190 1415 91 1490C87 1493 82 1495 77 1495C60 1495 52 1487 52 1470C52 1462 55 1455 62 1450C143 1389 216 1292 283 1160C402 924 490 593 490 253Z" transform="translate(0,655)"></path><path data-c="23A0" d="M598 1242L598 1495L490 1495L490 1242C490 1088 472 933 437 776C375 494 246 184 63 44C56 40 52 34 52 25C52 8 60 0 77 0C82 0 87 2 91 5C178 71 261 170 339 303C477 539 598 892 598 1242Z" transform="translate(0,-1650)"></path><svg width="875" height="950" y="-225" x="0" viewBox="0 237.5 875 950"><path data-c="239F" d="M490 0L598 0L598 498L490 498Z" transform="scale(1,2.861)"></path></svg></g></g><g data-mml-node="mo" data-latex="=" transform="translate(6049.2,0)"><path data-c="3D" d="M698 367L80 367C64 367 56 359 56 344C56 329 64 321 80 321L698 321C714 321 722 329 722 344C722 356 711 367 698 367M698 179L80 179C64 179 56 171 56 156C56 141 64 133 80 133L698 133C714 133 722 141 722 156C722 169 711 179 698 179Z"></path></g><g data-mml-node="mrow" data-latex="{pmatrix}" transform="translate(7105,0)"><g data-mml-node="mo"><path data-c="239B" d="M813 1450C820 1455 823 1462 823 1470C823 1487 815 1495 798 1495C793 1495 788 1493 784 1490C697 1423 614 1324 536 1192C399 956 277 603 277 253L277 0L385 0L385 253C385 407 403 562 438 719C500 999 630 1313 813 1450Z" transform="translate(0,655)"></path><path data-c="239D" d="M798 0C815 0 823 8 823 25C823 34 819 40 812 44C731 106 658 202 592 334C474 569 385 903 385 1242L385 1495L277 1495L277 1242C277 914 388 575 512 345C594 193 685 80 784 5C788 2 793 0 798 0Z" transform="translate(0,-1650)"></path><svg width="875" height="950" y="-225" x="0" viewBox="0 237.5 875 950"><path data-c="239C" d="M277 0L385 0L385 498L277 498Z" transform="scale(1,2.861)"></path></svg></g><g data-mml-node="mtable" transform="translate(875,0)"><g data-mml-node="mtr" transform="translate(0,1400)"><g data-mml-node="mtd"><g data-mml-node="mi" data-latex="a"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g><g data-mml-node="mo" data-latex="-" transform="translate(751.2,0)"><path data-c="2212" d="M698 270L80 270C64 270 56 263 56 250C56 237 64 230 80 230L698 230C714 230 722 237 722 250C722 262 710 270 698 270Z"></path></g><g data-mml-node="mi" data-latex="c" transform="translate(1751.4,0)"><path data-c="1D450" d="M328 325C328 300 341 287 368 287C404 287 427 318 427 354C427 410 368 442 308 442C239 442 176 412 122 353C68 294 41 229 41 159C41 61 106-11 204-11C257-11 304 2 345 27C379 48 404 69 420 90C427 99 430 106 430 109C430 120 425 126 414 126C409 126 404 122 398 114C365 70 324 42 277 30C246 22 223 18 206 18C149 18 121 53 121 122C121 184 150 274 174 317C198 361 249 413 308 413C346 413 372 402 386 381C355 378 328 358 328 325Z"></path></g></g></g><g data-mml-node="mtr"><g data-mml-node="mtd" transform="translate(6.5,0)"><g data-mml-node="mi" data-latex="b"><path data-c="1D44F" d="M281 445C245 445 209 428 174 394L243 679C241 688 238 694 226 694C193 694 120 685 107 684C92 682 84 675 84 660C84 650 93 645 112 645C131 645 157 646 157 632C157 628 152 608 143 571L63 249C52 207 47 173 47 148C47 62 93-11 175-11C240-11 297 22 347 89C392 151 415 216 415 283C415 370 364 445 281 445M279 415C318 415 337 385 337 326C337 299 331 263 319 218C297 133 268 75 233 44C213 27 194 19 175 19C134 19 114 51 114 115C114 137 119 170 129 214L151 304C154 319 159 330 165 338C204 389 242 415 279 415Z"></path></g><g data-mml-node="mo" data-latex="-" transform="translate(651.2,0)"><path data-c="2212" d="M698 270L80 270C64 270 56 263 56 250C56 237 64 230 80 230L698 230C714 230 722 237 722 250C722 262 710 270 698 270Z"></path></g><g data-mml-node="mi" data-latex="d" transform="translate(1651.4,0)"><path data-c="1D451" d="M429 632L370 389C349 426 320 445 281 445C216 445 159 412 109 345C63 283 40 218 40 151C40 63 91-11 175-11C218-11 260 12 300 59C311 21 345-11 392-11C461-11 483 71 498 145C498 154 493 159 483 159C474 159 468 152 465 138C445 59 421 19 394 19C377 19 368 33 368 60C368 75 370 91 374 107L516 679L516 683C513 690 507 694 499 694C476 694 434 690 374 683C363 682 357 674 357 660C357 650 366 645 384 645C403 645 429 646 429 632M341 376C351 355 356 341 356 332C355 328 354 323 353 316L304 122C301 111 294 99 285 87C248 42 212 19 177 19C138 19 118 49 118 108C118 132 124 168 136 216C157 301 187 359 224 390C244 407 263 415 282 415C309 415 329 402 341 376Z"></path></g></g></g><g data-mml-node="mtr" transform="translate(0,-1400)"><g data-mml-node="mtd" transform="translate(842.2,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g></g></g><g data-mml-node="mo" transform="translate(3059.4,0)"><path data-c="239E" d="M490 0L598 0L598 253C598 581 487 920 363 1150C281 1301 190 1415 91 1490C87 1493 82 1495 77 1495C60 1495 52 1487 52 1470C52 1462 55 1455 62 1450C143 1389 216 1292 283 1160C402 924 490 593 490 253Z" transform="translate(0,655)"></path><path data-c="23A0" d="M598 1242L598 1495L490 1495L490 1242C490 1088 472 933 437 776C375 494 246 184 63 44C56 40 52 34 52 25C52 8 60 0 77 0C82 0 87 2 91 5C178 71 261 170 339 303C477 539 598 892 598 1242Z" transform="translate(0,-1650)"></path><svg width="875" height="950" y="-225" x="0" viewBox="0 237.5 875 950"><path data-c="239F" d="M490 0L598 0L598 498L490 498Z" transform="scale(1,2.861)"></path></svg></g></g></g></g></svg></mjx-container></p></li></ul></li><li><p>此外还有一点：仅代表方向的向量不受平移变换的影响：</p><p>  <mjx-container class="MathJax" jax="SVG" overflow="overflow" display="true"><svg style="vertical-align: -3.733ex;" xmlns="http://www.w3.org/2000/svg" width="25.584ex" height="8.597ex" role="img" focusable="false" viewBox="0 -2150 11308.2 3800"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="  \begin{pmatrix}  1 &amp; 0 &amp; 2 \\  0 &amp; 1 &amp; 1 \\  0 &amp; 0 &amp; 1  \end{pmatrix}  \begin{pmatrix}  a \\  b \\  0  \end{pmatrix} =  \begin{pmatrix}  a \\  b \\  0  \end{pmatrix}  "><g data-mml-node="mrow" data-latex="{pmatrix}"><g data-mml-node="mo"><path data-c="239B" d="M813 1450C820 1455 823 1462 823 1470C823 1487 815 1495 798 1495C793 1495 788 1493 784 1490C697 1423 614 1324 536 1192C399 956 277 603 277 253L277 0L385 0L385 253C385 407 403 562 438 719C500 999 630 1313 813 1450Z" transform="translate(0,655)"></path><path data-c="239D" d="M798 0C815 0 823 8 823 25C823 34 819 40 812 44C731 106 658 202 592 334C474 569 385 903 385 1242L385 1495L277 1495L277 1242C277 914 388 575 512 345C594 193 685 80 784 5C788 2 793 0 798 0Z" transform="translate(0,-1650)"></path><svg width="875" height="950" y="-225" x="0" viewBox="0 237.5 875 950"><path data-c="239C" d="M277 0L385 0L385 498L277 498Z" transform="scale(1,2.861)"></path></svg></g><g data-mml-node="mtable" transform="translate(875,0)"><g data-mml-node="mtr" transform="translate(0,1400)"><g data-mml-node="mtd"><g data-mml-node="mn" data-latex="1"><path data-c="31" d="M269 666C228 624 168 603 89 603L89 564C141 564 184 572 217 588L217 82C217 64 213 52 204 47C195 42 170 39 130 39L95 39L95 0C120 2 174 3 257 3C340 3 394 2 419 0L419 39L384 39C343 39 318 42 310 47C302 52 297 64 297 82L297 636C297 660 295 666 269 666Z"></path></g></g><g data-mml-node="mtd" transform="translate(1500,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(3000,0)"><g data-mml-node="mn" data-latex="2"><path data-c="32" d="M237 666C186 666 143 648 106 612C69 576 50 534 50 483C50 449 75 424 106 424C136 424 161 450 161 480C161 513 137 536 105 536C102 536 100 536 98 535C117 584 161 627 224 627C306 627 352 556 352 470C352 403 318 331 250 255L62 43C49 28 50 29 50 0L421 0L450 180L417 180C409 129 402 100 396 91C391 86 361 84 306 84L139 84L236 179C304 243 390 312 419 365C439 400 449 435 449 470C449 588 357 666 237 666Z"></path></g></g></g><g data-mml-node="mtr"><g data-mml-node="mtd"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(1500,0)"><g data-mml-node="mn" data-latex="1"><path data-c="31" d="M269 666C228 624 168 603 89 603L89 564C141 564 184 572 217 588L217 82C217 64 213 52 204 47C195 42 170 39 130 39L95 39L95 0C120 2 174 3 257 3C340 3 394 2 419 0L419 39L384 39C343 39 318 42 310 47C302 52 297 64 297 82L297 636C297 660 295 666 269 666Z"></path></g></g><g data-mml-node="mtd" transform="translate(3000,0)"><g data-mml-node="mn" data-latex="1"><path data-c="31" d="M269 666C228 624 168 603 89 603L89 564C141 564 184 572 217 588L217 82C217 64 213 52 204 47C195 42 170 39 130 39L95 39L95 0C120 2 174 3 257 3C340 3 394 2 419 0L419 39L384 39C343 39 318 42 310 47C302 52 297 64 297 82L297 636C297 660 295 666 269 666Z"></path></g></g></g><g data-mml-node="mtr" transform="translate(0,-1400)"><g data-mml-node="mtd"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(1500,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(3000,0)"><g data-mml-node="mn" data-latex="1"><path data-c="31" d="M269 666C228 624 168 603 89 603L89 564C141 564 184 572 217 588L217 82C217 64 213 52 204 47C195 42 170 39 130 39L95 39L95 0C120 2 174 3 257 3C340 3 394 2 419 0L419 39L384 39C343 39 318 42 310 47C302 52 297 64 297 82L297 636C297 660 295 666 269 666Z"></path></g></g></g></g><g data-mml-node="mo" transform="translate(4375,0)"><path data-c="239E" d="M490 0L598 0L598 253C598 581 487 920 363 1150C281 1301 190 1415 91 1490C87 1493 82 1495 77 1495C60 1495 52 1487 52 1470C52 1462 55 1455 62 1450C143 1389 216 1292 283 1160C402 924 490 593 490 253Z" transform="translate(0,655)"></path><path data-c="23A0" d="M598 1242L598 1495L490 1495L490 1242C490 1088 472 933 437 776C375 494 246 184 63 44C56 40 52 34 52 25C52 8 60 0 77 0C82 0 87 2 91 5C178 71 261 170 339 303C477 539 598 892 598 1242Z" transform="translate(0,-1650)"></path><svg width="875" height="950" y="-225" x="0" viewBox="0 237.5 875 950"><path data-c="239F" d="M490 0L598 0L598 498L490 498Z" transform="scale(1,2.861)"></path></svg></g></g><g data-mml-node="mrow" data-latex="{pmatrix}" transform="translate(5416.7,0)"><g data-mml-node="mo"><path data-c="239B" d="M813 1450C820 1455 823 1462 823 1470C823 1487 815 1495 798 1495C793 1495 788 1493 784 1490C697 1423 614 1324 536 1192C399 956 277 603 277 253L277 0L385 0L385 253C385 407 403 562 438 719C500 999 630 1313 813 1450Z" transform="translate(0,655)"></path><path data-c="239D" d="M798 0C815 0 823 8 823 25C823 34 819 40 812 44C731 106 658 202 592 334C474 569 385 903 385 1242L385 1495L277 1495L277 1242C277 914 388 575 512 345C594 193 685 80 784 5C788 2 793 0 798 0Z" transform="translate(0,-1650)"></path><svg width="875" height="950" y="-225" x="0" viewBox="0 237.5 875 950"><path data-c="239C" d="M277 0L385 0L385 498L277 498Z" transform="scale(1,2.861)"></path></svg></g><g data-mml-node="mtable" transform="translate(875,0)"><g data-mml-node="mtr" transform="translate(0,1400)"><g data-mml-node="mtd"><g data-mml-node="mi" data-latex="a"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g></g></g><g data-mml-node="mtr"><g data-mml-node="mtd" transform="translate(50,0)"><g data-mml-node="mi" data-latex="b"><path data-c="1D44F" d="M281 445C245 445 209 428 174 394L243 679C241 688 238 694 226 694C193 694 120 685 107 684C92 682 84 675 84 660C84 650 93 645 112 645C131 645 157 646 157 632C157 628 152 608 143 571L63 249C52 207 47 173 47 148C47 62 93-11 175-11C240-11 297 22 347 89C392 151 415 216 415 283C415 370 364 445 281 445M279 415C318 415 337 385 337 326C337 299 331 263 319 218C297 133 268 75 233 44C213 27 194 19 175 19C134 19 114 51 114 115C114 137 119 170 129 214L151 304C154 319 159 330 165 338C204 389 242 415 279 415Z"></path></g></g></g><g data-mml-node="mtr" transform="translate(0,-1400)"><g data-mml-node="mtd" transform="translate(14.5,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g></g></g><g data-mml-node="mo" transform="translate(1404,0)"><path data-c="239E" d="M490 0L598 0L598 253C598 581 487 920 363 1150C281 1301 190 1415 91 1490C87 1493 82 1495 77 1495C60 1495 52 1487 52 1470C52 1462 55 1455 62 1450C143 1389 216 1292 283 1160C402 924 490 593 490 253Z" transform="translate(0,655)"></path><path data-c="23A0" d="M598 1242L598 1495L490 1495L490 1242C490 1088 472 933 437 776C375 494 246 184 63 44C56 40 52 34 52 25C52 8 60 0 77 0C82 0 87 2 91 5C178 71 261 170 339 303C477 539 598 892 598 1242Z" transform="translate(0,-1650)"></path><svg width="875" height="950" y="-225" x="0" viewBox="0 237.5 875 950"><path data-c="239F" d="M490 0L598 0L598 498L490 498Z" transform="scale(1,2.861)"></path></svg></g></g><g data-mml-node="mo" data-latex="=" transform="translate(7973.4,0)"><path data-c="3D" d="M698 367L80 367C64 367 56 359 56 344C56 329 64 321 80 321L698 321C714 321 722 329 722 344C722 356 711 367 698 367M698 179L80 179C64 179 56 171 56 156C56 141 64 133 80 133L698 133C714 133 722 141 722 156C722 169 711 179 698 179Z"></path></g><g data-mml-node="mrow" data-latex="{pmatrix}" transform="translate(9029.2,0)"><g data-mml-node="mo"><path data-c="239B" d="M813 1450C820 1455 823 1462 823 1470C823 1487 815 1495 798 1495C793 1495 788 1493 784 1490C697 1423 614 1324 536 1192C399 956 277 603 277 253L277 0L385 0L385 253C385 407 403 562 438 719C500 999 630 1313 813 1450Z" transform="translate(0,655)"></path><path data-c="239D" d="M798 0C815 0 823 8 823 25C823 34 819 40 812 44C731 106 658 202 592 334C474 569 385 903 385 1242L385 1495L277 1495L277 1242C277 914 388 575 512 345C594 193 685 80 784 5C788 2 793 0 798 0Z" transform="translate(0,-1650)"></path><svg width="875" height="950" y="-225" x="0" viewBox="0 237.5 875 950"><path data-c="239C" d="M277 0L385 0L385 498L277 498Z" transform="scale(1,2.861)"></path></svg></g><g data-mml-node="mtable" transform="translate(875,0)"><g data-mml-node="mtr" transform="translate(0,1400)"><g data-mml-node="mtd"><g data-mml-node="mi" data-latex="a"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g></g></g><g data-mml-node="mtr"><g data-mml-node="mtd" transform="translate(50,0)"><g data-mml-node="mi" data-latex="b"><path data-c="1D44F" d="M281 445C245 445 209 428 174 394L243 679C241 688 238 694 226 694C193 694 120 685 107 684C92 682 84 675 84 660C84 650 93 645 112 645C131 645 157 646 157 632C157 628 152 608 143 571L63 249C52 207 47 173 47 148C47 62 93-11 175-11C240-11 297 22 347 89C392 151 415 216 415 283C415 370 364 445 281 445M279 415C318 415 337 385 337 326C337 299 331 263 319 218C297 133 268 75 233 44C213 27 194 19 175 19C134 19 114 51 114 115C114 137 119 170 129 214L151 304C154 319 159 330 165 338C204 389 242 415 279 415Z"></path></g></g></g><g data-mml-node="mtr" transform="translate(0,-1400)"><g data-mml-node="mtd" transform="translate(14.5,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g></g></g><g data-mml-node="mo" transform="translate(1404,0)"><path data-c="239E" d="M490 0L598 0L598 253C598 581 487 920 363 1150C281 1301 190 1415 91 1490C87 1493 82 1495 77 1495C60 1495 52 1487 52 1470C52 1462 55 1455 62 1450C143 1389 216 1292 283 1160C402 924 490 593 490 253Z" transform="translate(0,655)"></path><path data-c="23A0" d="M598 1242L598 1495L490 1495L490 1242C490 1088 472 933 437 776C375 494 246 184 63 44C56 40 52 34 52 25C52 8 60 0 77 0C82 0 87 2 91 5C178 71 261 170 339 303C477 539 598 892 598 1242Z" transform="translate(0,-1650)"></path><svg width="875" height="950" y="-225" x="0" viewBox="0 237.5 875 950"><path data-c="239F" d="M490 0L598 0L598 498L490 498Z" transform="scale(1,2.861)"></path></svg></g></g></g></g></svg></mjx-container></p></li><li><p>这也是非常符合直觉和数学定义的。</p></li></ul><h2 id="齐次坐标表示法的比例不变性与透视直觉"><a href="#齐次坐标表示法的比例不变性与透视直觉" class="headerlink" title="齐次坐标表示法的比例不变性与透视直觉"></a>齐次坐标表示法的比例不变性与透视直觉</h2><ul><li><p>对于一个使用齐次坐标表示法表示的二维平面上的点：</p><p>  <mjx-container class="MathJax" jax="SVG" overflow="overflow" display="true"><svg style="vertical-align: -3.733ex;" xmlns="http://www.w3.org/2000/svg" width="15.993ex" height="8.597ex" role="img" focusable="false" viewBox="0 -2150 7068.9 3800"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="  \begin{pmatrix}  X \\  Y \\  W  \end{pmatrix}, (W \neq 0)  "><g data-mml-node="mrow" data-latex="{pmatrix}"><g data-mml-node="mo"><path data-c="239B" d="M813 1450C820 1455 823 1462 823 1470C823 1487 815 1495 798 1495C793 1495 788 1493 784 1490C697 1423 614 1324 536 1192C399 956 277 603 277 253L277 0L385 0L385 253C385 407 403 562 438 719C500 999 630 1313 813 1450Z" transform="translate(0,655)"></path><path data-c="239D" d="M798 0C815 0 823 8 823 25C823 34 819 40 812 44C731 106 658 202 592 334C474 569 385 903 385 1242L385 1495L277 1495L277 1242C277 914 388 575 512 345C594 193 685 80 784 5C788 2 793 0 798 0Z" transform="translate(0,-1650)"></path><svg width="875" height="950" y="-225" x="0" viewBox="0 237.5 875 950"><path data-c="239C" d="M277 0L385 0L385 498L277 498Z" transform="scale(1,2.861)"></path></svg></g><g data-mml-node="mtable" transform="translate(875,0)"><g data-mml-node="mtr" transform="translate(0,1400)"><g data-mml-node="mtd" transform="translate(98.5,0)"><g data-mml-node="mi" data-latex="X"><path data-c="1D44B" d="M834 683C817 683 758 680 741 680C721 680 651 683 631 683C616 683 608 675 608 659C608 650 613 645 624 644C648 641 660 633 660 618C660 609 654 598 642 585L486 417C457 485 429 552 400 620C401 622 402 624 405 626C414 636 431 642 455 644C471 646 479 654 479 667C479 678 473 683 460 683C436 683 359 680 335 680C314 680 245 683 224 683C209 683 202 675 202 659C202 649 211 644 229 644C274 644 288 644 300 615L416 342L208 119C205 116 201 112 196 109C155 66 108 42 53 39C36 38 27 29 27 14C30 5 31 0 44 0C61 0 120 3 137 3C158 3 227 0 248 0C263 0 270 8 270 24C270 33 265 38 254 39C230 41 218 50 218 65C218 75 227 89 244 107C306 173 369 239 430 306C464 225 499 145 532 63C531 61 530 59 527 56C518 47 502 42 478 39C463 37 455 29 455 16C455 5 461 0 474 0L599 3C620 3 690 0 708 0C723 0 731 8 731 23C731 33 724 38 709 39C678 39 658 40 651 44C644 48 636 60 628 80L501 383C569 455 620 509 653 546C677 571 693 588 702 595C739 626 780 642 825 644C846 645 851 650 851 669C848 678 847 683 834 683Z"></path></g></g></g><g data-mml-node="mtr"><g data-mml-node="mtd" transform="translate(143,0)"><g data-mml-node="mi" data-latex="Y"><path data-c="1D44C" d="M664 680C646 680 584 683 565 683C550 683 542 675 542 660C542 649 548 644 561 644C582 644 593 638 593 626C593 615 584 600 567 581L342 322L236 609C233 617 231 622 230 625C230 638 248 644 284 644C303 644 312 652 312 668C312 678 306 683 293 683L168 680C146 680 76 683 58 683C43 683 35 675 35 659C35 649 44 644 62 644C80 644 95 642 104 640C123 635 124 632 130 613L252 288C255 281 256 276 256 273L235 190C223 139 215 107 211 94C204 67 197 51 190 46C183 41 160 39 122 39C100 38 91 37 91 15C91 5 97 0 109 0L234 3L360 0C375-1 383 7 383 24C383 31 380 36 375 37C365 38 357 39 352 39C319 40 299 42 294 45C292 46 291 48 291 52C291 56 296 77 305 114L340 253C343 266 347 276 353 282L598 564L611 577C637 603 661 621 682 630C699 638 718 643 739 644C757 646 762 651 762 667C762 678 756 683 745 683C730 683 679 680 664 680Z"></path></g></g></g><g data-mml-node="mtr" transform="translate(0,-1400)"><g data-mml-node="mtd"><g data-mml-node="mi" data-latex="W"><path data-c="1D44A" d="M956 680C937 680 872 683 853 683C838 683 830 675 830 660C830 650 836 645 848 644C885 643 903 632 903 610C903 604 899 594 891 579L629 125L594 602C590 638 614 644 659 644C680 644 690 652 690 668C690 678 684 683 671 683C649 683 572 680 550 680C531 680 465 683 446 683C431 683 423 675 423 659C423 649 432 644 451 644C482 644 498 637 499 623L505 548L261 125L225 613C222 638 264 644 296 644C313 644 321 652 321 668C321 678 315 683 303 683C281 683 203 680 181 680C162 680 96 683 77 683C62 683 55 675 55 660C55 649 65 644 84 644C126 644 130 642 132 612L177 7C178-12 185-22 197-22C210-20 215-17 223-2C224-1 224 0 224 1L509 494L545 7C546-12 553-22 565-22C575-22 584-15 592-1L918 562C945 611 964 639 1025 644C1043 646 1048 651 1048 668C1048 678 1043 683 1032 683C1018 683 970 680 956 680Z"></path></g></g></g></g><g data-mml-node="mo" transform="translate(1923,0)"><path data-c="239E" d="M490 0L598 0L598 253C598 581 487 920 363 1150C281 1301 190 1415 91 1490C87 1493 82 1495 77 1495C60 1495 52 1487 52 1470C52 1462 55 1455 62 1450C143 1389 216 1292 283 1160C402 924 490 593 490 253Z" transform="translate(0,655)"></path><path data-c="23A0" d="M598 1242L598 1495L490 1495L490 1242C490 1088 472 933 437 776C375 494 246 184 63 44C56 40 52 34 52 25C52 8 60 0 77 0C82 0 87 2 91 5C178 71 261 170 339 303C477 539 598 892 598 1242Z" transform="translate(0,-1650)"></path><svg width="875" height="950" y="-225" x="0" viewBox="0 237.5 875 950"><path data-c="239F" d="M490 0L598 0L598 498L490 498Z" transform="scale(1,2.861)"></path></svg></g></g><g data-mml-node="mo" data-latex="," transform="translate(2964.7,0)"><path data-c="2C" d="M139 106C107 106 86 82 86 50C86 20 109-5 139-5C153-5 165-1 174 8L175 0C175-63 154-117 112-160C105-168 101-174 101-178C101-188 105-193 114-193C123-193 135-181 152-158C186-110 203-57 203 0C203 53 185 106 139 106Z"></path></g><g data-mml-node="mo" data-latex="(" transform="translate(3409.3,0)"><path data-c="28" d="M318-248C327-248 332-243 332-234C332-231 330-227 327-223C275-183 233-117 202-26C175 53 161 131 161 208L161 292C161 369 175 447 202 526C233 617 275 683 327 723C330 726 332 730 332 734C332 743 327 748 318 748C317 748 314 747 311 745C251 699 201 631 160 540C121 453 101 371 101 292L101 208C101 129 121 47 160-40C201-131 251-199 311-245C314-247 317-248 318-248Z"></path></g><g data-mml-node="mi" data-latex="W" transform="translate(3798.3,0)"><path data-c="1D44A" d="M956 680C937 680 872 683 853 683C838 683 830 675 830 660C830 650 836 645 848 644C885 643 903 632 903 610C903 604 899 594 891 579L629 125L594 602C590 638 614 644 659 644C680 644 690 652 690 668C690 678 684 683 671 683C649 683 572 680 550 680C531 680 465 683 446 683C431 683 423 675 423 659C423 649 432 644 451 644C482 644 498 637 499 623L505 548L261 125L225 613C222 638 264 644 296 644C313 644 321 652 321 668C321 678 315 683 303 683C281 683 203 680 181 680C162 680 96 683 77 683C62 683 55 675 55 660C55 649 65 644 84 644C126 644 130 642 132 612L177 7C178-12 185-22 197-22C210-20 215-17 223-2C224-1 224 0 224 1L509 494L545 7C546-12 553-22 565-22C575-22 584-15 592-1L918 562C945 611 964 639 1025 644C1043 646 1048 651 1048 668C1048 678 1043 683 1032 683C1018 683 970 680 956 680Z"></path></g><g data-mml-node="mo" data-latex="\neq" transform="translate(5124.1,0)"><path data-c="2260" d="M698 178L388 178L440 322L698 322C714 322 722 330 722 346C722 362 714 370 698 370L458 370L576 698C578 701 579 703 579 706C579 722 571 730 555 730C542 730 535 725 532 714L407 370L80 370C64 370 56 362 56 346C56 330 64 322 80 322L390 322L338 178L80 178C64 178 56 170 56 154C56 138 64 130 80 130L320 130L201-198C200-200 200-203 200-206C200-222 208-230 224-230C236-230 243-225 246-214L371 130L698 130C714 130 722 138 722 154C722 166 711 178 698 178Z"></path></g><g data-mml-node="mn" data-latex="0" transform="translate(6179.9,0)"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g><g data-mml-node="mo" data-latex=")" transform="translate(6679.9,0)"><path data-c="29" d="M78-245C138-199 188-131 229-40C268 47 288 129 288 208L288 292C288 371 268 453 229 540C188 631 138 699 78 745C75 747 72 748 71 748C62 748 57 743 57 734C57 730 59 726 62 723C114 683 156 617 187 526C214 447 228 369 228 292L228 208C228 131 214 53 187-26C156-117 114-183 62-223C59-227 57-231 57-234C57-243 62-248 71-248C72-248 75-247 78-245Z"></path></g></g></g></svg></mjx-container></p></li><li><p>若将其整体乘以一个非零常数，结果仍然表示相同的点：</p><p>  <mjx-container class="MathJax" jax="SVG" overflow="overflow" display="true"><svg style="vertical-align: -3.733ex;" xmlns="http://www.w3.org/2000/svg" width="25.315ex" height="8.597ex" role="img" focusable="false" viewBox="0 -2150 11189.4 3800"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="  \begin{pmatrix}  X \\  Y \\  W  \end{pmatrix}  \sim  \begin{pmatrix}  kX \\  kY \\  kW  \end{pmatrix}, (k \neq 0)  "><g data-mml-node="mrow" data-latex="{pmatrix}"><g data-mml-node="mo"><path data-c="239B" d="M813 1450C820 1455 823 1462 823 1470C823 1487 815 1495 798 1495C793 1495 788 1493 784 1490C697 1423 614 1324 536 1192C399 956 277 603 277 253L277 0L385 0L385 253C385 407 403 562 438 719C500 999 630 1313 813 1450Z" transform="translate(0,655)"></path><path data-c="239D" d="M798 0C815 0 823 8 823 25C823 34 819 40 812 44C731 106 658 202 592 334C474 569 385 903 385 1242L385 1495L277 1495L277 1242C277 914 388 575 512 345C594 193 685 80 784 5C788 2 793 0 798 0Z" transform="translate(0,-1650)"></path><svg width="875" height="950" y="-225" x="0" viewBox="0 237.5 875 950"><path data-c="239C" d="M277 0L385 0L385 498L277 498Z" transform="scale(1,2.861)"></path></svg></g><g data-mml-node="mtable" transform="translate(875,0)"><g data-mml-node="mtr" transform="translate(0,1400)"><g data-mml-node="mtd" transform="translate(98.5,0)"><g data-mml-node="mi" data-latex="X"><path data-c="1D44B" d="M834 683C817 683 758 680 741 680C721 680 651 683 631 683C616 683 608 675 608 659C608 650 613 645 624 644C648 641 660 633 660 618C660 609 654 598 642 585L486 417C457 485 429 552 400 620C401 622 402 624 405 626C414 636 431 642 455 644C471 646 479 654 479 667C479 678 473 683 460 683C436 683 359 680 335 680C314 680 245 683 224 683C209 683 202 675 202 659C202 649 211 644 229 644C274 644 288 644 300 615L416 342L208 119C205 116 201 112 196 109C155 66 108 42 53 39C36 38 27 29 27 14C30 5 31 0 44 0C61 0 120 3 137 3C158 3 227 0 248 0C263 0 270 8 270 24C270 33 265 38 254 39C230 41 218 50 218 65C218 75 227 89 244 107C306 173 369 239 430 306C464 225 499 145 532 63C531 61 530 59 527 56C518 47 502 42 478 39C463 37 455 29 455 16C455 5 461 0 474 0L599 3C620 3 690 0 708 0C723 0 731 8 731 23C731 33 724 38 709 39C678 39 658 40 651 44C644 48 636 60 628 80L501 383C569 455 620 509 653 546C677 571 693 588 702 595C739 626 780 642 825 644C846 645 851 650 851 669C848 678 847 683 834 683Z"></path></g></g></g><g data-mml-node="mtr"><g data-mml-node="mtd" transform="translate(143,0)"><g data-mml-node="mi" data-latex="Y"><path data-c="1D44C" d="M664 680C646 680 584 683 565 683C550 683 542 675 542 660C542 649 548 644 561 644C582 644 593 638 593 626C593 615 584 600 567 581L342 322L236 609C233 617 231 622 230 625C230 638 248 644 284 644C303 644 312 652 312 668C312 678 306 683 293 683L168 680C146 680 76 683 58 683C43 683 35 675 35 659C35 649 44 644 62 644C80 644 95 642 104 640C123 635 124 632 130 613L252 288C255 281 256 276 256 273L235 190C223 139 215 107 211 94C204 67 197 51 190 46C183 41 160 39 122 39C100 38 91 37 91 15C91 5 97 0 109 0L234 3L360 0C375-1 383 7 383 24C383 31 380 36 375 37C365 38 357 39 352 39C319 40 299 42 294 45C292 46 291 48 291 52C291 56 296 77 305 114L340 253C343 266 347 276 353 282L598 564L611 577C637 603 661 621 682 630C699 638 718 643 739 644C757 646 762 651 762 667C762 678 756 683 745 683C730 683 679 680 664 680Z"></path></g></g></g><g data-mml-node="mtr" transform="translate(0,-1400)"><g data-mml-node="mtd"><g data-mml-node="mi" data-latex="W"><path data-c="1D44A" d="M956 680C937 680 872 683 853 683C838 683 830 675 830 660C830 650 836 645 848 644C885 643 903 632 903 610C903 604 899 594 891 579L629 125L594 602C590 638 614 644 659 644C680 644 690 652 690 668C690 678 684 683 671 683C649 683 572 680 550 680C531 680 465 683 446 683C431 683 423 675 423 659C423 649 432 644 451 644C482 644 498 637 499 623L505 548L261 125L225 613C222 638 264 644 296 644C313 644 321 652 321 668C321 678 315 683 303 683C281 683 203 680 181 680C162 680 96 683 77 683C62 683 55 675 55 660C55 649 65 644 84 644C126 644 130 642 132 612L177 7C178-12 185-22 197-22C210-20 215-17 223-2C224-1 224 0 224 1L509 494L545 7C546-12 553-22 565-22C575-22 584-15 592-1L918 562C945 611 964 639 1025 644C1043 646 1048 651 1048 668C1048 678 1043 683 1032 683C1018 683 970 680 956 680Z"></path></g></g></g></g><g data-mml-node="mo" transform="translate(1923,0)"><path data-c="239E" d="M490 0L598 0L598 253C598 581 487 920 363 1150C281 1301 190 1415 91 1490C87 1493 82 1495 77 1495C60 1495 52 1487 52 1470C52 1462 55 1455 62 1450C143 1389 216 1292 283 1160C402 924 490 593 490 253Z" transform="translate(0,655)"></path><path data-c="23A0" d="M598 1242L598 1495L490 1495L490 1242C490 1088 472 933 437 776C375 494 246 184 63 44C56 40 52 34 52 25C52 8 60 0 77 0C82 0 87 2 91 5C178 71 261 170 339 303C477 539 598 892 598 1242Z" transform="translate(0,-1650)"></path><svg width="875" height="950" y="-225" x="0" viewBox="0 237.5 875 950"><path data-c="239F" d="M490 0L598 0L598 498L490 498Z" transform="scale(1,2.861)"></path></svg></g></g><g data-mml-node="mo" data-latex="\sim" transform="translate(3075.8,0)"><path data-c="223C" d="M597 143C674 166 714 235 717 350C717 361 712 366 701 366C691 366 686 361 685 351C684 308 675 275 657 251C637 224 592 194 548 194C518 194 486 207 453 233C434 248 418 261 406 271C335 333 274 364 222 364C207 364 192 362 177 357C92 332 59 262 56 150C56 139 61 134 72 134C82 134 87 139 88 149C89 192 98 225 116 249C135 275 182 306 225 306C255 306 287 293 320 267C339 252 355 239 367 229C438 167 499 136 551 136C566 136 582 138 597 143Z"></path></g><g data-mml-node="mrow" data-latex="{pmatrix}" transform="translate(4126.6,0)"><g data-mml-node="mo"><path data-c="239B" d="M813 1450C820 1455 823 1462 823 1470C823 1487 815 1495 798 1495C793 1495 788 1493 784 1490C697 1423 614 1324 536 1192C399 956 277 603 277 253L277 0L385 0L385 253C385 407 403 562 438 719C500 999 630 1313 813 1450Z" transform="translate(0,655)"></path><path data-c="239D" d="M798 0C815 0 823 8 823 25C823 34 819 40 812 44C731 106 658 202 592 334C474 569 385 903 385 1242L385 1495L277 1495L277 1242C277 914 388 575 512 345C594 193 685 80 784 5C788 2 793 0 798 0Z" transform="translate(0,-1650)"></path><svg width="875" height="950" y="-225" x="0" viewBox="0 237.5 875 950"><path data-c="239C" d="M277 0L385 0L385 498L277 498Z" transform="scale(1,2.861)"></path></svg></g><g data-mml-node="mtable" transform="translate(875,0)"><g data-mml-node="mtr" transform="translate(0,1400)"><g data-mml-node="mtd" transform="translate(98.5,0)"><g data-mml-node="mi" data-latex="k"><path data-c="1D458" d="M409 353C409 327 423 314 450 314C485 314 508 345 508 379C508 418 476 445 437 445C392 445 344 415 291 356C250 311 217 282 190 269L291 679C289 688 287 694 274 694C242 694 166 685 154 684C139 682 132 675 132 660C132 650 141 645 159 645C178 645 204 646 204 632L59 43C56 32 55 25 55 21C55 0 66-11 87-11C104-11 117-3 124 12C129 21 147 92 179 226C231 221 286 196 286 146C286 131 279 101 279 91C279 34 316-11 373-11C431-11 470 41 490 145C490 154 485 159 475 159C466 159 460 152 457 138C435 59 408 19 375 19C357 19 348 33 348 61C348 77 360 131 360 147C360 204 314 239 221 253C244 269 270 292 298 322C326 352 346 371 359 382C386 404 412 415 435 415C445 415 453 413 459 409C432 404 409 379 409 353Z"></path></g><g data-mml-node="mi" data-latex="X" transform="translate(521,0)"><path data-c="1D44B" d="M834 683C817 683 758 680 741 680C721 680 651 683 631 683C616 683 608 675 608 659C608 650 613 645 624 644C648 641 660 633 660 618C660 609 654 598 642 585L486 417C457 485 429 552 400 620C401 622 402 624 405 626C414 636 431 642 455 644C471 646 479 654 479 667C479 678 473 683 460 683C436 683 359 680 335 680C314 680 245 683 224 683C209 683 202 675 202 659C202 649 211 644 229 644C274 644 288 644 300 615L416 342L208 119C205 116 201 112 196 109C155 66 108 42 53 39C36 38 27 29 27 14C30 5 31 0 44 0C61 0 120 3 137 3C158 3 227 0 248 0C263 0 270 8 270 24C270 33 265 38 254 39C230 41 218 50 218 65C218 75 227 89 244 107C306 173 369 239 430 306C464 225 499 145 532 63C531 61 530 59 527 56C518 47 502 42 478 39C463 37 455 29 455 16C455 5 461 0 474 0L599 3C620 3 690 0 708 0C723 0 731 8 731 23C731 33 724 38 709 39C678 39 658 40 651 44C644 48 636 60 628 80L501 383C569 455 620 509 653 546C677 571 693 588 702 595C739 626 780 642 825 644C846 645 851 650 851 669C848 678 847 683 834 683Z"></path></g></g></g><g data-mml-node="mtr"><g data-mml-node="mtd" transform="translate(143,0)"><g data-mml-node="mi" data-latex="k"><path data-c="1D458" d="M409 353C409 327 423 314 450 314C485 314 508 345 508 379C508 418 476 445 437 445C392 445 344 415 291 356C250 311 217 282 190 269L291 679C289 688 287 694 274 694C242 694 166 685 154 684C139 682 132 675 132 660C132 650 141 645 159 645C178 645 204 646 204 632L59 43C56 32 55 25 55 21C55 0 66-11 87-11C104-11 117-3 124 12C129 21 147 92 179 226C231 221 286 196 286 146C286 131 279 101 279 91C279 34 316-11 373-11C431-11 470 41 490 145C490 154 485 159 475 159C466 159 460 152 457 138C435 59 408 19 375 19C357 19 348 33 348 61C348 77 360 131 360 147C360 204 314 239 221 253C244 269 270 292 298 322C326 352 346 371 359 382C386 404 412 415 435 415C445 415 453 413 459 409C432 404 409 379 409 353Z"></path></g><g data-mml-node="mi" data-latex="Y" transform="translate(521,0)"><path data-c="1D44C" d="M664 680C646 680 584 683 565 683C550 683 542 675 542 660C542 649 548 644 561 644C582 644 593 638 593 626C593 615 584 600 567 581L342 322L236 609C233 617 231 622 230 625C230 638 248 644 284 644C303 644 312 652 312 668C312 678 306 683 293 683L168 680C146 680 76 683 58 683C43 683 35 675 35 659C35 649 44 644 62 644C80 644 95 642 104 640C123 635 124 632 130 613L252 288C255 281 256 276 256 273L235 190C223 139 215 107 211 94C204 67 197 51 190 46C183 41 160 39 122 39C100 38 91 37 91 15C91 5 97 0 109 0L234 3L360 0C375-1 383 7 383 24C383 31 380 36 375 37C365 38 357 39 352 39C319 40 299 42 294 45C292 46 291 48 291 52C291 56 296 77 305 114L340 253C343 266 347 276 353 282L598 564L611 577C637 603 661 621 682 630C699 638 718 643 739 644C757 646 762 651 762 667C762 678 756 683 745 683C730 683 679 680 664 680Z"></path></g></g></g><g data-mml-node="mtr" transform="translate(0,-1400)"><g data-mml-node="mtd"><g data-mml-node="mi" data-latex="k"><path data-c="1D458" d="M409 353C409 327 423 314 450 314C485 314 508 345 508 379C508 418 476 445 437 445C392 445 344 415 291 356C250 311 217 282 190 269L291 679C289 688 287 694 274 694C242 694 166 685 154 684C139 682 132 675 132 660C132 650 141 645 159 645C178 645 204 646 204 632L59 43C56 32 55 25 55 21C55 0 66-11 87-11C104-11 117-3 124 12C129 21 147 92 179 226C231 221 286 196 286 146C286 131 279 101 279 91C279 34 316-11 373-11C431-11 470 41 490 145C490 154 485 159 475 159C466 159 460 152 457 138C435 59 408 19 375 19C357 19 348 33 348 61C348 77 360 131 360 147C360 204 314 239 221 253C244 269 270 292 298 322C326 352 346 371 359 382C386 404 412 415 435 415C445 415 453 413 459 409C432 404 409 379 409 353Z"></path></g><g data-mml-node="mi" data-latex="W" transform="translate(521,0)"><path data-c="1D44A" d="M956 680C937 680 872 683 853 683C838 683 830 675 830 660C830 650 836 645 848 644C885 643 903 632 903 610C903 604 899 594 891 579L629 125L594 602C590 638 614 644 659 644C680 644 690 652 690 668C690 678 684 683 671 683C649 683 572 680 550 680C531 680 465 683 446 683C431 683 423 675 423 659C423 649 432 644 451 644C482 644 498 637 499 623L505 548L261 125L225 613C222 638 264 644 296 644C313 644 321 652 321 668C321 678 315 683 303 683C281 683 203 680 181 680C162 680 96 683 77 683C62 683 55 675 55 660C55 649 65 644 84 644C126 644 130 642 132 612L177 7C178-12 185-22 197-22C210-20 215-17 223-2C224-1 224 0 224 1L509 494L545 7C546-12 553-22 565-22C575-22 584-15 592-1L918 562C945 611 964 639 1025 644C1043 646 1048 651 1048 668C1048 678 1043 683 1032 683C1018 683 970 680 956 680Z"></path></g></g></g></g><g data-mml-node="mo" transform="translate(2444,0)"><path data-c="239E" d="M490 0L598 0L598 253C598 581 487 920 363 1150C281 1301 190 1415 91 1490C87 1493 82 1495 77 1495C60 1495 52 1487 52 1470C52 1462 55 1455 62 1450C143 1389 216 1292 283 1160C402 924 490 593 490 253Z" transform="translate(0,655)"></path><path data-c="23A0" d="M598 1242L598 1495L490 1495L490 1242C490 1088 472 933 437 776C375 494 246 184 63 44C56 40 52 34 52 25C52 8 60 0 77 0C82 0 87 2 91 5C178 71 261 170 339 303C477 539 598 892 598 1242Z" transform="translate(0,-1650)"></path><svg width="875" height="950" y="-225" x="0" viewBox="0 237.5 875 950"><path data-c="239F" d="M490 0L598 0L598 498L490 498Z" transform="scale(1,2.861)"></path></svg></g></g><g data-mml-node="mo" data-latex="," transform="translate(7612.2,0)"><path data-c="2C" d="M139 106C107 106 86 82 86 50C86 20 109-5 139-5C153-5 165-1 174 8L175 0C175-63 154-117 112-160C105-168 101-174 101-178C101-188 105-193 114-193C123-193 135-181 152-158C186-110 203-57 203 0C203 53 185 106 139 106Z"></path></g><g data-mml-node="mo" data-latex="(" transform="translate(8056.9,0)"><path data-c="28" d="M318-248C327-248 332-243 332-234C332-231 330-227 327-223C275-183 233-117 202-26C175 53 161 131 161 208L161 292C161 369 175 447 202 526C233 617 275 683 327 723C330 726 332 730 332 734C332 743 327 748 318 748C317 748 314 747 311 745C251 699 201 631 160 540C121 453 101 371 101 292L101 208C101 129 121 47 160-40C201-131 251-199 311-245C314-247 317-248 318-248Z"></path></g><g data-mml-node="mi" data-latex="k" transform="translate(8445.9,0)"><path data-c="1D458" d="M409 353C409 327 423 314 450 314C485 314 508 345 508 379C508 418 476 445 437 445C392 445 344 415 291 356C250 311 217 282 190 269L291 679C289 688 287 694 274 694C242 694 166 685 154 684C139 682 132 675 132 660C132 650 141 645 159 645C178 645 204 646 204 632L59 43C56 32 55 25 55 21C55 0 66-11 87-11C104-11 117-3 124 12C129 21 147 92 179 226C231 221 286 196 286 146C286 131 279 101 279 91C279 34 316-11 373-11C431-11 470 41 490 145C490 154 485 159 475 159C466 159 460 152 457 138C435 59 408 19 375 19C357 19 348 33 348 61C348 77 360 131 360 147C360 204 314 239 221 253C244 269 270 292 298 322C326 352 346 371 359 382C386 404 412 415 435 415C445 415 453 413 459 409C432 404 409 379 409 353Z"></path></g><g data-mml-node="mo" data-latex="\neq" transform="translate(9244.7,0)"><path data-c="2260" d="M698 178L388 178L440 322L698 322C714 322 722 330 722 346C722 362 714 370 698 370L458 370L576 698C578 701 579 703 579 706C579 722 571 730 555 730C542 730 535 725 532 714L407 370L80 370C64 370 56 362 56 346C56 330 64 322 80 322L390 322L338 178L80 178C64 178 56 170 56 154C56 138 64 130 80 130L320 130L201-198C200-200 200-203 200-206C200-222 208-230 224-230C236-230 243-225 246-214L371 130L698 130C714 130 722 138 722 154C722 166 711 178 698 178Z"></path></g><g data-mml-node="mn" data-latex="0" transform="translate(10300.4,0)"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g><g data-mml-node="mo" data-latex=")" transform="translate(10800.4,0)"><path data-c="29" d="M78-245C138-199 188-131 229-40C268 47 288 129 288 208L288 292C288 371 268 453 229 540C188 631 138 699 78 745C75 747 72 748 71 748C62 748 57 743 57 734C57 730 59 726 62 723C114 683 156 617 187 526C214 447 228 369 228 292L228 208C228 131 214 53 187-26C156-117 114-183 62-223C59-227 57-231 57-234C57-243 62-248 71-248C72-248 75-247 78-245Z"></path></g></g></g></svg></mjx-container></p></li><li><p>这是一个非常有趣的性质，因为这在某种程度上意味着 <strong>齐次坐标表示法所表示的点，是一条从视口中心出发的射线</strong>。</p><ul><li>当然，这条射线不是这个点所在的二维平面上的射线，而是为了描述射影点而引入的几何解释。换言之，观察一张照片时，大脑想象出的“深度空间”（射影空间）中，由摄像机出发的一条射线。</li><li>严格来说，在由 <mjx-container class="MathJax" jax="SVG" overflow="overflow"><svg style="vertical-align: -0.561ex;" xmlns="http://www.w3.org/2000/svg" width="9.793ex" height="2.253ex" role="img" focusable="false" viewBox="0 -748 4328.3 996"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="(X, Y, W)"><g data-mml-node="mo" data-latex="("><path data-c="28" d="M318-248C327-248 332-243 332-234C332-231 330-227 327-223C275-183 233-117 202-26C175 53 161 131 161 208L161 292C161 369 175 447 202 526C233 617 275 683 327 723C330 726 332 730 332 734C332 743 327 748 318 748C317 748 314 747 311 745C251 699 201 631 160 540C121 453 101 371 101 292L101 208C101 129 121 47 160-40C201-131 251-199 311-245C314-247 317-248 318-248Z"></path></g><g data-mml-node="mi" data-latex="X" transform="translate(389,0)"><path data-c="1D44B" d="M834 683C817 683 758 680 741 680C721 680 651 683 631 683C616 683 608 675 608 659C608 650 613 645 624 644C648 641 660 633 660 618C660 609 654 598 642 585L486 417C457 485 429 552 400 620C401 622 402 624 405 626C414 636 431 642 455 644C471 646 479 654 479 667C479 678 473 683 460 683C436 683 359 680 335 680C314 680 245 683 224 683C209 683 202 675 202 659C202 649 211 644 229 644C274 644 288 644 300 615L416 342L208 119C205 116 201 112 196 109C155 66 108 42 53 39C36 38 27 29 27 14C30 5 31 0 44 0C61 0 120 3 137 3C158 3 227 0 248 0C263 0 270 8 270 24C270 33 265 38 254 39C230 41 218 50 218 65C218 75 227 89 244 107C306 173 369 239 430 306C464 225 499 145 532 63C531 61 530 59 527 56C518 47 502 42 478 39C463 37 455 29 455 16C455 5 461 0 474 0L599 3C620 3 690 0 708 0C723 0 731 8 731 23C731 33 724 38 709 39C678 39 658 40 651 44C644 48 636 60 628 80L501 383C569 455 620 509 653 546C677 571 693 588 702 595C739 626 780 642 825 644C846 645 851 650 851 669C848 678 847 683 834 683Z"></path></g><g data-mml-node="mo" data-latex="," transform="translate(1240,0)"><path data-c="2C" d="M139 106C107 106 86 82 86 50C86 20 109-5 139-5C153-5 165-1 174 8L175 0C175-63 154-117 112-160C105-168 101-174 101-178C101-188 105-193 114-193C123-193 135-181 152-158C186-110 203-57 203 0C203 53 185 106 139 106Z"></path></g><g data-mml-node="mi" data-latex="Y" transform="translate(1684.7,0)"><path data-c="1D44C" d="M664 680C646 680 584 683 565 683C550 683 542 675 542 660C542 649 548 644 561 644C582 644 593 638 593 626C593 615 584 600 567 581L342 322L236 609C233 617 231 622 230 625C230 638 248 644 284 644C303 644 312 652 312 668C312 678 306 683 293 683L168 680C146 680 76 683 58 683C43 683 35 675 35 659C35 649 44 644 62 644C80 644 95 642 104 640C123 635 124 632 130 613L252 288C255 281 256 276 256 273L235 190C223 139 215 107 211 94C204 67 197 51 190 46C183 41 160 39 122 39C100 38 91 37 91 15C91 5 97 0 109 0L234 3L360 0C375-1 383 7 383 24C383 31 380 36 375 37C365 38 357 39 352 39C319 40 299 42 294 45C292 46 291 48 291 52C291 56 296 77 305 114L340 253C343 266 347 276 353 282L598 564L611 577C637 603 661 621 682 630C699 638 718 643 739 644C757 646 762 651 762 667C762 678 756 683 745 683C730 683 679 680 664 680Z"></path></g><g data-mml-node="mo" data-latex="," transform="translate(2446.7,0)"><path data-c="2C" d="M139 106C107 106 86 82 86 50C86 20 109-5 139-5C153-5 165-1 174 8L175 0C175-63 154-117 112-160C105-168 101-174 101-178C101-188 105-193 114-193C123-193 135-181 152-158C186-110 203-57 203 0C203 53 185 106 139 106Z"></path></g><g data-mml-node="mi" data-latex="W" transform="translate(2891.3,0)"><path data-c="1D44A" d="M956 680C937 680 872 683 853 683C838 683 830 675 830 660C830 650 836 645 848 644C885 643 903 632 903 610C903 604 899 594 891 579L629 125L594 602C590 638 614 644 659 644C680 644 690 652 690 668C690 678 684 683 671 683C649 683 572 680 550 680C531 680 465 683 446 683C431 683 423 675 423 659C423 649 432 644 451 644C482 644 498 637 499 623L505 548L261 125L225 613C222 638 264 644 296 644C313 644 321 652 321 668C321 678 315 683 303 683C281 683 203 680 181 680C162 680 96 683 77 683C62 683 55 675 55 660C55 649 65 644 84 644C126 644 130 642 132 612L177 7C178-12 185-22 197-22C210-20 215-17 223-2C224-1 224 0 224 1L509 494L545 7C546-12 553-22 565-22C575-22 584-15 592-1L918 562C945 611 964 639 1025 644C1043 646 1048 651 1048 668C1048 678 1043 683 1032 683C1018 683 970 680 956 680Z"></path></g><g data-mml-node="mo" data-latex=")" transform="translate(3939.3,0)"><path data-c="29" d="M78-245C138-199 188-131 229-40C268 47 288 129 288 208L288 292C288 371 268 453 229 540C188 631 138 699 78 745C75 747 72 748 71 748C62 748 57 743 57 734C57 730 59 726 62 723C114 683 156 617 187 526C214 447 228 369 228 292L228 208C228 131 214 53 187-26C156-117 114-183 62-223C59-227 57-231 57-234C57-243 62-248 71-248C72-248 75-247 78-245Z"></path></g></g></g></svg></mjx-container> 构成的抽象三维空间中，所有形如 <mjx-container class="MathJax" jax="SVG" overflow="overflow"><svg style="vertical-align: -0.561ex;" xmlns="http://www.w3.org/2000/svg" width="13.329ex" height="2.253ex" role="img" focusable="false" viewBox="0 -748 5891.3 996"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="(kX,kY,kW)"><g data-mml-node="mo" data-latex="("><path data-c="28" d="M318-248C327-248 332-243 332-234C332-231 330-227 327-223C275-183 233-117 202-26C175 53 161 131 161 208L161 292C161 369 175 447 202 526C233 617 275 683 327 723C330 726 332 730 332 734C332 743 327 748 318 748C317 748 314 747 311 745C251 699 201 631 160 540C121 453 101 371 101 292L101 208C101 129 121 47 160-40C201-131 251-199 311-245C314-247 317-248 318-248Z"></path></g><g data-mml-node="mi" data-latex="k" transform="translate(389,0)"><path data-c="1D458" d="M409 353C409 327 423 314 450 314C485 314 508 345 508 379C508 418 476 445 437 445C392 445 344 415 291 356C250 311 217 282 190 269L291 679C289 688 287 694 274 694C242 694 166 685 154 684C139 682 132 675 132 660C132 650 141 645 159 645C178 645 204 646 204 632L59 43C56 32 55 25 55 21C55 0 66-11 87-11C104-11 117-3 124 12C129 21 147 92 179 226C231 221 286 196 286 146C286 131 279 101 279 91C279 34 316-11 373-11C431-11 470 41 490 145C490 154 485 159 475 159C466 159 460 152 457 138C435 59 408 19 375 19C357 19 348 33 348 61C348 77 360 131 360 147C360 204 314 239 221 253C244 269 270 292 298 322C326 352 346 371 359 382C386 404 412 415 435 415C445 415 453 413 459 409C432 404 409 379 409 353Z"></path></g><g data-mml-node="mi" data-latex="X" transform="translate(910,0)"><path data-c="1D44B" d="M834 683C817 683 758 680 741 680C721 680 651 683 631 683C616 683 608 675 608 659C608 650 613 645 624 644C648 641 660 633 660 618C660 609 654 598 642 585L486 417C457 485 429 552 400 620C401 622 402 624 405 626C414 636 431 642 455 644C471 646 479 654 479 667C479 678 473 683 460 683C436 683 359 680 335 680C314 680 245 683 224 683C209 683 202 675 202 659C202 649 211 644 229 644C274 644 288 644 300 615L416 342L208 119C205 116 201 112 196 109C155 66 108 42 53 39C36 38 27 29 27 14C30 5 31 0 44 0C61 0 120 3 137 3C158 3 227 0 248 0C263 0 270 8 270 24C270 33 265 38 254 39C230 41 218 50 218 65C218 75 227 89 244 107C306 173 369 239 430 306C464 225 499 145 532 63C531 61 530 59 527 56C518 47 502 42 478 39C463 37 455 29 455 16C455 5 461 0 474 0L599 3C620 3 690 0 708 0C723 0 731 8 731 23C731 33 724 38 709 39C678 39 658 40 651 44C644 48 636 60 628 80L501 383C569 455 620 509 653 546C677 571 693 588 702 595C739 626 780 642 825 644C846 645 851 650 851 669C848 678 847 683 834 683Z"></path></g><g data-mml-node="mo" data-latex="," transform="translate(1761,0)"><path data-c="2C" d="M139 106C107 106 86 82 86 50C86 20 109-5 139-5C153-5 165-1 174 8L175 0C175-63 154-117 112-160C105-168 101-174 101-178C101-188 105-193 114-193C123-193 135-181 152-158C186-110 203-57 203 0C203 53 185 106 139 106Z"></path></g><g data-mml-node="mi" data-latex="k" transform="translate(2205.7,0)"><path data-c="1D458" d="M409 353C409 327 423 314 450 314C485 314 508 345 508 379C508 418 476 445 437 445C392 445 344 415 291 356C250 311 217 282 190 269L291 679C289 688 287 694 274 694C242 694 166 685 154 684C139 682 132 675 132 660C132 650 141 645 159 645C178 645 204 646 204 632L59 43C56 32 55 25 55 21C55 0 66-11 87-11C104-11 117-3 124 12C129 21 147 92 179 226C231 221 286 196 286 146C286 131 279 101 279 91C279 34 316-11 373-11C431-11 470 41 490 145C490 154 485 159 475 159C466 159 460 152 457 138C435 59 408 19 375 19C357 19 348 33 348 61C348 77 360 131 360 147C360 204 314 239 221 253C244 269 270 292 298 322C326 352 346 371 359 382C386 404 412 415 435 415C445 415 453 413 459 409C432 404 409 379 409 353Z"></path></g><g data-mml-node="mi" data-latex="Y" transform="translate(2726.7,0)"><path data-c="1D44C" d="M664 680C646 680 584 683 565 683C550 683 542 675 542 660C542 649 548 644 561 644C582 644 593 638 593 626C593 615 584 600 567 581L342 322L236 609C233 617 231 622 230 625C230 638 248 644 284 644C303 644 312 652 312 668C312 678 306 683 293 683L168 680C146 680 76 683 58 683C43 683 35 675 35 659C35 649 44 644 62 644C80 644 95 642 104 640C123 635 124 632 130 613L252 288C255 281 256 276 256 273L235 190C223 139 215 107 211 94C204 67 197 51 190 46C183 41 160 39 122 39C100 38 91 37 91 15C91 5 97 0 109 0L234 3L360 0C375-1 383 7 383 24C383 31 380 36 375 37C365 38 357 39 352 39C319 40 299 42 294 45C292 46 291 48 291 52C291 56 296 77 305 114L340 253C343 266 347 276 353 282L598 564L611 577C637 603 661 621 682 630C699 638 718 643 739 644C757 646 762 651 762 667C762 678 756 683 745 683C730 683 679 680 664 680Z"></path></g><g data-mml-node="mo" data-latex="," transform="translate(3488.7,0)"><path data-c="2C" d="M139 106C107 106 86 82 86 50C86 20 109-5 139-5C153-5 165-1 174 8L175 0C175-63 154-117 112-160C105-168 101-174 101-178C101-188 105-193 114-193C123-193 135-181 152-158C186-110 203-57 203 0C203 53 185 106 139 106Z"></path></g><g data-mml-node="mi" data-latex="k" transform="translate(3933.3,0)"><path data-c="1D458" d="M409 353C409 327 423 314 450 314C485 314 508 345 508 379C508 418 476 445 437 445C392 445 344 415 291 356C250 311 217 282 190 269L291 679C289 688 287 694 274 694C242 694 166 685 154 684C139 682 132 675 132 660C132 650 141 645 159 645C178 645 204 646 204 632L59 43C56 32 55 25 55 21C55 0 66-11 87-11C104-11 117-3 124 12C129 21 147 92 179 226C231 221 286 196 286 146C286 131 279 101 279 91C279 34 316-11 373-11C431-11 470 41 490 145C490 154 485 159 475 159C466 159 460 152 457 138C435 59 408 19 375 19C357 19 348 33 348 61C348 77 360 131 360 147C360 204 314 239 221 253C244 269 270 292 298 322C326 352 346 371 359 382C386 404 412 415 435 415C445 415 453 413 459 409C432 404 409 379 409 353Z"></path></g><g data-mml-node="mi" data-latex="W" transform="translate(4454.3,0)"><path data-c="1D44A" d="M956 680C937 680 872 683 853 683C838 683 830 675 830 660C830 650 836 645 848 644C885 643 903 632 903 610C903 604 899 594 891 579L629 125L594 602C590 638 614 644 659 644C680 644 690 652 690 668C690 678 684 683 671 683C649 683 572 680 550 680C531 680 465 683 446 683C431 683 423 675 423 659C423 649 432 644 451 644C482 644 498 637 499 623L505 548L261 125L225 613C222 638 264 644 296 644C313 644 321 652 321 668C321 678 315 683 303 683C281 683 203 680 181 680C162 680 96 683 77 683C62 683 55 675 55 660C55 649 65 644 84 644C126 644 130 642 132 612L177 7C178-12 185-22 197-22C210-20 215-17 223-2C224-1 224 0 224 1L509 494L545 7C546-12 553-22 565-22C575-22 584-15 592-1L918 562C945 611 964 639 1025 644C1043 646 1048 651 1048 668C1048 678 1043 683 1032 683C1018 683 970 680 956 680Z"></path></g><g data-mml-node="mo" data-latex=")" transform="translate(5502.3,0)"><path data-c="29" d="M78-245C138-199 188-131 229-40C268 47 288 129 288 208L288 292C288 371 268 453 229 540C188 631 138 699 78 745C75 747 72 748 71 748C62 748 57 743 57 734C57 730 59 726 62 723C114 683 156 617 187 526C214 447 228 369 228 292L228 208C228 131 214 53 187-26C156-117 114-183 62-223C59-227 57-231 57-234C57-243 62-248 71-248C72-248 75-247 78-245Z"></path></g></g></g></svg></mjx-container> 的点构成了一条穿过坐标原点的射线。选择 <mjx-container class="MathJax" jax="SVG" overflow="overflow"><svg style="vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="2.371ex" height="2.262ex" role="img" focusable="false" viewBox="0 -750 1048 1000"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="W=1"><g data-mml-node="mi" data-latex="W"><path data-c="1D44A" d="M956 680C937 680 872 683 853 683C838 683 830 675 830 660C830 650 836 645 848 644C885 643 903 632 903 610C903 604 899 594 891 579L629 125L594 602C590 638 614 644 659 644C680 644 690 652 690 668C690 678 684 683 671 683C649 683 572 680 550 680C531 680 465 683 446 683C431 683 423 675 423 659C423 649 432 644 451 644C482 644 498 637 499 623L505 548L261 125L225 613C222 638 264 644 296 644C313 644 321 652 321 668C321 678 315 683 303 683C281 683 203 680 181 680C162 680 96 683 77 683C62 683 55 675 55 660C55 649 65 644 84 644C126 644 130 642 132 612L177 7C178-12 185-22 197-22C210-20 215-17 223-2C224-1 224 0 224 1L509 494L545 7C546-12 553-22 565-22C575-22 584-15 592-1L918 562C945 611 964 639 1025 644C1043 646 1048 651 1048 668C1048 678 1043 683 1032 683C1018 683 970 680 956 680Z"></path></g></g></g></svg><mjx-break size="4"> </mjx-break><svg style="vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="3.52ex" height="2.262ex" role="img" focusable="false" viewBox="0 -750 1555.8 1000"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="W=1"><g data-mml-node="mo" data-latex="="><path data-c="3D" d="M698 367L80 367C64 367 56 359 56 344C56 329 64 321 80 321L698 321C714 321 722 329 722 344C722 356 711 367 698 367M698 179L80 179C64 179 56 171 56 156C56 141 64 133 80 133L698 133C714 133 722 141 722 156C722 169 711 179 698 179Z"></path></g><g data-mml-node="mn" data-latex="1" transform="translate(1055.8,0)"><path data-c="31" d="M269 666C228 624 168 603 89 603L89 564C141 564 184 572 217 588L217 82C217 64 213 52 204 47C195 42 170 39 130 39L95 39L95 0C120 2 174 3 257 3C340 3 394 2 419 0L419 39L384 39C343 39 318 42 310 47C302 52 297 64 297 82L297 636C297 660 295 666 269 666Z"></path></g></g></g></svg></mjx-container> 平面作为截面，就能得到普通二维坐标 <mjx-container class="MathJax" jax="SVG" overflow="overflow"><svg style="vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="13.42ex" height="2.262ex" role="img" focusable="false" viewBox="0 -750 5931.7 1000"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="(X/W,Y/W)"><g data-mml-node="mo" data-latex="("><path data-c="28" d="M318-248C327-248 332-243 332-234C332-231 330-227 327-223C275-183 233-117 202-26C175 53 161 131 161 208L161 292C161 369 175 447 202 526C233 617 275 683 327 723C330 726 332 730 332 734C332 743 327 748 318 748C317 748 314 747 311 745C251 699 201 631 160 540C121 453 101 371 101 292L101 208C101 129 121 47 160-40C201-131 251-199 311-245C314-247 317-248 318-248Z"></path></g><g data-mml-node="mi" data-latex="X" transform="translate(389,0)"><path data-c="1D44B" d="M834 683C817 683 758 680 741 680C721 680 651 683 631 683C616 683 608 675 608 659C608 650 613 645 624 644C648 641 660 633 660 618C660 609 654 598 642 585L486 417C457 485 429 552 400 620C401 622 402 624 405 626C414 636 431 642 455 644C471 646 479 654 479 667C479 678 473 683 460 683C436 683 359 680 335 680C314 680 245 683 224 683C209 683 202 675 202 659C202 649 211 644 229 644C274 644 288 644 300 615L416 342L208 119C205 116 201 112 196 109C155 66 108 42 53 39C36 38 27 29 27 14C30 5 31 0 44 0C61 0 120 3 137 3C158 3 227 0 248 0C263 0 270 8 270 24C270 33 265 38 254 39C230 41 218 50 218 65C218 75 227 89 244 107C306 173 369 239 430 306C464 225 499 145 532 63C531 61 530 59 527 56C518 47 502 42 478 39C463 37 455 29 455 16C455 5 461 0 474 0L599 3C620 3 690 0 708 0C723 0 731 8 731 23C731 33 724 38 709 39C678 39 658 40 651 44C644 48 636 60 628 80L501 383C569 455 620 509 653 546C677 571 693 588 702 595C739 626 780 642 825 644C846 645 851 650 851 669C848 678 847 683 834 683Z"></path></g><g data-mml-node="mo" data-latex="/" transform="translate(1240,0)"><path data-c="2F" d="M444 718C445 720 445 723 445 726C445 742 437 750 421 750C410 750 403 745 399 734L57-218C56-220 56-223 56-226C56-242 64-250 80-250C91-250 98-245 102-234Z"></path></g><g data-mml-node="mi" data-latex="W" transform="translate(1740,0)"><path data-c="1D44A" d="M956 680C937 680 872 683 853 683C838 683 830 675 830 660C830 650 836 645 848 644C885 643 903 632 903 610C903 604 899 594 891 579L629 125L594 602C590 638 614 644 659 644C680 644 690 652 690 668C690 678 684 683 671 683C649 683 572 680 550 680C531 680 465 683 446 683C431 683 423 675 423 659C423 649 432 644 451 644C482 644 498 637 499 623L505 548L261 125L225 613C222 638 264 644 296 644C313 644 321 652 321 668C321 678 315 683 303 683C281 683 203 680 181 680C162 680 96 683 77 683C62 683 55 675 55 660C55 649 65 644 84 644C126 644 130 642 132 612L177 7C178-12 185-22 197-22C210-20 215-17 223-2C224-1 224 0 224 1L509 494L545 7C546-12 553-22 565-22C575-22 584-15 592-1L918 562C945 611 964 639 1025 644C1043 646 1048 651 1048 668C1048 678 1043 683 1032 683C1018 683 970 680 956 680Z"></path></g><g data-mml-node="mo" data-latex="," transform="translate(2788,0)"><path data-c="2C" d="M139 106C107 106 86 82 86 50C86 20 109-5 139-5C153-5 165-1 174 8L175 0C175-63 154-117 112-160C105-168 101-174 101-178C101-188 105-193 114-193C123-193 135-181 152-158C186-110 203-57 203 0C203 53 185 106 139 106Z"></path></g><g data-mml-node="mi" data-latex="Y" transform="translate(3232.7,0)"><path data-c="1D44C" d="M664 680C646 680 584 683 565 683C550 683 542 675 542 660C542 649 548 644 561 644C582 644 593 638 593 626C593 615 584 600 567 581L342 322L236 609C233 617 231 622 230 625C230 638 248 644 284 644C303 644 312 652 312 668C312 678 306 683 293 683L168 680C146 680 76 683 58 683C43 683 35 675 35 659C35 649 44 644 62 644C80 644 95 642 104 640C123 635 124 632 130 613L252 288C255 281 256 276 256 273L235 190C223 139 215 107 211 94C204 67 197 51 190 46C183 41 160 39 122 39C100 38 91 37 91 15C91 5 97 0 109 0L234 3L360 0C375-1 383 7 383 24C383 31 380 36 375 37C365 38 357 39 352 39C319 40 299 42 294 45C292 46 291 48 291 52C291 56 296 77 305 114L340 253C343 266 347 276 353 282L598 564L611 577C637 603 661 621 682 630C699 638 718 643 739 644C757 646 762 651 762 667C762 678 756 683 745 683C730 683 679 680 664 680Z"></path></g><g data-mml-node="mo" data-latex="/" transform="translate(3994.7,0)"><path data-c="2F" d="M444 718C445 720 445 723 445 726C445 742 437 750 421 750C410 750 403 745 399 734L57-218C56-220 56-223 56-226C56-242 64-250 80-250C91-250 98-245 102-234Z"></path></g><g data-mml-node="mi" data-latex="W" transform="translate(4494.7,0)"><path data-c="1D44A" d="M956 680C937 680 872 683 853 683C838 683 830 675 830 660C830 650 836 645 848 644C885 643 903 632 903 610C903 604 899 594 891 579L629 125L594 602C590 638 614 644 659 644C680 644 690 652 690 668C690 678 684 683 671 683C649 683 572 680 550 680C531 680 465 683 446 683C431 683 423 675 423 659C423 649 432 644 451 644C482 644 498 637 499 623L505 548L261 125L225 613C222 638 264 644 296 644C313 644 321 652 321 668C321 678 315 683 303 683C281 683 203 680 181 680C162 680 96 683 77 683C62 683 55 675 55 660C55 649 65 644 84 644C126 644 130 642 132 612L177 7C178-12 185-22 197-22C210-20 215-17 223-2C224-1 224 0 224 1L509 494L545 7C546-12 553-22 565-22C575-22 584-15 592-1L918 562C945 611 964 639 1025 644C1043 646 1048 651 1048 668C1048 678 1043 683 1032 683C1018 683 970 680 956 680Z"></path></g><g data-mml-node="mo" data-latex=")" transform="translate(5542.7,0)"><path data-c="29" d="M78-245C138-199 188-131 229-40C268 47 288 129 288 208L288 292C288 371 268 453 229 540C188 631 138 699 78 745C75 747 72 748 71 748C62 748 57 743 57 734C57 730 59 726 62 723C114 683 156 617 187 526C214 447 228 369 228 292L228 208C228 131 214 53 187-26C156-117 114-183 62-223C59-227 57-231 57-234C57-243 62-248 71-248C72-248 75-247 78-245Z"></path></g></g></g></svg></mjx-container>。</li></ul></li><li><p>我们可以用三维空间中的透视投影来建立一种直觉上的类比，如图：</p></li></ul><img src="https://files.seeusercontent.com/2026/08/21/2csI/affine_projection.png" alt="affine_projection.png" width="500"><ul><li><p>我们假设摄像机中心位于坐标原点，观察方向为 <mjx-container class="MathJax" jax="SVG" overflow="overflow"><svg style="vertical-align: -0.188ex;" xmlns="http://www.w3.org/2000/svg" width="2.817ex" height="1.507ex" role="img" focusable="false" viewBox="0 -583 1245 666"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="-z"><g data-mml-node="mo" data-latex="-"><path data-c="2212" d="M698 270L80 270C64 270 56 263 56 250C56 237 64 230 80 230L698 230C714 230 722 237 722 250C722 262 710 270 698 270Z"></path></g><g data-mml-node="mi" data-latex="z" transform="translate(778,0)"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g></g></g></svg></mjx-container>，成像平面位于相机前方的某个固定深度，例如 <mjx-container class="MathJax" jax="SVG" overflow="overflow"><svg style="vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="1.057ex" height="2.262ex" role="img" focusable="false" viewBox="0 -750 467 1000"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="z=-d"><g data-mml-node="mi" data-latex="z"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g></g></g></svg><mjx-break size="4"> </mjx-break><svg style="vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="1.76ex" height="2.262ex" role="img" focusable="false" viewBox="0 -750 778 1000"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="z=-d"><g data-mml-node="mo" data-latex="="><path data-c="3D" d="M698 367L80 367C64 367 56 359 56 344C56 329 64 321 80 321L698 321C714 321 722 329 722 344C722 356 711 367 698 367M698 179L80 179C64 179 56 171 56 156C56 141 64 133 80 133L698 133C714 133 722 141 722 156C722 169 711 179 698 179Z"></path></g></g></g></svg><mjx-break size="4"> </mjx-break><svg style="vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="2.937ex" height="2.262ex" role="img" focusable="false" viewBox="0 -750 1298 1000"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="z=-d"><g data-mml-node="mo" data-latex="-"><path data-c="2212" d="M698 270L80 270C64 270 56 263 56 250C56 237 64 230 80 230L698 230C714 230 722 237 722 250C722 262 710 270 698 270Z"></path></g><g data-mml-node="mi" data-latex="d" transform="translate(778,0)"><path data-c="1D451" d="M429 632L370 389C349 426 320 445 281 445C216 445 159 412 109 345C63 283 40 218 40 151C40 63 91-11 175-11C218-11 260 12 300 59C311 21 345-11 392-11C461-11 483 71 498 145C498 154 493 159 483 159C474 159 468 152 465 138C445 59 421 19 394 19C377 19 368 33 368 60C368 75 370 91 374 107L516 679L516 683C513 690 507 694 499 694C476 694 434 690 374 683C363 682 357 674 357 660C357 650 366 645 384 645C403 645 429 646 429 632M341 376C351 355 356 341 356 332C355 328 354 323 353 316L304 122C301 111 294 99 285 87C248 42 212 19 177 19C138 19 118 49 118 108C118 132 124 168 136 216C157 301 187 359 224 390C244 407 263 415 282 415C309 415 329 402 341 376Z"></path></g></g></g></svg></mjx-container>，观察上图可以发现，对于一个处于 <mjx-container class="MathJax" jax="SVG" overflow="overflow"><svg style="vertical-align: -0.464ex;" xmlns="http://www.w3.org/2000/svg" width="2.403ex" height="1.464ex" role="img" focusable="false" viewBox="0 -442 1062 647"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="xy"><g data-mml-node="mi" data-latex="x"><path data-c="1D465" d="M527 373C527 419 482 442 432 442C389 442 355 419 329 373C308 419 273 442 222 442C173 442 133 419 101 374C74 335 60 306 60 287C60 278 65 273 75 273C84 273 90 278 92 287C111 345 153 413 220 413C253 413 269 392 269 351C269 330 251 252 216 118C199 51 169 18 126 18C112 18 99 21 88 26C114 36 127 54 127 80C127 106 114 119 87 119C54 119 29 91 29 58C29 12 76-11 125-11C167-11 201 12 228 58C247 12 283-11 335-11C383-11 423 12 455 57C482 96 496 125 496 144C496 153 491 158 481 158C472 158 467 153 464 144C447 87 402 18 337 18C304 18 287 38 287 79C287 92 292 120 303 165L337 300C356 375 387 413 431 413C445 413 458 410 469 405C442 396 429 378 429 351C429 325 443 312 470 312C502 312 527 341 527 373Z"></path></g><g data-mml-node="mi" data-latex="y" transform="translate(572,0)"><path data-c="1D466" d="M163 442C118 442 83 417 58 367C39 328 29 301 29 286C29 277 34 272 45 272C59 272 60 278 64 293C87 372 119 412 160 412C173 412 180 403 180 385C180 369 175 346 164 317C126 214 107 145 107 108C107 32 154-13 231-13C264-13 295-1 323 23C288-109 233-175 158-175C124-175 101-164 89-142C129-140 149-121 149-85C149-60 136-47 109-47C72-47 50-78 50-115C50-170 100-205 158-205C273-205 367-99 392-1L486 377C489 388 490 396 490 401C490 421 479 431 458 431C442 431 429 423 420 408C414 387 409 369 406 354L342 97C332 61 279 16 234 16C196 16 177 41 177 92C177 134 194 198 227 284C240 319 247 343 247 357C247 406 212 442 163 442Z"></path></g></g></g></svg></mjx-container> 平面坐标原点，面朝 <mjx-container class="MathJax" jax="SVG" overflow="overflow"><svg style="vertical-align: -0.188ex;" xmlns="http://www.w3.org/2000/svg" width="2.817ex" height="1.507ex" role="img" focusable="false" viewBox="0 -583 1245 666"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="-z"><g data-mml-node="mo" data-latex="-"><path data-c="2212" d="M698 270L80 270C64 270 56 263 56 250C56 237 64 230 80 230L698 230C714 230 722 237 722 250C722 262 710 270 698 270Z"></path></g><g data-mml-node="mi" data-latex="z" transform="translate(778,0)"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g></g></g></svg></mjx-container> 方向的观察者而言，<mjx-container class="MathJax" jax="SVG" overflow="overflow"><svg style="vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="6.388ex" height="2.262ex" role="img" focusable="false" viewBox="0 -750 2823.7 1000"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="P(a, b, -c)"><g data-mml-node="mi" data-latex="P"><path data-c="1D443" d="M555 683L235 683C212 683 201 682 201 660C201 649 212 644 234 644C254 644 294 647 294 631C294 629 293 623 290 613L158 82C152 60 142 47 128 42C121 40 103 39 72 39C50 39 40 37 40 16C40 5 46 0 59 0L184 3L248 2C259 2 299 0 312 0C328 0 336 8 336 24C336 34 325 39 304 39C264 39 244 43 244 52C244 52 245 55 247 68L307 312L472 312C537 312 599 332 657 371C722 414 754 467 754 530C754 629 660 683 555 683M524 644C611 644 654 614 654 554C654 498 626 423 597 397C559 363 509 346 447 346L313 346L379 610C387 644 387 644 429 644Z"></path></g><g data-mml-node="mo" data-latex="(" transform="translate(754,0)"><path data-c="28" d="M318-248C327-248 332-243 332-234C332-231 330-227 327-223C275-183 233-117 202-26C175 53 161 131 161 208L161 292C161 369 175 447 202 526C233 617 275 683 327 723C330 726 332 730 332 734C332 743 327 748 318 748C317 748 314 747 311 745C251 699 201 631 160 540C121 453 101 371 101 292L101 208C101 129 121 47 160-40C201-131 251-199 311-245C314-247 317-248 318-248Z"></path></g><g data-mml-node="mi" data-latex="a" transform="translate(1143,0)"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g><g data-mml-node="mo" data-latex="," transform="translate(1672,0)"><path data-c="2C" d="M139 106C107 106 86 82 86 50C86 20 109-5 139-5C153-5 165-1 174 8L175 0C175-63 154-117 112-160C105-168 101-174 101-178C101-188 105-193 114-193C123-193 135-181 152-158C186-110 203-57 203 0C203 53 185 106 139 106Z"></path></g><g data-mml-node="mi" data-latex="b" transform="translate(2116.7,0)"><path data-c="1D44F" d="M281 445C245 445 209 428 174 394L243 679C241 688 238 694 226 694C193 694 120 685 107 684C92 682 84 675 84 660C84 650 93 645 112 645C131 645 157 646 157 632C157 628 152 608 143 571L63 249C52 207 47 173 47 148C47 62 93-11 175-11C240-11 297 22 347 89C392 151 415 216 415 283C415 370 364 445 281 445M279 415C318 415 337 385 337 326C337 299 331 263 319 218C297 133 268 75 233 44C213 27 194 19 175 19C134 19 114 51 114 115C114 137 119 170 129 214L151 304C154 319 159 330 165 338C204 389 242 415 279 415Z"></path></g><g data-mml-node="mo" data-latex="," transform="translate(2545.7,0)"><path data-c="2C" d="M139 106C107 106 86 82 86 50C86 20 109-5 139-5C153-5 165-1 174 8L175 0C175-63 154-117 112-160C105-168 101-174 101-178C101-188 105-193 114-193C123-193 135-181 152-158C186-110 203-57 203 0C203 53 185 106 139 106Z"></path></g></g></g></svg><mjx-break size="2"> </mjx-break><svg style="vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="3.62ex" height="2.262ex" role="img" focusable="false" viewBox="0 -750 1600 1000"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="P(a, b, -c)"><g data-mml-node="mo" data-latex="-"><path data-c="2212" d="M698 270L80 270C64 270 56 263 56 250C56 237 64 230 80 230L698 230C714 230 722 237 722 250C722 262 710 270 698 270Z"></path></g><g data-mml-node="mi" data-latex="c" transform="translate(778,0)"><path data-c="1D450" d="M328 325C328 300 341 287 368 287C404 287 427 318 427 354C427 410 368 442 308 442C239 442 176 412 122 353C68 294 41 229 41 159C41 61 106-11 204-11C257-11 304 2 345 27C379 48 404 69 420 90C427 99 430 106 430 109C430 120 425 126 414 126C409 126 404 122 398 114C365 70 324 42 277 30C246 22 223 18 206 18C149 18 121 53 121 122C121 184 150 274 174 317C198 361 249 413 308 413C346 413 372 402 386 381C355 378 328 358 328 325Z"></path></g><g data-mml-node="mo" data-latex=")" transform="translate(1211,0)"><path data-c="29" d="M78-245C138-199 188-131 229-40C268 47 288 129 288 208L288 292C288 371 268 453 229 540C188 631 138 699 78 745C75 747 72 748 71 748C62 748 57 743 57 734C57 730 59 726 62 723C114 683 156 617 187 526C214 447 228 369 228 292L228 208C228 131 214 53 187-26C156-117 114-183 62-223C59-227 57-231 57-234C57-243 62-248 71-248C72-248 75-247 78-245Z"></path></g></g></g></svg></mjx-container> 与 <mjx-container class="MathJax" jax="SVG" overflow="overflow"><svg style="vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="9.616ex" height="2.265ex" role="img" focusable="false" viewBox="0 -751.2 4250.1 1001.2"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="P’(2a, 2b, -2c)"><g data-mml-node="msup"><g data-mml-node="mi" data-latex="P"><path data-c="1D443" d="M555 683L235 683C212 683 201 682 201 660C201 649 212 644 234 644C254 644 294 647 294 631C294 629 293 623 290 613L158 82C152 60 142 47 128 42C121 40 103 39 72 39C50 39 40 37 40 16C40 5 46 0 59 0L184 3L248 2C259 2 299 0 312 0C328 0 336 8 336 24C336 34 325 39 304 39C264 39 244 43 244 52C244 52 245 55 247 68L307 312L472 312C537 312 599 332 657 371C722 414 754 467 754 530C754 629 660 683 555 683M524 644C611 644 654 614 654 554C654 498 626 423 597 397C559 363 509 346 447 346L313 346L379 610C387 644 387 644 429 644Z"></path></g><g data-mml-node="mo" transform="translate(842.6,363) scale(0.707)" data-latex="’"><path data-c="2032" d="M284 549C259 549 242 539 233 518L65 96L110 96L332 463C337 472 340 482 340 493C340 523 314 549 284 549Z"></path></g></g><g data-mml-node="mo" data-latex="(" transform="translate(1180.4,0)"><path data-c="28" d="M318-248C327-248 332-243 332-234C332-231 330-227 327-223C275-183 233-117 202-26C175 53 161 131 161 208L161 292C161 369 175 447 202 526C233 617 275 683 327 723C330 726 332 730 332 734C332 743 327 748 318 748C317 748 314 747 311 745C251 699 201 631 160 540C121 453 101 371 101 292L101 208C101 129 121 47 160-40C201-131 251-199 311-245C314-247 317-248 318-248Z"></path></g><g data-mml-node="mn" data-latex="2" transform="translate(1569.4,0)"><path data-c="32" d="M237 666C186 666 143 648 106 612C69 576 50 534 50 483C50 449 75 424 106 424C136 424 161 450 161 480C161 513 137 536 105 536C102 536 100 536 98 535C117 584 161 627 224 627C306 627 352 556 352 470C352 403 318 331 250 255L62 43C49 28 50 29 50 0L421 0L450 180L417 180C409 129 402 100 396 91C391 86 361 84 306 84L139 84L236 179C304 243 390 312 419 365C439 400 449 435 449 470C449 588 357 666 237 666Z"></path></g><g data-mml-node="mi" data-latex="a" transform="translate(2069.4,0)"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g><g data-mml-node="mo" data-latex="," transform="translate(2598.4,0)"><path data-c="2C" d="M139 106C107 106 86 82 86 50C86 20 109-5 139-5C153-5 165-1 174 8L175 0C175-63 154-117 112-160C105-168 101-174 101-178C101-188 105-193 114-193C123-193 135-181 152-158C186-110 203-57 203 0C203 53 185 106 139 106Z"></path></g><g data-mml-node="mn" data-latex="2" transform="translate(3043.1,0)"><path data-c="32" d="M237 666C186 666 143 648 106 612C69 576 50 534 50 483C50 449 75 424 106 424C136 424 161 450 161 480C161 513 137 536 105 536C102 536 100 536 98 535C117 584 161 627 224 627C306 627 352 556 352 470C352 403 318 331 250 255L62 43C49 28 50 29 50 0L421 0L450 180L417 180C409 129 402 100 396 91C391 86 361 84 306 84L139 84L236 179C304 243 390 312 419 365C439 400 449 435 449 470C449 588 357 666 237 666Z"></path></g><g data-mml-node="mi" data-latex="b" transform="translate(3543.1,0)"><path data-c="1D44F" d="M281 445C245 445 209 428 174 394L243 679C241 688 238 694 226 694C193 694 120 685 107 684C92 682 84 675 84 660C84 650 93 645 112 645C131 645 157 646 157 632C157 628 152 608 143 571L63 249C52 207 47 173 47 148C47 62 93-11 175-11C240-11 297 22 347 89C392 151 415 216 415 283C415 370 364 445 281 445M279 415C318 415 337 385 337 326C337 299 331 263 319 218C297 133 268 75 233 44C213 27 194 19 175 19C134 19 114 51 114 115C114 137 119 170 129 214L151 304C154 319 159 330 165 338C204 389 242 415 279 415Z"></path></g><g data-mml-node="mo" data-latex="," transform="translate(3972.1,0)"><path data-c="2C" d="M139 106C107 106 86 82 86 50C86 20 109-5 139-5C153-5 165-1 174 8L175 0C175-63 154-117 112-160C105-168 101-174 101-178C101-188 105-193 114-193C123-193 135-181 152-158C186-110 203-57 203 0C203 53 185 106 139 106Z"></path></g></g></g></svg><mjx-break size="2"> </mjx-break><svg style="vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="4.751ex" height="2.262ex" role="img" focusable="false" viewBox="0 -750 2100 1000"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="P’(2a, 2b, -2c)"><g data-mml-node="mo" data-latex="-"><path data-c="2212" d="M698 270L80 270C64 270 56 263 56 250C56 237 64 230 80 230L698 230C714 230 722 237 722 250C722 262 710 270 698 270Z"></path></g><g data-mml-node="mn" data-latex="2" transform="translate(778,0)"><path data-c="32" d="M237 666C186 666 143 648 106 612C69 576 50 534 50 483C50 449 75 424 106 424C136 424 161 450 161 480C161 513 137 536 105 536C102 536 100 536 98 535C117 584 161 627 224 627C306 627 352 556 352 470C352 403 318 331 250 255L62 43C49 28 50 29 50 0L421 0L450 180L417 180C409 129 402 100 396 91C391 86 361 84 306 84L139 84L236 179C304 243 390 312 419 365C439 400 449 435 449 470C449 588 357 666 237 666Z"></path></g><g data-mml-node="mi" data-latex="c" transform="translate(1278,0)"><path data-c="1D450" d="M328 325C328 300 341 287 368 287C404 287 427 318 427 354C427 410 368 442 308 442C239 442 176 412 122 353C68 294 41 229 41 159C41 61 106-11 204-11C257-11 304 2 345 27C379 48 404 69 420 90C427 99 430 106 430 109C430 120 425 126 414 126C409 126 404 122 398 114C365 70 324 42 277 30C246 22 223 18 206 18C149 18 121 53 121 122C121 184 150 274 174 317C198 361 249 413 308 413C346 413 372 402 386 381C355 378 328 358 328 325Z"></path></g><g data-mml-node="mo" data-latex=")" transform="translate(1711,0)"><path data-c="29" d="M78-245C138-199 188-131 229-40C268 47 288 129 288 208L288 292C288 371 268 453 229 540C188 631 138 699 78 745C75 747 72 748 71 748C62 748 57 743 57 734C57 730 59 726 62 723C114 683 156 617 187 526C214 447 228 369 228 292L228 208C228 131 214 53 187-26C156-117 114-183 62-223C59-227 57-231 57-234C57-243 62-248 71-248C72-248 75-247 78-245Z"></path></g></g></g></svg></mjx-container> 这两个点在其视野中事实上是 <strong>重合</strong> 的，它们在针孔相机中会投影到同一个图像位置。</p></li><li><p>换言之，这两个点在相机视野里是等价的（投影到同一个二维图像位置），它们的大小比例只取决于距离相机的深度（近大远小）。</p></li><li><p>这就是为什么齐次坐标表示法被设计成如此，甚至于它的名字“齐次”本身就意味着“按同一比例变化”。其多出的一个维度不仅解决了平移变换的矩阵乘法表示，其比例不变性更是天然为透视投影与消除距离缩放而生的数学工具。</p></li></ul><hr><div class="callout callout--titled primary mb-4 rounded-small shadow-redefine-flat bg-(--callout-bg-color) p-3 pl-1 relative flex flex-row gap-2"><div role="none" class="rounded-full self-stretch w-0.5 bg-(--callout-primary-color) shrink-0 opacity-60"></div><div class="flex flex-col gap-2"><div class="callout__title flex items-center gap-2 font-semibold tracking-tight"><i class="callout__icon fa-solid leading-none text-(--callout-primary-color) text-sm shrink-0"></i> SomeThoughts</div><div class="callout__content markdown-body flex-1 min-w-0"><ul><li><p>或许这样巧妙契合视觉的性质会让人心生感慨，感叹数学的精妙乃至于相信造物主的存在。但事实上这仅仅只是一种“必然的巧合”，即设计好的巧合。究其原因就在于我们人类对于这个世界特定频段波（可见光）的感知方式：视觉，它决定了古代数学家在描述三维空间到二维平面的透视投影时，会创造出什么样的数学工具。</p></li><li><p>事实上，所谓计算机图形学（起码在光栅化渲染领域）也就是模拟人眼/摄像机对于三维世界所发出和反射的光的感知方式。我们“看”到的并不是几何本体，我们的双眼呈现给大脑的信息本身就已经是“投影”的结果。就好比所谓的“洞穴寓言”，我们所看到的一切都只是某种投影所衍生的幻象。</p></li><li><p>设想一下，如果我们可以通过某种神奇的“新型视觉”直接感知距离以及穿透物体，齐次坐标表示法“等比例缩放不变性”还会显得如此自然且必要吗？显然不会。对我们的“新型视觉”来说，<mjx-container class="MathJax" jax="SVG" overflow="overflow"><svg style="vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="6.388ex" height="2.262ex" role="img" focusable="false" viewBox="0 -750 2823.7 1000"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="P(a, b, -c)"><g data-mml-node="mi" data-latex="P"><path data-c="1D443" d="M555 683L235 683C212 683 201 682 201 660C201 649 212 644 234 644C254 644 294 647 294 631C294 629 293 623 290 613L158 82C152 60 142 47 128 42C121 40 103 39 72 39C50 39 40 37 40 16C40 5 46 0 59 0L184 3L248 2C259 2 299 0 312 0C328 0 336 8 336 24C336 34 325 39 304 39C264 39 244 43 244 52C244 52 245 55 247 68L307 312L472 312C537 312 599 332 657 371C722 414 754 467 754 530C754 629 660 683 555 683M524 644C611 644 654 614 654 554C654 498 626 423 597 397C559 363 509 346 447 346L313 346L379 610C387 644 387 644 429 644Z"></path></g><g data-mml-node="mo" data-latex="(" transform="translate(754,0)"><path data-c="28" d="M318-248C327-248 332-243 332-234C332-231 330-227 327-223C275-183 233-117 202-26C175 53 161 131 161 208L161 292C161 369 175 447 202 526C233 617 275 683 327 723C330 726 332 730 332 734C332 743 327 748 318 748C317 748 314 747 311 745C251 699 201 631 160 540C121 453 101 371 101 292L101 208C101 129 121 47 160-40C201-131 251-199 311-245C314-247 317-248 318-248Z"></path></g><g data-mml-node="mi" data-latex="a" transform="translate(1143,0)"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g><g data-mml-node="mo" data-latex="," transform="translate(1672,0)"><path data-c="2C" d="M139 106C107 106 86 82 86 50C86 20 109-5 139-5C153-5 165-1 174 8L175 0C175-63 154-117 112-160C105-168 101-174 101-178C101-188 105-193 114-193C123-193 135-181 152-158C186-110 203-57 203 0C203 53 185 106 139 106Z"></path></g><g data-mml-node="mi" data-latex="b" transform="translate(2116.7,0)"><path data-c="1D44F" d="M281 445C245 445 209 428 174 394L243 679C241 688 238 694 226 694C193 694 120 685 107 684C92 682 84 675 84 660C84 650 93 645 112 645C131 645 157 646 157 632C157 628 152 608 143 571L63 249C52 207 47 173 47 148C47 62 93-11 175-11C240-11 297 22 347 89C392 151 415 216 415 283C415 370 364 445 281 445M279 415C318 415 337 385 337 326C337 299 331 263 319 218C297 133 268 75 233 44C213 27 194 19 175 19C134 19 114 51 114 115C114 137 119 170 129 214L151 304C154 319 159 330 165 338C204 389 242 415 279 415Z"></path></g><g data-mml-node="mo" data-latex="," transform="translate(2545.7,0)"><path data-c="2C" d="M139 106C107 106 86 82 86 50C86 20 109-5 139-5C153-5 165-1 174 8L175 0C175-63 154-117 112-160C105-168 101-174 101-178C101-188 105-193 114-193C123-193 135-181 152-158C186-110 203-57 203 0C203 53 185 106 139 106Z"></path></g></g></g></svg><mjx-break size="2"> </mjx-break><svg style="vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="3.62ex" height="2.262ex" role="img" focusable="false" viewBox="0 -750 1600 1000"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="P(a, b, -c)"><g data-mml-node="mo" data-latex="-"><path data-c="2212" d="M698 270L80 270C64 270 56 263 56 250C56 237 64 230 80 230L698 230C714 230 722 237 722 250C722 262 710 270 698 270Z"></path></g><g data-mml-node="mi" data-latex="c" transform="translate(778,0)"><path data-c="1D450" d="M328 325C328 300 341 287 368 287C404 287 427 318 427 354C427 410 368 442 308 442C239 442 176 412 122 353C68 294 41 229 41 159C41 61 106-11 204-11C257-11 304 2 345 27C379 48 404 69 420 90C427 99 430 106 430 109C430 120 425 126 414 126C409 126 404 122 398 114C365 70 324 42 277 30C246 22 223 18 206 18C149 18 121 53 121 122C121 184 150 274 174 317C198 361 249 413 308 413C346 413 372 402 386 381C355 378 328 358 328 325Z"></path></g><g data-mml-node="mo" data-latex=")" transform="translate(1211,0)"><path data-c="29" d="M78-245C138-199 188-131 229-40C268 47 288 129 288 208L288 292C288 371 268 453 229 540C188 631 138 699 78 745C75 747 72 748 71 748C62 748 57 743 57 734C57 730 59 726 62 723C114 683 156 617 187 526C214 447 228 369 228 292L228 208C228 131 214 53 187-26C156-117 114-183 62-223C59-227 57-231 57-234C57-243 62-248 71-248C72-248 75-247 78-245Z"></path></g></g></g></svg></mjx-container> 和 <mjx-container class="MathJax" jax="SVG" overflow="overflow"><svg style="vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="9.616ex" height="2.265ex" role="img" focusable="false" viewBox="0 -751.2 4250.1 1001.2"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="P’(2a, 2b, -2c)"><g data-mml-node="msup"><g data-mml-node="mi" data-latex="P"><path data-c="1D443" d="M555 683L235 683C212 683 201 682 201 660C201 649 212 644 234 644C254 644 294 647 294 631C294 629 293 623 290 613L158 82C152 60 142 47 128 42C121 40 103 39 72 39C50 39 40 37 40 16C40 5 46 0 59 0L184 3L248 2C259 2 299 0 312 0C328 0 336 8 336 24C336 34 325 39 304 39C264 39 244 43 244 52C244 52 245 55 247 68L307 312L472 312C537 312 599 332 657 371C722 414 754 467 754 530C754 629 660 683 555 683M524 644C611 644 654 614 654 554C654 498 626 423 597 397C559 363 509 346 447 346L313 346L379 610C387 644 387 644 429 644Z"></path></g><g data-mml-node="mo" transform="translate(842.6,363) scale(0.707)" data-latex="’"><path data-c="2032" d="M284 549C259 549 242 539 233 518L65 96L110 96L332 463C337 472 340 482 340 493C340 523 314 549 284 549Z"></path></g></g><g data-mml-node="mo" data-latex="(" transform="translate(1180.4,0)"><path data-c="28" d="M318-248C327-248 332-243 332-234C332-231 330-227 327-223C275-183 233-117 202-26C175 53 161 131 161 208L161 292C161 369 175 447 202 526C233 617 275 683 327 723C330 726 332 730 332 734C332 743 327 748 318 748C317 748 314 747 311 745C251 699 201 631 160 540C121 453 101 371 101 292L101 208C101 129 121 47 160-40C201-131 251-199 311-245C314-247 317-248 318-248Z"></path></g><g data-mml-node="mn" data-latex="2" transform="translate(1569.4,0)"><path data-c="32" d="M237 666C186 666 143 648 106 612C69 576 50 534 50 483C50 449 75 424 106 424C136 424 161 450 161 480C161 513 137 536 105 536C102 536 100 536 98 535C117 584 161 627 224 627C306 627 352 556 352 470C352 403 318 331 250 255L62 43C49 28 50 29 50 0L421 0L450 180L417 180C409 129 402 100 396 91C391 86 361 84 306 84L139 84L236 179C304 243 390 312 419 365C439 400 449 435 449 470C449 588 357 666 237 666Z"></path></g><g data-mml-node="mi" data-latex="a" transform="translate(2069.4,0)"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g><g data-mml-node="mo" data-latex="," transform="translate(2598.4,0)"><path data-c="2C" d="M139 106C107 106 86 82 86 50C86 20 109-5 139-5C153-5 165-1 174 8L175 0C175-63 154-117 112-160C105-168 101-174 101-178C101-188 105-193 114-193C123-193 135-181 152-158C186-110 203-57 203 0C203 53 185 106 139 106Z"></path></g><g data-mml-node="mn" data-latex="2" transform="translate(3043.1,0)"><path data-c="32" d="M237 666C186 666 143 648 106 612C69 576 50 534 50 483C50 449 75 424 106 424C136 424 161 450 161 480C161 513 137 536 105 536C102 536 100 536 98 535C117 584 161 627 224 627C306 627 352 556 352 470C352 403 318 331 250 255L62 43C49 28 50 29 50 0L421 0L450 180L417 180C409 129 402 100 396 91C391 86 361 84 306 84L139 84L236 179C304 243 390 312 419 365C439 400 449 435 449 470C449 588 357 666 237 666Z"></path></g><g data-mml-node="mi" data-latex="b" transform="translate(3543.1,0)"><path data-c="1D44F" d="M281 445C245 445 209 428 174 394L243 679C241 688 238 694 226 694C193 694 120 685 107 684C92 682 84 675 84 660C84 650 93 645 112 645C131 645 157 646 157 632C157 628 152 608 143 571L63 249C52 207 47 173 47 148C47 62 93-11 175-11C240-11 297 22 347 89C392 151 415 216 415 283C415 370 364 445 281 445M279 415C318 415 337 385 337 326C337 299 331 263 319 218C297 133 268 75 233 44C213 27 194 19 175 19C134 19 114 51 114 115C114 137 119 170 129 214L151 304C154 319 159 330 165 338C204 389 242 415 279 415Z"></path></g><g data-mml-node="mo" data-latex="," transform="translate(3972.1,0)"><path data-c="2C" d="M139 106C107 106 86 82 86 50C86 20 109-5 139-5C153-5 165-1 174 8L175 0C175-63 154-117 112-160C105-168 101-174 101-178C101-188 105-193 114-193C123-193 135-181 152-158C186-110 203-57 203 0C203 53 185 106 139 106Z"></path></g></g></g></svg><mjx-break size="2"> </mjx-break><svg style="vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="4.751ex" height="2.262ex" role="img" focusable="false" viewBox="0 -750 2100 1000"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="P’(2a, 2b, -2c)"><g data-mml-node="mo" data-latex="-"><path data-c="2212" d="M698 270L80 270C64 270 56 263 56 250C56 237 64 230 80 230L698 230C714 230 722 237 722 250C722 262 710 270 698 270Z"></path></g><g data-mml-node="mn" data-latex="2" transform="translate(778,0)"><path data-c="32" d="M237 666C186 666 143 648 106 612C69 576 50 534 50 483C50 449 75 424 106 424C136 424 161 450 161 480C161 513 137 536 105 536C102 536 100 536 98 535C117 584 161 627 224 627C306 627 352 556 352 470C352 403 318 331 250 255L62 43C49 28 50 29 50 0L421 0L450 180L417 180C409 129 402 100 396 91C391 86 361 84 306 84L139 84L236 179C304 243 390 312 419 365C439 400 449 435 449 470C449 588 357 666 237 666Z"></path></g><g data-mml-node="mi" data-latex="c" transform="translate(1278,0)"><path data-c="1D450" d="M328 325C328 300 341 287 368 287C404 287 427 318 427 354C427 410 368 442 308 442C239 442 176 412 122 353C68 294 41 229 41 159C41 61 106-11 204-11C257-11 304 2 345 27C379 48 404 69 420 90C427 99 430 106 430 109C430 120 425 126 414 126C409 126 404 122 398 114C365 70 324 42 277 30C246 22 223 18 206 18C149 18 121 53 121 122C121 184 150 274 174 317C198 361 249 413 308 413C346 413 372 402 386 381C355 378 328 358 328 325Z"></path></g><g data-mml-node="mo" data-latex=")" transform="translate(1711,0)"><path data-c="29" d="M78-245C138-199 188-131 229-40C268 47 288 129 288 208L288 292C288 371 268 453 229 540C188 631 138 699 78 745C75 747 72 748 71 748C62 748 57 743 57 734C57 730 59 726 62 723C114 683 156 617 187 526C214 447 228 369 228 292L228 208C228 131 214 53 187-26C156-117 114-183 62-223C59-227 57-231 57-234C57-243 62-248 71-248C72-248 75-247 78-245Z"></path></g></g></g></svg></mjx-container> 将不会被视作“重合/等价”——就如同他们的坐标看上去的那样，它们就是真实三维空间中两个距离迥异的点。齐次坐标表示法的等比例缩放不变性对这种“新视觉”可以说是毫无作用。</p></li><li><p>简而言之，高一维度的齐次坐标所具备的等比例缩放不变性，本质上是因为我们的视觉天然压缩了距离。因此是人类主动选择为齐次坐标增添“等比例缩放不变的性质”以表示投影平面的点坐标，而不是反过来。</p></li></ul></div></div></div><h2 id="三维空间中的仿射变换矩阵"><a href="#三维空间中的仿射变换矩阵" class="headerlink" title="三维空间中的仿射变换矩阵"></a>三维空间中的仿射变换矩阵</h2><ul><li><p>旋转：</p><ul><li><p>绕 X 轴：</p><p>  <mjx-container class="MathJax" jax="SVG" overflow="overflow" display="true"><svg style="vertical-align: -5.317ex;" xmlns="http://www.w3.org/2000/svg" width="23.828ex" height="11.765ex" role="img" focusable="false" viewBox="0 -2850 10532 5200"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="  \begin{pmatrix}  1 &amp; 0 &amp; 0 &amp; 0 \\  0 &amp; \cos{\theta} &amp; -\sin{\theta} &amp; 0 \\  0 &amp; \sin{\theta} &amp; \cos{\theta} &amp; 0 \\  0 &amp; 0 &amp; 0 &amp; 1  \end{pmatrix}  "><g data-mml-node="mrow" data-latex="\begin{pmatrix}  1 &amp; 0 &amp; 0 &amp; 0 \\  0 &amp; \cos{\theta} &amp; -\sin{\theta} &amp; 0 \\  0 &amp; \sin{\theta} &amp; \cos{\theta} &amp; 0 \\  0 &amp; 0 &amp; 0 &amp; 1  \end{pmatrix}"><g data-mml-node="mo"><path data-c="239B" d="M813 1450C820 1455 823 1462 823 1470C823 1487 815 1495 798 1495C793 1495 788 1493 784 1490C697 1423 614 1324 536 1192C399 956 277 603 277 253L277 0L385 0L385 253C385 407 403 562 438 719C500 999 630 1313 813 1450Z" transform="translate(0,1355)"></path><path data-c="239D" d="M798 0C815 0 823 8 823 25C823 34 819 40 812 44C731 106 658 202 592 334C474 569 385 903 385 1242L385 1495L277 1495L277 1242C277 914 388 575 512 345C594 193 685 80 784 5C788 2 793 0 798 0Z" transform="translate(0,-2350)"></path><svg width="875" height="2350" y="-925" x="0" viewBox="0 587.5 875 2350"><path data-c="239C" d="M277 0L385 0L385 498L277 498Z" transform="scale(1,7.078)"></path></svg></g><g data-mml-node="mtable" transform="translate(875,0)"><g data-mml-node="mtr" transform="translate(0,2100)"><g data-mml-node="mtd"><g data-mml-node="mn" data-latex="1"><path data-c="31" d="M269 666C228 624 168 603 89 603L89 564C141 564 184 572 217 588L217 82C217 64 213 52 204 47C195 42 170 39 130 39L95 39L95 0C120 2 174 3 257 3C340 3 394 2 419 0L419 39L384 39C343 39 318 42 310 47C302 52 297 64 297 82L297 636C297 660 295 666 269 666Z"></path></g></g><g data-mml-node="mtd" transform="translate(2236.8,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(5627.8,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(8282,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g></g><g data-mml-node="mtr" transform="translate(0,700)"><g data-mml-node="mtd"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(1500,0)"><g data-mml-node="mi" data-latex="\cos"><path data-c="63" d="M251 416C293 416 325 406 347 386C323 383 306 361 306 338C306 305 322 289 355 289C388 289 404 306 404 339C404 410 327 448 250 448C188 448 137 426 96 380C55 334 34 279 34 216C34 155 55 101 96 56C137 11 187-11 248-11C298-11 337 3 365 32C388 55 403 78 411 102C414 111 415 117 415 121C415 130 409 134 398 134C390 134 385 130 382 122C361 55 320 21 257 21C228 21 200 34 172 61C139 92 123 144 123 218C123 318 161 416 251 416Z"></path><path data-c="6F" d="M249-11C311-11 363 11 406 55C449 99 471 152 471 214C471 277 450 332 408 378C366 424 313 448 250 448C187 448 135 424 92 378C49 332 28 277 28 214C28 152 49 99 92 55C135 11 188-11 249-11M250 21C202 21 166 42 141 85C125 113 117 159 117 222C117 283 125 327 140 355C164 398 200 419 249 419C296 419 332 398 357 357C374 329 382 284 382 222C382 106 348 21 250 21Z" transform="translate(444,0)"></path><path data-c="73" d="M360 130C360 206 308 254 205 274C158 283 128 294 112 305C96 316 88 332 88 351C88 398 123 421 193 421C261 421 298 383 303 306C304 298 309 294 319 294C330 294 336 303 336 321L336 420C336 439 331 448 321 448C310 448 295 430 285 422C260 439 229 448 193 448C104 448 33 408 33 323C33 289 47 260 76 237C111 208 144 202 207 191C272 178 305 149 305 104C305 47 270 18 199 18C130 18 86 64 67 155C64 168 59 175 50 175C39 175 33 165 33 146L33 17C33-2 38-11 48-11C51-11 56-8 64-1C82 15 74 12 92 30C121 3 157-11 199-11C294-11 360 38 360 130Z" transform="translate(944,0)"></path></g><g data-mml-node="mo" transform="translate(1338,0)"><path data-c="2061" d=""></path></g><g data-mml-node="TeXAtom" data-latex="{\theta}" data-mjx-texclass="ORD" transform="translate(1504.7,0)"><g data-mml-node="mi" data-latex="\theta"><path data-c="1D703" d="M164-11C209-11 256 16 302 70C382 163 455 335 455 498C455 539 448 582 434 625C416 678 382 705 333 705C288 705 243 678 196 624C116 532 42 360 42 196C42 94 75-11 164-11M332 675C365 675 382 637 382 560C382 517 372 452 352 367L155 367C180 460 204 529 229 574C266 641 301 675 332 675M145 327L341 327C322 246 299 181 274 132C235 57 199 19 164 19C131 19 115 58 115 135C115 185 125 249 145 327Z"></path></g></g></g><g data-mml-node="mtd" transform="translate(4473.7,0)"><g data-mml-node="mo" data-latex="-"><path data-c="2212" d="M698 270L80 270C64 270 56 263 56 250C56 237 64 230 80 230L698 230C714 230 722 237 722 250C722 262 710 270 698 270Z"></path></g><g data-mml-node="mi" data-latex="\sin" transform="translate(944.7,0)"><path data-c="73" d="M360 130C360 206 308 254 205 274C158 283 128 294 112 305C96 316 88 332 88 351C88 398 123 421 193 421C261 421 298 383 303 306C304 298 309 294 319 294C330 294 336 303 336 321L336 420C336 439 331 448 321 448C310 448 295 430 285 422C260 439 229 448 193 448C104 448 33 408 33 323C33 289 47 260 76 237C111 208 144 202 207 191C272 178 305 149 305 104C305 47 270 18 199 18C130 18 86 64 67 155C64 168 59 175 50 175C39 175 33 165 33 146L33 17C33-2 38-11 48-11C51-11 56-8 64-1C82 15 74 12 92 30C121 3 157-11 199-11C294-11 360 38 360 130Z"></path><path data-c="69" d="M194 601C194 631 169 657 139 657C109 657 83 631 83 601C83 571 108 544 138 544C169 544 194 570 194 601M143 3L247 0L247 39C214 39 194 41 188 45C182 49 180 60 180 78L180 445L37 433L37 395C70 395 91 392 98 387C105 382 108 368 108 345L108 79C108 60 105 48 98 44C91 40 69 39 33 39L33 0Z" transform="translate(394,0)"></path><path data-c="6E" d="M314 413C359 413 382 378 382 307L382 79C382 60 379 48 372 44C365 40 343 38 306 38L306 0L421 3L535 0L535 38C503 38 482 39 472 42C462 45 458 52 458 64L458 251C458 298 457 331 454 350C444 411 399 442 320 442C257 442 210 412 179 352L179 442L32 431L32 393C68 393 90 390 98 384C106 378 109 365 109 342L109 79C109 60 105 48 98 44C91 40 69 38 32 38L32 0L147 3L261 0L261 38C224 38 203 40 196 44C189 48 185 60 185 79L185 259C185 340 236 413 314 413Z" transform="translate(672,0)"></path></g><g data-mml-node="mo" transform="translate(2172.7,0)"><path data-c="2061" d=""></path></g><g data-mml-node="TeXAtom" data-latex="{\theta}" data-mjx-texclass="ORD" transform="translate(2339.3,0)"><g data-mml-node="mi" data-latex="\theta"><path data-c="1D703" d="M164-11C209-11 256 16 302 70C382 163 455 335 455 498C455 539 448 582 434 625C416 678 382 705 333 705C288 705 243 678 196 624C116 532 42 360 42 196C42 94 75-11 164-11M332 675C365 675 382 637 382 560C382 517 372 452 352 367L155 367C180 460 204 529 229 574C266 641 301 675 332 675M145 327L341 327C322 246 299 181 274 132C235 57 199 19 164 19C131 19 115 58 115 135C115 185 125 249 145 327Z"></path></g></g></g><g data-mml-node="mtd" transform="translate(8282,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g></g><g data-mml-node="mtr" transform="translate(0,-700)"><g data-mml-node="mtd"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(1555,0)"><g data-mml-node="mi" data-latex="\sin"><path data-c="73" d="M360 130C360 206 308 254 205 274C158 283 128 294 112 305C96 316 88 332 88 351C88 398 123 421 193 421C261 421 298 383 303 306C304 298 309 294 319 294C330 294 336 303 336 321L336 420C336 439 331 448 321 448C310 448 295 430 285 422C260 439 229 448 193 448C104 448 33 408 33 323C33 289 47 260 76 237C111 208 144 202 207 191C272 178 305 149 305 104C305 47 270 18 199 18C130 18 86 64 67 155C64 168 59 175 50 175C39 175 33 165 33 146L33 17C33-2 38-11 48-11C51-11 56-8 64-1C82 15 74 12 92 30C121 3 157-11 199-11C294-11 360 38 360 130Z"></path><path data-c="69" d="M194 601C194 631 169 657 139 657C109 657 83 631 83 601C83 571 108 544 138 544C169 544 194 570 194 601M143 3L247 0L247 39C214 39 194 41 188 45C182 49 180 60 180 78L180 445L37 433L37 395C70 395 91 392 98 387C105 382 108 368 108 345L108 79C108 60 105 48 98 44C91 40 69 39 33 39L33 0Z" transform="translate(394,0)"></path><path data-c="6E" d="M314 413C359 413 382 378 382 307L382 79C382 60 379 48 372 44C365 40 343 38 306 38L306 0L421 3L535 0L535 38C503 38 482 39 472 42C462 45 458 52 458 64L458 251C458 298 457 331 454 350C444 411 399 442 320 442C257 442 210 412 179 352L179 442L32 431L32 393C68 393 90 390 98 384C106 378 109 365 109 342L109 79C109 60 105 48 98 44C91 40 69 38 32 38L32 0L147 3L261 0L261 38C224 38 203 40 196 44C189 48 185 60 185 79L185 259C185 340 236 413 314 413Z" transform="translate(672,0)"></path></g><g data-mml-node="mo" transform="translate(1228,0)"><path data-c="2061" d=""></path></g><g data-mml-node="TeXAtom" data-latex="{\theta}" data-mjx-texclass="ORD" transform="translate(1394.7,0)"><g data-mml-node="mi" data-latex="\theta"><path data-c="1D703" d="M164-11C209-11 256 16 302 70C382 163 455 335 455 498C455 539 448 582 434 625C416 678 382 705 333 705C288 705 243 678 196 624C116 532 42 360 42 196C42 94 75-11 164-11M332 675C365 675 382 637 382 560C382 517 372 452 352 367L155 367C180 460 204 529 229 574C266 641 301 675 332 675M145 327L341 327C322 246 299 181 274 132C235 57 199 19 164 19C131 19 115 58 115 135C115 185 125 249 145 327Z"></path></g></g></g><g data-mml-node="mtd" transform="translate(4891,0)"><g data-mml-node="mi" data-latex="\cos"><path data-c="63" d="M251 416C293 416 325 406 347 386C323 383 306 361 306 338C306 305 322 289 355 289C388 289 404 306 404 339C404 410 327 448 250 448C188 448 137 426 96 380C55 334 34 279 34 216C34 155 55 101 96 56C137 11 187-11 248-11C298-11 337 3 365 32C388 55 403 78 411 102C414 111 415 117 415 121C415 130 409 134 398 134C390 134 385 130 382 122C361 55 320 21 257 21C228 21 200 34 172 61C139 92 123 144 123 218C123 318 161 416 251 416Z"></path><path data-c="6F" d="M249-11C311-11 363 11 406 55C449 99 471 152 471 214C471 277 450 332 408 378C366 424 313 448 250 448C187 448 135 424 92 378C49 332 28 277 28 214C28 152 49 99 92 55C135 11 188-11 249-11M250 21C202 21 166 42 141 85C125 113 117 159 117 222C117 283 125 327 140 355C164 398 200 419 249 419C296 419 332 398 357 357C374 329 382 284 382 222C382 106 348 21 250 21Z" transform="translate(444,0)"></path><path data-c="73" d="M360 130C360 206 308 254 205 274C158 283 128 294 112 305C96 316 88 332 88 351C88 398 123 421 193 421C261 421 298 383 303 306C304 298 309 294 319 294C330 294 336 303 336 321L336 420C336 439 331 448 321 448C310 448 295 430 285 422C260 439 229 448 193 448C104 448 33 408 33 323C33 289 47 260 76 237C111 208 144 202 207 191C272 178 305 149 305 104C305 47 270 18 199 18C130 18 86 64 67 155C64 168 59 175 50 175C39 175 33 165 33 146L33 17C33-2 38-11 48-11C51-11 56-8 64-1C82 15 74 12 92 30C121 3 157-11 199-11C294-11 360 38 360 130Z" transform="translate(944,0)"></path></g><g data-mml-node="mo" transform="translate(1338,0)"><path data-c="2061" d=""></path></g><g data-mml-node="TeXAtom" data-latex="{\theta}" data-mjx-texclass="ORD" transform="translate(1504.7,0)"><g data-mml-node="mi" data-latex="\theta"><path data-c="1D703" d="M164-11C209-11 256 16 302 70C382 163 455 335 455 498C455 539 448 582 434 625C416 678 382 705 333 705C288 705 243 678 196 624C116 532 42 360 42 196C42 94 75-11 164-11M332 675C365 675 382 637 382 560C382 517 372 452 352 367L155 367C180 460 204 529 229 574C266 641 301 675 332 675M145 327L341 327C322 246 299 181 274 132C235 57 199 19 164 19C131 19 115 58 115 135C115 185 125 249 145 327Z"></path></g></g></g><g data-mml-node="mtd" transform="translate(8282,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g></g><g data-mml-node="mtr" transform="translate(0,-2100)"><g data-mml-node="mtd"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(2236.8,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(5627.8,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(8282,0)"><g data-mml-node="mn" data-latex="1"><path data-c="31" d="M269 666C228 624 168 603 89 603L89 564C141 564 184 572 217 588L217 82C217 64 213 52 204 47C195 42 170 39 130 39L95 39L95 0C120 2 174 3 257 3C340 3 394 2 419 0L419 39L384 39C343 39 318 42 310 47C302 52 297 64 297 82L297 636C297 660 295 666 269 666Z"></path></g></g></g></g><g data-mml-node="mo" transform="translate(9657,0)"><path data-c="239E" d="M490 0L598 0L598 253C598 581 487 920 363 1150C281 1301 190 1415 91 1490C87 1493 82 1495 77 1495C60 1495 52 1487 52 1470C52 1462 55 1455 62 1450C143 1389 216 1292 283 1160C402 924 490 593 490 253Z" transform="translate(0,1355)"></path><path data-c="23A0" d="M598 1242L598 1495L490 1495L490 1242C490 1088 472 933 437 776C375 494 246 184 63 44C56 40 52 34 52 25C52 8 60 0 77 0C82 0 87 2 91 5C178 71 261 170 339 303C477 539 598 892 598 1242Z" transform="translate(0,-2350)"></path><svg width="875" height="2350" y="-925" x="0" viewBox="0 587.5 875 2350"><path data-c="239F" d="M490 0L598 0L598 498L490 498Z" transform="scale(1,7.078)"></path></svg></g></g></g></g></svg></mjx-container></p></li><li><p>绕 Y 轴：</p><p>  <mjx-container class="MathJax" jax="SVG" overflow="overflow" display="true"><svg style="vertical-align: -5.317ex;" xmlns="http://www.w3.org/2000/svg" width="23.828ex" height="11.765ex" role="img" focusable="false" viewBox="0 -2850 10532 5200"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="  \begin{pmatrix}  \cos{\theta} &amp; 0 &amp; \sin{\theta} &amp; 0 \\  0 &amp; 1 &amp; 0 &amp; 0 \\  -\sin{\theta} &amp; 0 &amp; \cos{\theta} &amp; 0 \\  0 &amp; 0 &amp; 0 &amp; 1  \end{pmatrix}  "><g data-mml-node="mrow" data-latex="\begin{pmatrix}  \cos{\theta} &amp; 0 &amp; \sin{\theta} &amp; 0 \\  0 &amp; 1 &amp; 0 &amp; 0 \\  -\sin{\theta} &amp; 0 &amp; \cos{\theta} &amp; 0 \\  0 &amp; 0 &amp; 0 &amp; 1  \end{pmatrix}"><g data-mml-node="mo"><path data-c="239B" d="M813 1450C820 1455 823 1462 823 1470C823 1487 815 1495 798 1495C793 1495 788 1493 784 1490C697 1423 614 1324 536 1192C399 956 277 603 277 253L277 0L385 0L385 253C385 407 403 562 438 719C500 999 630 1313 813 1450Z" transform="translate(0,1355)"></path><path data-c="239D" d="M798 0C815 0 823 8 823 25C823 34 819 40 812 44C731 106 658 202 592 334C474 569 385 903 385 1242L385 1495L277 1495L277 1242C277 914 388 575 512 345C594 193 685 80 784 5C788 2 793 0 798 0Z" transform="translate(0,-2350)"></path><svg width="875" height="2350" y="-925" x="0" viewBox="0 587.5 875 2350"><path data-c="239C" d="M277 0L385 0L385 498L277 498Z" transform="scale(1,7.078)"></path></svg></g><g data-mml-node="mtable" transform="translate(875,0)"><g data-mml-node="mtr" transform="translate(0,2100)"><g data-mml-node="mtd" transform="translate(417.3,0)"><g data-mml-node="mi" data-latex="\cos"><path data-c="63" d="M251 416C293 416 325 406 347 386C323 383 306 361 306 338C306 305 322 289 355 289C388 289 404 306 404 339C404 410 327 448 250 448C188 448 137 426 96 380C55 334 34 279 34 216C34 155 55 101 96 56C137 11 187-11 248-11C298-11 337 3 365 32C388 55 403 78 411 102C414 111 415 117 415 121C415 130 409 134 398 134C390 134 385 130 382 122C361 55 320 21 257 21C228 21 200 34 172 61C139 92 123 144 123 218C123 318 161 416 251 416Z"></path><path data-c="6F" d="M249-11C311-11 363 11 406 55C449 99 471 152 471 214C471 277 450 332 408 378C366 424 313 448 250 448C187 448 135 424 92 378C49 332 28 277 28 214C28 152 49 99 92 55C135 11 188-11 249-11M250 21C202 21 166 42 141 85C125 113 117 159 117 222C117 283 125 327 140 355C164 398 200 419 249 419C296 419 332 398 357 357C374 329 382 284 382 222C382 106 348 21 250 21Z" transform="translate(444,0)"></path><path data-c="73" d="M360 130C360 206 308 254 205 274C158 283 128 294 112 305C96 316 88 332 88 351C88 398 123 421 193 421C261 421 298 383 303 306C304 298 309 294 319 294C330 294 336 303 336 321L336 420C336 439 331 448 321 448C310 448 295 430 285 422C260 439 229 448 193 448C104 448 33 408 33 323C33 289 47 260 76 237C111 208 144 202 207 191C272 178 305 149 305 104C305 47 270 18 199 18C130 18 86 64 67 155C64 168 59 175 50 175C39 175 33 165 33 146L33 17C33-2 38-11 48-11C51-11 56-8 64-1C82 15 74 12 92 30C121 3 157-11 199-11C294-11 360 38 360 130Z" transform="translate(944,0)"></path></g><g data-mml-node="mo" transform="translate(1338,0)"><path data-c="2061" d=""></path></g><g data-mml-node="TeXAtom" data-latex="{\theta}" data-mjx-texclass="ORD" transform="translate(1504.7,0)"><g data-mml-node="mi" data-latex="\theta"><path data-c="1D703" d="M164-11C209-11 256 16 302 70C382 163 455 335 455 498C455 539 448 582 434 625C416 678 382 705 333 705C288 705 243 678 196 624C116 532 42 360 42 196C42 94 75-11 164-11M332 675C365 675 382 637 382 560C382 517 372 452 352 367L155 367C180 460 204 529 229 574C266 641 301 675 332 675M145 327L341 327C322 246 299 181 274 132C235 57 199 19 164 19C131 19 115 58 115 135C115 185 125 249 145 327Z"></path></g></g></g><g data-mml-node="mtd" transform="translate(3808.3,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(5363.3,0)"><g data-mml-node="mi" data-latex="\sin"><path data-c="73" d="M360 130C360 206 308 254 205 274C158 283 128 294 112 305C96 316 88 332 88 351C88 398 123 421 193 421C261 421 298 383 303 306C304 298 309 294 319 294C330 294 336 303 336 321L336 420C336 439 331 448 321 448C310 448 295 430 285 422C260 439 229 448 193 448C104 448 33 408 33 323C33 289 47 260 76 237C111 208 144 202 207 191C272 178 305 149 305 104C305 47 270 18 199 18C130 18 86 64 67 155C64 168 59 175 50 175C39 175 33 165 33 146L33 17C33-2 38-11 48-11C51-11 56-8 64-1C82 15 74 12 92 30C121 3 157-11 199-11C294-11 360 38 360 130Z"></path><path data-c="69" d="M194 601C194 631 169 657 139 657C109 657 83 631 83 601C83 571 108 544 138 544C169 544 194 570 194 601M143 3L247 0L247 39C214 39 194 41 188 45C182 49 180 60 180 78L180 445L37 433L37 395C70 395 91 392 98 387C105 382 108 368 108 345L108 79C108 60 105 48 98 44C91 40 69 39 33 39L33 0Z" transform="translate(394,0)"></path><path data-c="6E" d="M314 413C359 413 382 378 382 307L382 79C382 60 379 48 372 44C365 40 343 38 306 38L306 0L421 3L535 0L535 38C503 38 482 39 472 42C462 45 458 52 458 64L458 251C458 298 457 331 454 350C444 411 399 442 320 442C257 442 210 412 179 352L179 442L32 431L32 393C68 393 90 390 98 384C106 378 109 365 109 342L109 79C109 60 105 48 98 44C91 40 69 38 32 38L32 0L147 3L261 0L261 38C224 38 203 40 196 44C189 48 185 60 185 79L185 259C185 340 236 413 314 413Z" transform="translate(672,0)"></path></g><g data-mml-node="mo" transform="translate(1228,0)"><path data-c="2061" d=""></path></g><g data-mml-node="TeXAtom" data-latex="{\theta}" data-mjx-texclass="ORD" transform="translate(1394.7,0)"><g data-mml-node="mi" data-latex="\theta"><path data-c="1D703" d="M164-11C209-11 256 16 302 70C382 163 455 335 455 498C455 539 448 582 434 625C416 678 382 705 333 705C288 705 243 678 196 624C116 532 42 360 42 196C42 94 75-11 164-11M332 675C365 675 382 637 382 560C382 517 372 452 352 367L155 367C180 460 204 529 229 574C266 641 301 675 332 675M145 327L341 327C322 246 299 181 274 132C235 57 199 19 164 19C131 19 115 58 115 135C115 185 125 249 145 327Z"></path></g></g></g><g data-mml-node="mtd" transform="translate(8282,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g></g><g data-mml-node="mtr" transform="translate(0,700)"><g data-mml-node="mtd" transform="translate(1154.2,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(3808.3,0)"><g data-mml-node="mn" data-latex="1"><path data-c="31" d="M269 666C228 624 168 603 89 603L89 564C141 564 184 572 217 588L217 82C217 64 213 52 204 47C195 42 170 39 130 39L95 39L95 0C120 2 174 3 257 3C340 3 394 2 419 0L419 39L384 39C343 39 318 42 310 47C302 52 297 64 297 82L297 636C297 660 295 666 269 666Z"></path></g></g><g data-mml-node="mtd" transform="translate(6045.2,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(8282,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g></g><g data-mml-node="mtr" transform="translate(0,-700)"><g data-mml-node="mtd"><g data-mml-node="mo" data-latex="-"><path data-c="2212" d="M698 270L80 270C64 270 56 263 56 250C56 237 64 230 80 230L698 230C714 230 722 237 722 250C722 262 710 270 698 270Z"></path></g><g data-mml-node="mi" data-latex="\sin" transform="translate(944.7,0)"><path data-c="73" d="M360 130C360 206 308 254 205 274C158 283 128 294 112 305C96 316 88 332 88 351C88 398 123 421 193 421C261 421 298 383 303 306C304 298 309 294 319 294C330 294 336 303 336 321L336 420C336 439 331 448 321 448C310 448 295 430 285 422C260 439 229 448 193 448C104 448 33 408 33 323C33 289 47 260 76 237C111 208 144 202 207 191C272 178 305 149 305 104C305 47 270 18 199 18C130 18 86 64 67 155C64 168 59 175 50 175C39 175 33 165 33 146L33 17C33-2 38-11 48-11C51-11 56-8 64-1C82 15 74 12 92 30C121 3 157-11 199-11C294-11 360 38 360 130Z"></path><path data-c="69" d="M194 601C194 631 169 657 139 657C109 657 83 631 83 601C83 571 108 544 138 544C169 544 194 570 194 601M143 3L247 0L247 39C214 39 194 41 188 45C182 49 180 60 180 78L180 445L37 433L37 395C70 395 91 392 98 387C105 382 108 368 108 345L108 79C108 60 105 48 98 44C91 40 69 39 33 39L33 0Z" transform="translate(394,0)"></path><path data-c="6E" d="M314 413C359 413 382 378 382 307L382 79C382 60 379 48 372 44C365 40 343 38 306 38L306 0L421 3L535 0L535 38C503 38 482 39 472 42C462 45 458 52 458 64L458 251C458 298 457 331 454 350C444 411 399 442 320 442C257 442 210 412 179 352L179 442L32 431L32 393C68 393 90 390 98 384C106 378 109 365 109 342L109 79C109 60 105 48 98 44C91 40 69 38 32 38L32 0L147 3L261 0L261 38C224 38 203 40 196 44C189 48 185 60 185 79L185 259C185 340 236 413 314 413Z" transform="translate(672,0)"></path></g><g data-mml-node="mo" transform="translate(2172.7,0)"><path data-c="2061" d=""></path></g><g data-mml-node="TeXAtom" data-latex="{\theta}" data-mjx-texclass="ORD" transform="translate(2339.3,0)"><g data-mml-node="mi" data-latex="\theta"><path data-c="1D703" d="M164-11C209-11 256 16 302 70C382 163 455 335 455 498C455 539 448 582 434 625C416 678 382 705 333 705C288 705 243 678 196 624C116 532 42 360 42 196C42 94 75-11 164-11M332 675C365 675 382 637 382 560C382 517 372 452 352 367L155 367C180 460 204 529 229 574C266 641 301 675 332 675M145 327L341 327C322 246 299 181 274 132C235 57 199 19 164 19C131 19 115 58 115 135C115 185 125 249 145 327Z"></path></g></g></g><g data-mml-node="mtd" transform="translate(3808.3,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(5308.3,0)"><g data-mml-node="mi" data-latex="\cos"><path data-c="63" d="M251 416C293 416 325 406 347 386C323 383 306 361 306 338C306 305 322 289 355 289C388 289 404 306 404 339C404 410 327 448 250 448C188 448 137 426 96 380C55 334 34 279 34 216C34 155 55 101 96 56C137 11 187-11 248-11C298-11 337 3 365 32C388 55 403 78 411 102C414 111 415 117 415 121C415 130 409 134 398 134C390 134 385 130 382 122C361 55 320 21 257 21C228 21 200 34 172 61C139 92 123 144 123 218C123 318 161 416 251 416Z"></path><path data-c="6F" d="M249-11C311-11 363 11 406 55C449 99 471 152 471 214C471 277 450 332 408 378C366 424 313 448 250 448C187 448 135 424 92 378C49 332 28 277 28 214C28 152 49 99 92 55C135 11 188-11 249-11M250 21C202 21 166 42 141 85C125 113 117 159 117 222C117 283 125 327 140 355C164 398 200 419 249 419C296 419 332 398 357 357C374 329 382 284 382 222C382 106 348 21 250 21Z" transform="translate(444,0)"></path><path data-c="73" d="M360 130C360 206 308 254 205 274C158 283 128 294 112 305C96 316 88 332 88 351C88 398 123 421 193 421C261 421 298 383 303 306C304 298 309 294 319 294C330 294 336 303 336 321L336 420C336 439 331 448 321 448C310 448 295 430 285 422C260 439 229 448 193 448C104 448 33 408 33 323C33 289 47 260 76 237C111 208 144 202 207 191C272 178 305 149 305 104C305 47 270 18 199 18C130 18 86 64 67 155C64 168 59 175 50 175C39 175 33 165 33 146L33 17C33-2 38-11 48-11C51-11 56-8 64-1C82 15 74 12 92 30C121 3 157-11 199-11C294-11 360 38 360 130Z" transform="translate(944,0)"></path></g><g data-mml-node="mo" transform="translate(1338,0)"><path data-c="2061" d=""></path></g><g data-mml-node="TeXAtom" data-latex="{\theta}" data-mjx-texclass="ORD" transform="translate(1504.7,0)"><g data-mml-node="mi" data-latex="\theta"><path data-c="1D703" d="M164-11C209-11 256 16 302 70C382 163 455 335 455 498C455 539 448 582 434 625C416 678 382 705 333 705C288 705 243 678 196 624C116 532 42 360 42 196C42 94 75-11 164-11M332 675C365 675 382 637 382 560C382 517 372 452 352 367L155 367C180 460 204 529 229 574C266 641 301 675 332 675M145 327L341 327C322 246 299 181 274 132C235 57 199 19 164 19C131 19 115 58 115 135C115 185 125 249 145 327Z"></path></g></g></g><g data-mml-node="mtd" transform="translate(8282,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g></g><g data-mml-node="mtr" transform="translate(0,-2100)"><g data-mml-node="mtd" transform="translate(1154.2,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(3808.3,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(6045.2,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(8282,0)"><g data-mml-node="mn" data-latex="1"><path data-c="31" d="M269 666C228 624 168 603 89 603L89 564C141 564 184 572 217 588L217 82C217 64 213 52 204 47C195 42 170 39 130 39L95 39L95 0C120 2 174 3 257 3C340 3 394 2 419 0L419 39L384 39C343 39 318 42 310 47C302 52 297 64 297 82L297 636C297 660 295 666 269 666Z"></path></g></g></g></g><g data-mml-node="mo" transform="translate(9657,0)"><path data-c="239E" d="M490 0L598 0L598 253C598 581 487 920 363 1150C281 1301 190 1415 91 1490C87 1493 82 1495 77 1495C60 1495 52 1487 52 1470C52 1462 55 1455 62 1450C143 1389 216 1292 283 1160C402 924 490 593 490 253Z" transform="translate(0,1355)"></path><path data-c="23A0" d="M598 1242L598 1495L490 1495L490 1242C490 1088 472 933 437 776C375 494 246 184 63 44C56 40 52 34 52 25C52 8 60 0 77 0C82 0 87 2 91 5C178 71 261 170 339 303C477 539 598 892 598 1242Z" transform="translate(0,-2350)"></path><svg width="875" height="2350" y="-925" x="0" viewBox="0 587.5 875 2350"><path data-c="239F" d="M490 0L598 0L598 498L490 498Z" transform="scale(1,7.078)"></path></svg></g></g></g></g></svg></mjx-container></p></li><li><p>绕 Z 轴：</p><p>  <mjx-container class="MathJax" jax="SVG" overflow="overflow" display="true"><svg style="vertical-align: -5.317ex;" xmlns="http://www.w3.org/2000/svg" width="23.828ex" height="11.765ex" role="img" focusable="false" viewBox="0 -2850 10532 5200"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="  \begin{pmatrix}  \cos{\theta} &amp; -\sin{\theta} &amp; 0 &amp; 0 \\  \sin{\theta} &amp; \cos{\theta} &amp; 0 &amp; 0 \\  0 &amp; 0 &amp; 1 &amp; 0 \\  0 &amp; 0 &amp; 0 &amp; 1  \end{pmatrix}  "><g data-mml-node="mrow" data-latex="\begin{pmatrix}  \cos{\theta} &amp; -\sin{\theta} &amp; 0 &amp; 0 \\  \sin{\theta} &amp; \cos{\theta} &amp; 0 &amp; 0 \\  0 &amp; 0 &amp; 1 &amp; 0 \\  0 &amp; 0 &amp; 0 &amp; 1  \end{pmatrix}"><g data-mml-node="mo"><path data-c="239B" d="M813 1450C820 1455 823 1462 823 1470C823 1487 815 1495 798 1495C793 1495 788 1493 784 1490C697 1423 614 1324 536 1192C399 956 277 603 277 253L277 0L385 0L385 253C385 407 403 562 438 719C500 999 630 1313 813 1450Z" transform="translate(0,1355)"></path><path data-c="239D" d="M798 0C815 0 823 8 823 25C823 34 819 40 812 44C731 106 658 202 592 334C474 569 385 903 385 1242L385 1495L277 1495L277 1242C277 914 388 575 512 345C594 193 685 80 784 5C788 2 793 0 798 0Z" transform="translate(0,-2350)"></path><svg width="875" height="2350" y="-925" x="0" viewBox="0 587.5 875 2350"><path data-c="239C" d="M277 0L385 0L385 498L277 498Z" transform="scale(1,7.078)"></path></svg></g><g data-mml-node="mtable" transform="translate(875,0)"><g data-mml-node="mtr" transform="translate(0,2100)"><g data-mml-node="mtd"><g data-mml-node="mi" data-latex="\cos"><path data-c="63" d="M251 416C293 416 325 406 347 386C323 383 306 361 306 338C306 305 322 289 355 289C388 289 404 306 404 339C404 410 327 448 250 448C188 448 137 426 96 380C55 334 34 279 34 216C34 155 55 101 96 56C137 11 187-11 248-11C298-11 337 3 365 32C388 55 403 78 411 102C414 111 415 117 415 121C415 130 409 134 398 134C390 134 385 130 382 122C361 55 320 21 257 21C228 21 200 34 172 61C139 92 123 144 123 218C123 318 161 416 251 416Z"></path><path data-c="6F" d="M249-11C311-11 363 11 406 55C449 99 471 152 471 214C471 277 450 332 408 378C366 424 313 448 250 448C187 448 135 424 92 378C49 332 28 277 28 214C28 152 49 99 92 55C135 11 188-11 249-11M250 21C202 21 166 42 141 85C125 113 117 159 117 222C117 283 125 327 140 355C164 398 200 419 249 419C296 419 332 398 357 357C374 329 382 284 382 222C382 106 348 21 250 21Z" transform="translate(444,0)"></path><path data-c="73" d="M360 130C360 206 308 254 205 274C158 283 128 294 112 305C96 316 88 332 88 351C88 398 123 421 193 421C261 421 298 383 303 306C304 298 309 294 319 294C330 294 336 303 336 321L336 420C336 439 331 448 321 448C310 448 295 430 285 422C260 439 229 448 193 448C104 448 33 408 33 323C33 289 47 260 76 237C111 208 144 202 207 191C272 178 305 149 305 104C305 47 270 18 199 18C130 18 86 64 67 155C64 168 59 175 50 175C39 175 33 165 33 146L33 17C33-2 38-11 48-11C51-11 56-8 64-1C82 15 74 12 92 30C121 3 157-11 199-11C294-11 360 38 360 130Z" transform="translate(944,0)"></path></g><g data-mml-node="mo" transform="translate(1338,0)"><path data-c="2061" d=""></path></g><g data-mml-node="TeXAtom" data-latex="{\theta}" data-mjx-texclass="ORD" transform="translate(1504.7,0)"><g data-mml-node="mi" data-latex="\theta"><path data-c="1D703" d="M164-11C209-11 256 16 302 70C382 163 455 335 455 498C455 539 448 582 434 625C416 678 382 705 333 705C288 705 243 678 196 624C116 532 42 360 42 196C42 94 75-11 164-11M332 675C365 675 382 637 382 560C382 517 372 452 352 367L155 367C180 460 204 529 229 574C266 641 301 675 332 675M145 327L341 327C322 246 299 181 274 132C235 57 199 19 164 19C131 19 115 58 115 135C115 185 125 249 145 327Z"></path></g></g></g><g data-mml-node="mtd" transform="translate(2973.7,0)"><g data-mml-node="mo" data-latex="-"><path data-c="2212" d="M698 270L80 270C64 270 56 263 56 250C56 237 64 230 80 230L698 230C714 230 722 237 722 250C722 262 710 270 698 270Z"></path></g><g data-mml-node="mi" data-latex="\sin" transform="translate(944.7,0)"><path data-c="73" d="M360 130C360 206 308 254 205 274C158 283 128 294 112 305C96 316 88 332 88 351C88 398 123 421 193 421C261 421 298 383 303 306C304 298 309 294 319 294C330 294 336 303 336 321L336 420C336 439 331 448 321 448C310 448 295 430 285 422C260 439 229 448 193 448C104 448 33 408 33 323C33 289 47 260 76 237C111 208 144 202 207 191C272 178 305 149 305 104C305 47 270 18 199 18C130 18 86 64 67 155C64 168 59 175 50 175C39 175 33 165 33 146L33 17C33-2 38-11 48-11C51-11 56-8 64-1C82 15 74 12 92 30C121 3 157-11 199-11C294-11 360 38 360 130Z"></path><path data-c="69" d="M194 601C194 631 169 657 139 657C109 657 83 631 83 601C83 571 108 544 138 544C169 544 194 570 194 601M143 3L247 0L247 39C214 39 194 41 188 45C182 49 180 60 180 78L180 445L37 433L37 395C70 395 91 392 98 387C105 382 108 368 108 345L108 79C108 60 105 48 98 44C91 40 69 39 33 39L33 0Z" transform="translate(394,0)"></path><path data-c="6E" d="M314 413C359 413 382 378 382 307L382 79C382 60 379 48 372 44C365 40 343 38 306 38L306 0L421 3L535 0L535 38C503 38 482 39 472 42C462 45 458 52 458 64L458 251C458 298 457 331 454 350C444 411 399 442 320 442C257 442 210 412 179 352L179 442L32 431L32 393C68 393 90 390 98 384C106 378 109 365 109 342L109 79C109 60 105 48 98 44C91 40 69 38 32 38L32 0L147 3L261 0L261 38C224 38 203 40 196 44C189 48 185 60 185 79L185 259C185 340 236 413 314 413Z" transform="translate(672,0)"></path></g><g data-mml-node="mo" transform="translate(2172.7,0)"><path data-c="2061" d=""></path></g><g data-mml-node="TeXAtom" data-latex="{\theta}" data-mjx-texclass="ORD" transform="translate(2339.3,0)"><g data-mml-node="mi" data-latex="\theta"><path data-c="1D703" d="M164-11C209-11 256 16 302 70C382 163 455 335 455 498C455 539 448 582 434 625C416 678 382 705 333 705C288 705 243 678 196 624C116 532 42 360 42 196C42 94 75-11 164-11M332 675C365 675 382 637 382 560C382 517 372 452 352 367L155 367C180 460 204 529 229 574C266 641 301 675 332 675M145 327L341 327C322 246 299 181 274 132C235 57 199 19 164 19C131 19 115 58 115 135C115 185 125 249 145 327Z"></path></g></g></g><g data-mml-node="mtd" transform="translate(6782,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(8282,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g></g><g data-mml-node="mtr" transform="translate(0,700)"><g data-mml-node="mtd" transform="translate(55,0)"><g data-mml-node="mi" data-latex="\sin"><path data-c="73" d="M360 130C360 206 308 254 205 274C158 283 128 294 112 305C96 316 88 332 88 351C88 398 123 421 193 421C261 421 298 383 303 306C304 298 309 294 319 294C330 294 336 303 336 321L336 420C336 439 331 448 321 448C310 448 295 430 285 422C260 439 229 448 193 448C104 448 33 408 33 323C33 289 47 260 76 237C111 208 144 202 207 191C272 178 305 149 305 104C305 47 270 18 199 18C130 18 86 64 67 155C64 168 59 175 50 175C39 175 33 165 33 146L33 17C33-2 38-11 48-11C51-11 56-8 64-1C82 15 74 12 92 30C121 3 157-11 199-11C294-11 360 38 360 130Z"></path><path data-c="69" d="M194 601C194 631 169 657 139 657C109 657 83 631 83 601C83 571 108 544 138 544C169 544 194 570 194 601M143 3L247 0L247 39C214 39 194 41 188 45C182 49 180 60 180 78L180 445L37 433L37 395C70 395 91 392 98 387C105 382 108 368 108 345L108 79C108 60 105 48 98 44C91 40 69 39 33 39L33 0Z" transform="translate(394,0)"></path><path data-c="6E" d="M314 413C359 413 382 378 382 307L382 79C382 60 379 48 372 44C365 40 343 38 306 38L306 0L421 3L535 0L535 38C503 38 482 39 472 42C462 45 458 52 458 64L458 251C458 298 457 331 454 350C444 411 399 442 320 442C257 442 210 412 179 352L179 442L32 431L32 393C68 393 90 390 98 384C106 378 109 365 109 342L109 79C109 60 105 48 98 44C91 40 69 38 32 38L32 0L147 3L261 0L261 38C224 38 203 40 196 44C189 48 185 60 185 79L185 259C185 340 236 413 314 413Z" transform="translate(672,0)"></path></g><g data-mml-node="mo" transform="translate(1228,0)"><path data-c="2061" d=""></path></g><g data-mml-node="TeXAtom" data-latex="{\theta}" data-mjx-texclass="ORD" transform="translate(1394.7,0)"><g data-mml-node="mi" data-latex="\theta"><path data-c="1D703" d="M164-11C209-11 256 16 302 70C382 163 455 335 455 498C455 539 448 582 434 625C416 678 382 705 333 705C288 705 243 678 196 624C116 532 42 360 42 196C42 94 75-11 164-11M332 675C365 675 382 637 382 560C382 517 372 452 352 367L155 367C180 460 204 529 229 574C266 641 301 675 332 675M145 327L341 327C322 246 299 181 274 132C235 57 199 19 164 19C131 19 115 58 115 135C115 185 125 249 145 327Z"></path></g></g></g><g data-mml-node="mtd" transform="translate(3391,0)"><g data-mml-node="mi" data-latex="\cos"><path data-c="63" d="M251 416C293 416 325 406 347 386C323 383 306 361 306 338C306 305 322 289 355 289C388 289 404 306 404 339C404 410 327 448 250 448C188 448 137 426 96 380C55 334 34 279 34 216C34 155 55 101 96 56C137 11 187-11 248-11C298-11 337 3 365 32C388 55 403 78 411 102C414 111 415 117 415 121C415 130 409 134 398 134C390 134 385 130 382 122C361 55 320 21 257 21C228 21 200 34 172 61C139 92 123 144 123 218C123 318 161 416 251 416Z"></path><path data-c="6F" d="M249-11C311-11 363 11 406 55C449 99 471 152 471 214C471 277 450 332 408 378C366 424 313 448 250 448C187 448 135 424 92 378C49 332 28 277 28 214C28 152 49 99 92 55C135 11 188-11 249-11M250 21C202 21 166 42 141 85C125 113 117 159 117 222C117 283 125 327 140 355C164 398 200 419 249 419C296 419 332 398 357 357C374 329 382 284 382 222C382 106 348 21 250 21Z" transform="translate(444,0)"></path><path data-c="73" d="M360 130C360 206 308 254 205 274C158 283 128 294 112 305C96 316 88 332 88 351C88 398 123 421 193 421C261 421 298 383 303 306C304 298 309 294 319 294C330 294 336 303 336 321L336 420C336 439 331 448 321 448C310 448 295 430 285 422C260 439 229 448 193 448C104 448 33 408 33 323C33 289 47 260 76 237C111 208 144 202 207 191C272 178 305 149 305 104C305 47 270 18 199 18C130 18 86 64 67 155C64 168 59 175 50 175C39 175 33 165 33 146L33 17C33-2 38-11 48-11C51-11 56-8 64-1C82 15 74 12 92 30C121 3 157-11 199-11C294-11 360 38 360 130Z" transform="translate(944,0)"></path></g><g data-mml-node="mo" transform="translate(1338,0)"><path data-c="2061" d=""></path></g><g data-mml-node="TeXAtom" data-latex="{\theta}" data-mjx-texclass="ORD" transform="translate(1504.7,0)"><g data-mml-node="mi" data-latex="\theta"><path data-c="1D703" d="M164-11C209-11 256 16 302 70C382 163 455 335 455 498C455 539 448 582 434 625C416 678 382 705 333 705C288 705 243 678 196 624C116 532 42 360 42 196C42 94 75-11 164-11M332 675C365 675 382 637 382 560C382 517 372 452 352 367L155 367C180 460 204 529 229 574C266 641 301 675 332 675M145 327L341 327C322 246 299 181 274 132C235 57 199 19 164 19C131 19 115 58 115 135C115 185 125 249 145 327Z"></path></g></g></g><g data-mml-node="mtd" transform="translate(6782,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(8282,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g></g><g data-mml-node="mtr" transform="translate(0,-700)"><g data-mml-node="mtd" transform="translate(736.8,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(4127.8,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(6782,0)"><g data-mml-node="mn" data-latex="1"><path data-c="31" d="M269 666C228 624 168 603 89 603L89 564C141 564 184 572 217 588L217 82C217 64 213 52 204 47C195 42 170 39 130 39L95 39L95 0C120 2 174 3 257 3C340 3 394 2 419 0L419 39L384 39C343 39 318 42 310 47C302 52 297 64 297 82L297 636C297 660 295 666 269 666Z"></path></g></g><g data-mml-node="mtd" transform="translate(8282,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g></g><g data-mml-node="mtr" transform="translate(0,-2100)"><g data-mml-node="mtd" transform="translate(736.8,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(4127.8,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(6782,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(8282,0)"><g data-mml-node="mn" data-latex="1"><path data-c="31" d="M269 666C228 624 168 603 89 603L89 564C141 564 184 572 217 588L217 82C217 64 213 52 204 47C195 42 170 39 130 39L95 39L95 0C120 2 174 3 257 3C340 3 394 2 419 0L419 39L384 39C343 39 318 42 310 47C302 52 297 64 297 82L297 636C297 660 295 666 269 666Z"></path></g></g></g></g><g data-mml-node="mo" transform="translate(9657,0)"><path data-c="239E" d="M490 0L598 0L598 253C598 581 487 920 363 1150C281 1301 190 1415 91 1490C87 1493 82 1495 77 1495C60 1495 52 1487 52 1470C52 1462 55 1455 62 1450C143 1389 216 1292 283 1160C402 924 490 593 490 253Z" transform="translate(0,1355)"></path><path data-c="23A0" d="M598 1242L598 1495L490 1495L490 1242C490 1088 472 933 437 776C375 494 246 184 63 44C56 40 52 34 52 25C52 8 60 0 77 0C82 0 87 2 91 5C178 71 261 170 339 303C477 539 598 892 598 1242Z" transform="translate(0,-2350)"></path><svg width="875" height="2350" y="-925" x="0" viewBox="0 587.5 875 2350"><path data-c="239F" d="M490 0L598 0L598 498L490 498Z" transform="scale(1,7.078)"></path></svg></g></g></g></g></svg></mjx-container></p></li></ul></li><li><p>缩放和平移与二维同理，此处略过。</p></li></ul><h1 id="视图变换"><a href="#视图变换" class="headerlink" title="视图变换"></a>视图变换</h1><ul><li><p>一般约定摄像机需位于三维坐标的原点，面朝 <mjx-container class="MathJax" jax="SVG" overflow="overflow"><svg style="vertical-align: -0.188ex;" xmlns="http://www.w3.org/2000/svg" width="2.817ex" height="1.507ex" role="img" focusable="false" viewBox="0 -583 1245 666"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="-z"><g data-mml-node="mo" data-latex="-"><path data-c="2212" d="M698 270L80 270C64 270 56 263 56 250C56 237 64 230 80 230L698 230C714 230 722 237 722 250C722 262 710 270 698 270Z"></path></g><g data-mml-node="mi" data-latex="z" transform="translate(778,0)"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g></g></g></svg></mjx-container> 方向。视图变换的过程就是将一个场景中任意摆放的摄像机位移到约定的位置。</p></li><li><p>一般使用如下三个参数定义摄像机在世界坐标空间中的位置：</p><ul><li><mjx-container class="MathJax" jax="SVG" overflow="overflow"><svg style="vertical-align: -0.025ex;" xmlns="http://www.w3.org/2000/svg" width="1.054ex" height="1.025ex" role="img" focusable="false" viewBox="0 -442 466 453"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="e"><g data-mml-node="mi" data-latex="e"><path data-c="1D452" d="M124 129C124 153 129 186 139 227L188 227C253 227 303 235 339 250C372 264 394 284 405 309C412 326 415 342 415 355C415 410 363 442 307 442C268 442 229 432 190 412C113 372 46 281 46 171C46 69 105-11 204-11C257-11 304 2 345 27C379 48 404 69 420 90C427 99 430 106 430 109C430 120 425 126 414 126C409 126 404 122 398 114C365 70 324 42 277 30C246 22 223 18 206 18C149 18 124 72 124 129M375 355C375 289 311 256 182 256L147 256C166 322 194 366 232 387C262 404 287 413 307 413C343 413 375 391 375 355Z"></path></g></g></g></svg></mjx-container>: eye position</li><li><mjx-container class="MathJax" jax="SVG" overflow="overflow"><svg style="vertical-align: -0.464ex;" xmlns="http://www.w3.org/2000/svg" width="1.079ex" height="2.333ex" role="img" focusable="false" viewBox="0 -826 477 1031"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="\hat{g}"><g data-mml-node="TeXAtom" data-latex="\hat{g}" data-mjx-texclass="ORD"><g data-mml-node="mover"><g data-mml-node="mi" data-latex="g"><path data-c="1D454" d="M15-141C15-184 60-205 150-205C197-205 241-193 280-170C324-144 351-109 362-66L471 373C473 383 474 389 474 392C474 412 463 422 442 422C420 422 406 410 399 387C377 424 347 442 310 442C246 442 189 410 140 346C95 286 72 223 72 158C72 71 123-3 207-3C246-3 282 14 315 47L285-71C256-140 211-175 148-175C122-175 100-173 82-169C103-158 113-141 113-118C113-93 99-80 72-80C40-80 15-109 15-141M356 392C376 371 386 351 386 331C386 330 385 325 383 318L336 129C330 106 313 82 286 60C259 38 233 27 210 27C170 27 150 56 150 114C150 169 184 291 204 327C235 384 270 412 311 412C329 412 344 405 356 392Z"></path></g><g data-mml-node="mo" transform="translate(315.5,32) translate(-250 0)"><path data-c="2C6" d="M386 515L403 533L250 694L97 533L114 515L250 618Z"></path></g></g></g></g></g></svg></mjx-container>: gaze direction</li><li><mjx-container class="MathJax" jax="SVG" overflow="overflow"><svg style="vertical-align: -0.025ex;" xmlns="http://www.w3.org/2000/svg" width="0.817ex" height="2.31ex" role="img" focusable="false" viewBox="0 -1010 361 1021"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="\hat{t}"><g data-mml-node="TeXAtom" data-latex="\hat{t}" data-mjx-texclass="ORD"><g data-mml-node="mover"><g data-mml-node="mi" data-latex="t"><path data-c="1D461" d="M330 419C330 428 320 433 299 433L218 433C244 537 257 591 257 595C257 616 246 626 225 626C202 626 188 613 182 587L145 433L56 433C34 433 23 432 23 411C23 400 33 395 54 395L135 395C86 200 62 97 62 84C62 28 100-11 156-11C194-11 227 6 256 41C280 70 297 98 308 125C312 136 314 142 314 145C314 154 309 159 299 159C291 159 285 154 281 143C247 60 206 19 157 19C140 19 131 33 131 60C131 75 133 91 137 107L208 395L297 395C323 395 330 397 330 419Z"></path></g><g data-mml-node="mo" transform="translate(224.5,216) translate(-250 0)"><path data-c="2C6" d="M386 515L403 533L250 694L97 533L114 515L250 618Z"></path></g></g></g></g></g></svg></mjx-container>: top direction</li></ul>  <div class="callout callout--titled primary mb-4 rounded-small shadow-redefine-flat bg-(--callout-bg-color) p-3 pl-1 relative flex flex-row gap-2"><div role="none" class="rounded-full self-stretch w-0.5 bg-(--callout-primary-color) shrink-0 opacity-60"></div><div class="flex flex-col gap-2"><div class="callout__title flex items-center gap-2 font-semibold tracking-tight"><i class="callout__icon fa-solid leading-none text-(--callout-primary-color) text-sm shrink-0"></i> NOTE</div><div class="callout__content markdown-body flex-1 min-w-0"><p><mjx-container class="MathJax" jax="SVG" overflow="overflow"><svg style="vertical-align: -0.025ex;" xmlns="http://www.w3.org/2000/svg" width="1.294ex" height="1.894ex" role="img" focusable="false" viewBox="0 -826 572 837"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="\hat{x}"><g data-mml-node="TeXAtom" data-latex="\hat{x}" data-mjx-texclass="ORD"><g data-mml-node="mover"><g data-mml-node="mi" data-latex="x"><path data-c="1D465" d="M527 373C527 419 482 442 432 442C389 442 355 419 329 373C308 419 273 442 222 442C173 442 133 419 101 374C74 335 60 306 60 287C60 278 65 273 75 273C84 273 90 278 92 287C111 345 153 413 220 413C253 413 269 392 269 351C269 330 251 252 216 118C199 51 169 18 126 18C112 18 99 21 88 26C114 36 127 54 127 80C127 106 114 119 87 119C54 119 29 91 29 58C29 12 76-11 125-11C167-11 201 12 228 58C247 12 283-11 335-11C383-11 423 12 455 57C482 96 496 125 496 144C496 153 491 158 481 158C472 158 467 153 464 144C447 87 402 18 337 18C304 18 287 38 287 79C287 92 292 120 303 165L337 300C356 375 387 413 431 413C445 413 458 410 469 405C442 396 429 378 429 351C429 325 443 312 470 312C502 312 527 341 527 373Z"></path></g><g data-mml-node="mo" transform="translate(329,32) translate(-250 0)"><path data-c="2C6" d="M386 515L403 533L250 694L97 533L114 515L250 618Z"></path></g></g></g></g></g></svg></mjx-container> 上的尖角表示这是一个 <strong>单位向量</strong></p></div></div></div></li><li><p>要想写出一个变换矩阵，使得摄像机所在的空间变换到我们先前的约定方式，也就是：</p><blockquote><p>一般约定摄像机需位于三维坐标的原点，面朝 <mjx-container class="MathJax" jax="SVG" overflow="overflow"><svg style="vertical-align: -0.188ex;" xmlns="http://www.w3.org/2000/svg" width="2.817ex" height="1.507ex" role="img" focusable="false" viewBox="0 -583 1245 666"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="-z"><g data-mml-node="mo" data-latex="-"><path data-c="2212" d="M698 270L80 270C64 270 56 263 56 250C56 237 64 230 80 230L698 230C714 230 722 237 722 250C722 262 710 270 698 270Z"></path></g><g data-mml-node="mi" data-latex="z" transform="translate(778,0)"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g></g></g></svg></mjx-container> 方向</p></blockquote></li><li><p>这是相当困难的，因为摄像机很可能处于一种非标准的状态，即位置不位于原点，<mjx-container class="MathJax" jax="SVG" overflow="overflow"><svg style="vertical-align: -0.464ex;" xmlns="http://www.w3.org/2000/svg" width="1.079ex" height="2.333ex" role="img" focusable="false" viewBox="0 -826 477 1031"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="\hat{g}"><g data-mml-node="TeXAtom" data-latex="\hat{g}" data-mjx-texclass="ORD"><g data-mml-node="mover"><g data-mml-node="mi" data-latex="g"><path data-c="1D454" d="M15-141C15-184 60-205 150-205C197-205 241-193 280-170C324-144 351-109 362-66L471 373C473 383 474 389 474 392C474 412 463 422 442 422C420 422 406 410 399 387C377 424 347 442 310 442C246 442 189 410 140 346C95 286 72 223 72 158C72 71 123-3 207-3C246-3 282 14 315 47L285-71C256-140 211-175 148-175C122-175 100-173 82-169C103-158 113-141 113-118C113-93 99-80 72-80C40-80 15-109 15-141M356 392C376 371 386 351 386 331C386 330 385 325 383 318L336 129C330 106 313 82 286 60C259 38 233 27 210 27C170 27 150 56 150 114C150 169 184 291 204 327C235 384 270 412 311 412C329 412 344 405 356 392Z"></path></g><g data-mml-node="mo" transform="translate(315.5,32) translate(-250 0)"><path data-c="2C6" d="M386 515L403 533L250 694L97 533L114 515L250 618Z"></path></g></g></g></g></g></svg></mjx-container> 和 <mjx-container class="MathJax" jax="SVG" overflow="overflow"><svg style="vertical-align: -0.025ex;" xmlns="http://www.w3.org/2000/svg" width="0.817ex" height="2.31ex" role="img" focusable="false" viewBox="0 -1010 361 1021"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="\hat{t}"><g data-mml-node="TeXAtom" data-latex="\hat{t}" data-mjx-texclass="ORD"><g data-mml-node="mover"><g data-mml-node="mi" data-latex="t"><path data-c="1D461" d="M330 419C330 428 320 433 299 433L218 433C244 537 257 591 257 595C257 616 246 626 225 626C202 626 188 613 182 587L145 433L56 433C34 433 23 432 23 411C23 400 33 395 54 395L135 395C86 200 62 97 62 84C62 28 100-11 156-11C194-11 227 6 256 41C280 70 297 98 308 125C312 136 314 142 314 145C314 154 309 159 299 159C291 159 285 154 281 143C247 60 206 19 157 19C140 19 131 33 131 60C131 75 133 91 137 107L208 395L297 395C323 395 330 397 330 419Z"></path></g><g data-mml-node="mo" transform="translate(224.5,216) translate(-250 0)"><path data-c="2C6" d="M386 515L403 533L250 694L97 533L114 515L250 618Z"></path></g></g></g></g></g></svg></mjx-container> 可能朝向非坐标轴方向。想要简单的写出一个能将他们全部变换到约定形式的矩阵非常困难，因此我们想到可以利用矩阵在空间变换中的 <strong>可逆</strong> 性质来倒推变换矩阵。</p></li><li><p>即 <strong>写出使得位于三维坐标的原点，面朝 <mjx-container class="MathJax" jax="SVG" overflow="overflow"><svg style="vertical-align: -0.188ex;" xmlns="http://www.w3.org/2000/svg" width="2.817ex" height="1.507ex" role="img" focusable="false" viewBox="0 -583 1245 666"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="-z"><g data-mml-node="mo" data-latex="-"><path data-c="2212" d="M698 270L80 270C64 270 56 263 56 250C56 237 64 230 80 230L698 230C714 230 722 237 722 250C722 262 710 270 698 270Z"></path></g><g data-mml-node="mi" data-latex="z" transform="translate(778,0)"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g></g></g></svg></mjx-container> 方向，顶部朝向 <mjx-container class="MathJax" jax="SVG" overflow="overflow"><svg style="vertical-align: -0.464ex;" xmlns="http://www.w3.org/2000/svg" width="1.109ex" height="1.464ex" role="img" focusable="false" viewBox="0 -442 490 647"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="y"><g data-mml-node="mi" data-latex="y"><path data-c="1D466" d="M163 442C118 442 83 417 58 367C39 328 29 301 29 286C29 277 34 272 45 272C59 272 60 278 64 293C87 372 119 412 160 412C173 412 180 403 180 385C180 369 175 346 164 317C126 214 107 145 107 108C107 32 154-13 231-13C264-13 295-1 323 23C288-109 233-175 158-175C124-175 101-164 89-142C129-140 149-121 149-85C149-60 136-47 109-47C72-47 50-78 50-115C50-170 100-205 158-205C273-205 367-99 392-1L486 377C489 388 490 396 490 401C490 421 479 431 458 431C442 431 429 423 420 408C414 387 409 369 406 354L342 97C332 61 279 16 234 16C196 16 177 41 177 92C177 134 194 198 227 284C240 319 247 343 247 357C247 406 212 442 163 442Z"></path></g></g></g></svg></mjx-container> 方向的摄像机，变换为当前摄像机位置的变换矩阵，而后求该矩阵的逆矩阵</strong>。</p><p>  <mjx-container class="MathJax" jax="SVG" overflow="overflow" display="true"><svg style="vertical-align: -6.184ex;" xmlns="http://www.w3.org/2000/svg" width="29.635ex" height="13.499ex" role="img" focusable="false" viewBox="0 -3233.3 13098.6 5966.6"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="  R_{view}^{-1} =  \begin{pmatrix}  x_{\hat{g} \times \hat{t}} &amp; x_{t} &amp; x_{-g} &amp; 0 \\  y_{\hat{g} \times \hat{t}} &amp; y_{t} &amp; y_{-g} &amp; 0 \\  z_{\hat{g} \times \hat{t}} &amp; z_{t} &amp; z_{-g} &amp; 0 \\  0 &amp; 0 &amp; 0 &amp; 1  \end{pmatrix}  "><g data-mml-node="msubsup" data-latex="R_{v i e w}^{-1}"><g data-mml-node="mi" data-latex="R"><path data-c="1D445" d="M739 531C739 582 713 621 662 649C621 672 572 683 517 683L235 683C212 683 202 682 202 659C202 652 205 647 211 646C221 645 229 644 234 644C264 643 281 641 286 640C291 639 294 636 294 631C294 629 293 623 290 613L158 82C153 60 143 46 128 41C121 39 103 38 72 38C50 38 41 37 41 15C41 4 47-1 59 0L183 3L309 0C325-1 333 8 333 23C333 33 322 38 301 38C261 38 241 43 241 52C241 52 242 54 244 68L308 327L423 327C492 327 527 298 527 241C527 232 522 210 513 174C502 132 497 104 497 89C497 13 556-22 632-22C660-22 687-9 714 16C741 41 755 68 755 96C755 106 750 111 739 111C732 111 726 106 723 95C712 64 698 41 682 28C666 15 651 8 636 8C613 8 601 27 601 64C601 88 604 125 611 176C614 197 615 212 615 223C615 276 587 315 531 339C625 362 739 429 739 531M609 616C629 603 639 581 639 550C639 530 635 507 626 480C599 398 531 357 422 357L316 357L379 610C384 631 392 642 403 643C408 644 428 644 463 644C528 644 566 642 609 616Z"></path></g><g data-mml-node="TeXAtom" transform="translate(792,413) scale(0.707)" data-latex="{-1}" data-mjx-texclass="ORD"><g data-mml-node="mo" data-latex="-"><path data-c="2212" d="M698 270L80 270C64 270 56 263 56 250C56 237 64 230 80 230L698 230C714 230 722 237 722 250C722 262 710 270 698 270Z"></path></g><g data-mml-node="mn" data-latex="1" transform="translate(778,0)"><path data-c="31" d="M269 666C228 624 168 603 89 603L89 564C141 564 184 572 217 588L217 82C217 64 213 52 204 47C195 42 170 39 130 39L95 39L95 0C120 2 174 3 257 3C340 3 394 2 419 0L419 39L384 39C343 39 318 42 310 47C302 52 297 64 297 82L297 636C297 660 295 666 269 666Z"></path></g></g><g data-mml-node="TeXAtom" transform="translate(792,-293.1) scale(0.707)" data-latex="{v i e w}" data-mjx-texclass="ORD"><g data-mml-node="mi" data-latex="v"><path data-c="1D463" d="M369 391C369 383 378 370 394 350C410 330 418 307 418 281C418 252 404 203 375 134C354 86 306 18 247 18C201 18 178 45 178 100C178 139 197 208 235 307C243 328 247 345 247 357C247 407 213 442 163 442C119 442 84 417 59 367C39 326 29 300 29 287C29 278 34 273 45 273C58 273 60 279 64 293C87 373 119 413 160 413C173 413 180 404 180 385C180 369 175 347 164 318C127 219 108 152 108 115C108 64 125 29 159 10C186-4 214-11 243-11C332-11 394 85 420 162C452 256 468 325 468 369C468 418 452 442 421 442C396 442 369 416 369 391Z"></path></g><g data-mml-node="mi" data-latex="i" transform="translate(485,0)"><path data-c="1D456" d="M284 621C284 648 271 661 244 661C216 661 188 633 188 605C188 578 202 565 229 565C257 565 284 593 284 621M259 138C237 59 205 19 164 19C151 19 144 28 144 47C144 64 173 150 232 306C240 329 244 347 244 360C244 409 210 445 161 445C118 445 84 420 59 369C39 328 29 301 29 288C29 279 34 275 45 275C58 275 60 281 64 295C87 375 118 415 158 415C171 415 178 406 178 387C178 373 175 357 168 338C145 275 121 208 101 155C86 115 78 88 78 74C78 25 114-11 162-11C205-11 239 14 264 64C283 103 293 130 293 145C293 154 288 159 277 159C274 159 259 150 259 138Z"></path></g><g data-mml-node="mi" data-latex="e" transform="translate(830,0)"><path data-c="1D452" d="M124 129C124 153 129 186 139 227L188 227C253 227 303 235 339 250C372 264 394 284 405 309C412 326 415 342 415 355C415 410 363 442 307 442C268 442 229 432 190 412C113 372 46 281 46 171C46 69 105-11 204-11C257-11 304 2 345 27C379 48 404 69 420 90C427 99 430 106 430 109C430 120 425 126 414 126C409 126 404 122 398 114C365 70 324 42 277 30C246 22 223 18 206 18C149 18 124 72 124 129M375 355C375 289 311 256 182 256L147 256C166 322 194 366 232 387C262 404 287 413 307 413C343 413 375 391 375 355Z"></path></g><g data-mml-node="mi" data-latex="w" transform="translate(1296,0)"><path data-c="1D464" d="M590 391C590 382 595 372 606 362C629 340 641 313 641 281C641 264 635 237 623 198C586 78 539 18 482 18C435 18 412 45 412 100C412 119 416 142 423 171C441 243 460 314 477 387C479 394 480 398 480 401C480 421 469 431 447 431C427 431 414 421 407 401L367 245C352 187 341 167 341 115C341 107 341 101 342 98C319 45 290 18 255 18C205 18 180 47 180 104C180 141 197 204 231 293C242 323 248 344 248 357C248 406 212 442 163 442C118 442 84 417 59 367C39 328 29 301 29 287C29 278 34 273 45 273C58 273 60 279 64 293C88 373 120 413 160 413C174 413 181 403 181 384C181 369 175 347 164 317C127 220 108 154 108 117C108 32 165-11 252-11C294-11 328 10 355 53C375 10 416-11 479-11C541-11 590 30 625 112C648 164 691 302 691 369C691 384 690 394 689 399C685 418 666 442 644 442C618 442 590 417 590 391Z"></path></g></g></g><g data-mml-node="mo" data-latex="=" transform="translate(2542.5,0)"><path data-c="3D" d="M698 367L80 367C64 367 56 359 56 344C56 329 64 321 80 321L698 321C714 321 722 329 722 344C722 356 711 367 698 367M698 179L80 179C64 179 56 171 56 156C56 141 64 133 80 133L698 133C714 133 722 141 722 156C722 169 711 179 698 179Z"></path></g><g data-mml-node="mrow" data-latex="{pmatrix}" transform="translate(3598.3,0)"><g data-mml-node="mo"><path data-c="239B" d="M813 1450C820 1455 823 1462 823 1470C823 1487 815 1495 798 1495C793 1495 788 1493 784 1490C697 1423 614 1324 536 1192C399 956 277 603 277 253L277 0L385 0L385 253C385 407 403 562 438 719C500 999 630 1313 813 1450Z" transform="translate(0,1738.3)"></path><path data-c="239D" d="M798 0C815 0 823 8 823 25C823 34 819 40 812 44C731 106 658 202 592 334C474 569 385 903 385 1242L385 1495L277 1495L277 1242C277 914 388 575 512 345C594 193 685 80 784 5C788 2 793 0 798 0Z" transform="translate(0,-2733.3)"></path><svg width="875" height="3116.6" y="-1308.3" x="0" viewBox="0 779.2 875 3116.6"><path data-c="239C" d="M277 0L385 0L385 498L277 498Z" transform="scale(1,9.387)"></path></svg></g><g data-mml-node="mtable" transform="translate(875,0)"><g data-mml-node="mtr" transform="translate(0,2483.3)"><g data-mml-node="mtd"><g data-mml-node="msub" data-latex="x_{\hat{g}\times\hat{t}}"><g data-mml-node="mi" data-latex="x"><path data-c="1D465" d="M527 373C527 419 482 442 432 442C389 442 355 419 329 373C308 419 273 442 222 442C173 442 133 419 101 374C74 335 60 306 60 287C60 278 65 273 75 273C84 273 90 278 92 287C111 345 153 413 220 413C253 413 269 392 269 351C269 330 251 252 216 118C199 51 169 18 126 18C112 18 99 21 88 26C114 36 127 54 127 80C127 106 114 119 87 119C54 119 29 91 29 58C29 12 76-11 125-11C167-11 201 12 228 58C247 12 283-11 335-11C383-11 423 12 455 57C482 96 496 125 496 144C496 153 491 158 481 158C472 158 467 153 464 144C447 87 402 18 337 18C304 18 287 38 287 79C287 92 292 120 303 165L337 300C356 375 387 413 431 413C445 413 458 410 469 405C442 396 429 378 429 351C429 325 443 312 470 312C502 312 527 341 527 373Z"></path></g><g data-mml-node="TeXAtom" transform="translate(605,-360.6) scale(0.707)" data-latex="{\hat{g}\times\hat{t}}" data-mjx-texclass="ORD"><g data-mml-node="TeXAtom" data-latex="\hat{g}" data-mjx-texclass="ORD"><g data-mml-node="mover"><g data-mml-node="mi" data-latex="g"><path data-c="1D454" d="M15-141C15-184 60-205 150-205C197-205 241-193 280-170C324-144 351-109 362-66L471 373C473 383 474 389 474 392C474 412 463 422 442 422C420 422 406 410 399 387C377 424 347 442 310 442C246 442 189 410 140 346C95 286 72 223 72 158C72 71 123-3 207-3C246-3 282 14 315 47L285-71C256-140 211-175 148-175C122-175 100-173 82-169C103-158 113-141 113-118C113-93 99-80 72-80C40-80 15-109 15-141M356 392C376 371 386 351 386 331C386 330 385 325 383 318L336 129C330 106 313 82 286 60C259 38 233 27 210 27C170 27 150 56 150 114C150 169 184 291 204 327C235 384 270 412 311 412C329 412 344 405 356 392Z"></path></g><g data-mml-node="mo" transform="translate(315.5,32) translate(-250 0)"><path data-c="2C6" d="M386 515L403 533L250 694L97 533L114 515L250 618Z"></path></g></g></g><g data-mml-node="mo" data-latex="\times" transform="translate(477,0)"><path data-c="D7" d="M630 32C630 39 628 44 623 49L422 250L623 451C628 456 630 461 630 468C630 481 620 491 607 491C600 491 595 489 590 484L389 283L188 484C183 489 178 491 171 491C158 491 148 481 148 468C148 461 150 456 155 451L356 250L155 49C150 44 148 39 148 32C148 19 158 9 171 9C178 9 183 11 188 16L389 217L590 16C595 11 600 9 607 9C620 9 630 19 630 32Z"></path></g><g data-mml-node="TeXAtom" data-latex="\hat{t}" data-mjx-texclass="ORD" transform="translate(1255,0)"><g data-mml-node="mover"><g data-mml-node="mi" data-latex="t"><path data-c="1D461" d="M330 419C330 428 320 433 299 433L218 433C244 537 257 591 257 595C257 616 246 626 225 626C202 626 188 613 182 587L145 433L56 433C34 433 23 432 23 411C23 400 33 395 54 395L135 395C86 200 62 97 62 84C62 28 100-11 156-11C194-11 227 6 256 41C280 70 297 98 308 125C312 136 314 142 314 145C314 154 309 159 299 159C291 159 285 154 281 143C247 60 206 19 157 19C140 19 131 33 131 60C131 75 133 91 137 107L208 395L297 395C323 395 330 397 330 419Z"></path></g><g data-mml-node="mo" transform="translate(224.5,216) translate(-250 0)"><path data-c="2C6" d="M386 515L403 533L250 694L97 533L114 515L250 618Z"></path></g></g></g></g></g></g><g data-mml-node="mtd" transform="translate(2797.7,0)"><g data-mml-node="msub" data-latex="x_{t}"><g data-mml-node="mi" data-latex="x"><path data-c="1D465" d="M527 373C527 419 482 442 432 442C389 442 355 419 329 373C308 419 273 442 222 442C173 442 133 419 101 374C74 335 60 306 60 287C60 278 65 273 75 273C84 273 90 278 92 287C111 345 153 413 220 413C253 413 269 392 269 351C269 330 251 252 216 118C199 51 169 18 126 18C112 18 99 21 88 26C114 36 127 54 127 80C127 106 114 119 87 119C54 119 29 91 29 58C29 12 76-11 125-11C167-11 201 12 228 58C247 12 283-11 335-11C383-11 423 12 455 57C482 96 496 125 496 144C496 153 491 158 481 158C472 158 467 153 464 144C447 87 402 18 337 18C304 18 287 38 287 79C287 92 292 120 303 165L337 300C356 375 387 413 431 413C445 413 458 410 469 405C442 396 429 378 429 351C429 325 443 312 470 312C502 312 527 341 527 373Z"></path></g><g data-mml-node="TeXAtom" transform="translate(605,-150) scale(0.707)" data-latex="{t}" data-mjx-texclass="ORD"><g data-mml-node="mi" data-latex="t"><path data-c="1D461" d="M330 419C330 428 320 433 299 433L218 433C244 537 257 591 257 595C257 616 246 626 225 626C202 626 188 613 182 587L145 433L56 433C34 433 23 432 23 411C23 400 33 395 54 395L135 395C86 200 62 97 62 84C62 28 100-11 156-11C194-11 227 6 256 41C280 70 297 98 308 125C312 136 314 142 314 145C314 154 309 159 299 159C291 159 285 154 281 143C247 60 206 19 157 19C140 19 131 33 131 60C131 75 133 91 137 107L208 395L297 395C323 395 330 397 330 419Z"></path></g></g></g></g><g data-mml-node="mtd" transform="translate(4708,0)"><g data-mml-node="msub" data-latex="x_{-g}"><g data-mml-node="mi" data-latex="x"><path data-c="1D465" d="M527 373C527 419 482 442 432 442C389 442 355 419 329 373C308 419 273 442 222 442C173 442 133 419 101 374C74 335 60 306 60 287C60 278 65 273 75 273C84 273 90 278 92 287C111 345 153 413 220 413C253 413 269 392 269 351C269 330 251 252 216 118C199 51 169 18 126 18C112 18 99 21 88 26C114 36 127 54 127 80C127 106 114 119 87 119C54 119 29 91 29 58C29 12 76-11 125-11C167-11 201 12 228 58C247 12 283-11 335-11C383-11 423 12 455 57C482 96 496 125 496 144C496 153 491 158 481 158C472 158 467 153 464 144C447 87 402 18 337 18C304 18 287 38 287 79C287 92 292 120 303 165L337 300C356 375 387 413 431 413C445 413 458 410 469 405C442 396 429 378 429 351C429 325 443 312 470 312C502 312 527 341 527 373Z"></path></g><g data-mml-node="TeXAtom" transform="translate(605,-150) scale(0.707)" data-latex="{-g}" data-mjx-texclass="ORD"><g data-mml-node="mo" data-latex="-"><path data-c="2212" d="M698 270L80 270C64 270 56 263 56 250C56 237 64 230 80 230L698 230C714 230 722 237 722 250C722 262 710 270 698 270Z"></path></g><g data-mml-node="mi" data-latex="g" transform="translate(778,0)"><path data-c="1D454" d="M15-141C15-184 60-205 150-205C197-205 241-193 280-170C324-144 351-109 362-66L471 373C473 383 474 389 474 392C474 412 463 422 442 422C420 422 406 410 399 387C377 424 347 442 310 442C246 442 189 410 140 346C95 286 72 223 72 158C72 71 123-3 207-3C246-3 282 14 315 47L285-71C256-140 211-175 148-175C122-175 100-173 82-169C103-158 113-141 113-118C113-93 99-80 72-80C40-80 15-109 15-141M356 392C376 371 386 351 386 331C386 330 385 325 383 318L336 129C330 106 313 82 286 60C259 38 233 27 210 27C170 27 150 56 150 114C150 169 184 291 204 327C235 384 270 412 311 412C329 412 344 405 356 392Z"></path></g></g></g></g><g data-mml-node="mtd" transform="translate(7250.4,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g></g><g data-mml-node="mtr" transform="translate(0,827.8)"><g data-mml-node="mtd" transform="translate(41,0)"><g data-mml-node="msub" data-latex="y_{\hat{g}\times\hat{t}}"><g data-mml-node="mi" data-latex="y"><path data-c="1D466" d="M163 442C118 442 83 417 58 367C39 328 29 301 29 286C29 277 34 272 45 272C59 272 60 278 64 293C87 372 119 412 160 412C173 412 180 403 180 385C180 369 175 346 164 317C126 214 107 145 107 108C107 32 154-13 231-13C264-13 295-1 323 23C288-109 233-175 158-175C124-175 101-164 89-142C129-140 149-121 149-85C149-60 136-47 109-47C72-47 50-78 50-115C50-170 100-205 158-205C273-205 367-99 392-1L486 377C489 388 490 396 490 401C490 421 479 431 458 431C442 431 429 423 420 408C414 387 409 369 406 354L342 97C332 61 279 16 234 16C196 16 177 41 177 92C177 134 194 198 227 284C240 319 247 343 247 357C247 406 212 442 163 442Z"></path></g><g data-mml-node="TeXAtom" transform="translate(523,-360.6) scale(0.707)" data-latex="{\hat{g}\times\hat{t}}" data-mjx-texclass="ORD"><g data-mml-node="TeXAtom" data-latex="\hat{g}" data-mjx-texclass="ORD"><g data-mml-node="mover"><g data-mml-node="mi" data-latex="g"><path data-c="1D454" d="M15-141C15-184 60-205 150-205C197-205 241-193 280-170C324-144 351-109 362-66L471 373C473 383 474 389 474 392C474 412 463 422 442 422C420 422 406 410 399 387C377 424 347 442 310 442C246 442 189 410 140 346C95 286 72 223 72 158C72 71 123-3 207-3C246-3 282 14 315 47L285-71C256-140 211-175 148-175C122-175 100-173 82-169C103-158 113-141 113-118C113-93 99-80 72-80C40-80 15-109 15-141M356 392C376 371 386 351 386 331C386 330 385 325 383 318L336 129C330 106 313 82 286 60C259 38 233 27 210 27C170 27 150 56 150 114C150 169 184 291 204 327C235 384 270 412 311 412C329 412 344 405 356 392Z"></path></g><g data-mml-node="mo" transform="translate(315.5,32) translate(-250 0)"><path data-c="2C6" d="M386 515L403 533L250 694L97 533L114 515L250 618Z"></path></g></g></g><g data-mml-node="mo" data-latex="\times" transform="translate(477,0)"><path data-c="D7" d="M630 32C630 39 628 44 623 49L422 250L623 451C628 456 630 461 630 468C630 481 620 491 607 491C600 491 595 489 590 484L389 283L188 484C183 489 178 491 171 491C158 491 148 481 148 468C148 461 150 456 155 451L356 250L155 49C150 44 148 39 148 32C148 19 158 9 171 9C178 9 183 11 188 16L389 217L590 16C595 11 600 9 607 9C620 9 630 19 630 32Z"></path></g><g data-mml-node="TeXAtom" data-latex="\hat{t}" data-mjx-texclass="ORD" transform="translate(1255,0)"><g data-mml-node="mover"><g data-mml-node="mi" data-latex="t"><path data-c="1D461" d="M330 419C330 428 320 433 299 433L218 433C244 537 257 591 257 595C257 616 246 626 225 626C202 626 188 613 182 587L145 433L56 433C34 433 23 432 23 411C23 400 33 395 54 395L135 395C86 200 62 97 62 84C62 28 100-11 156-11C194-11 227 6 256 41C280 70 297 98 308 125C312 136 314 142 314 145C314 154 309 159 299 159C291 159 285 154 281 143C247 60 206 19 157 19C140 19 131 33 131 60C131 75 133 91 137 107L208 395L297 395C323 395 330 397 330 419Z"></path></g><g data-mml-node="mo" transform="translate(224.5,216) translate(-250 0)"><path data-c="2C6" d="M386 515L403 533L250 694L97 533L114 515L250 618Z"></path></g></g></g></g></g></g><g data-mml-node="mtd" transform="translate(2838.7,0)"><g data-mml-node="msub" data-latex="y_{t}"><g data-mml-node="mi" data-latex="y"><path data-c="1D466" d="M163 442C118 442 83 417 58 367C39 328 29 301 29 286C29 277 34 272 45 272C59 272 60 278 64 293C87 372 119 412 160 412C173 412 180 403 180 385C180 369 175 346 164 317C126 214 107 145 107 108C107 32 154-13 231-13C264-13 295-1 323 23C288-109 233-175 158-175C124-175 101-164 89-142C129-140 149-121 149-85C149-60 136-47 109-47C72-47 50-78 50-115C50-170 100-205 158-205C273-205 367-99 392-1L486 377C489 388 490 396 490 401C490 421 479 431 458 431C442 431 429 423 420 408C414 387 409 369 406 354L342 97C332 61 279 16 234 16C196 16 177 41 177 92C177 134 194 198 227 284C240 319 247 343 247 357C247 406 212 442 163 442Z"></path></g><g data-mml-node="TeXAtom" transform="translate(523,-150) scale(0.707)" data-latex="{t}" data-mjx-texclass="ORD"><g data-mml-node="mi" data-latex="t"><path data-c="1D461" d="M330 419C330 428 320 433 299 433L218 433C244 537 257 591 257 595C257 616 246 626 225 626C202 626 188 613 182 587L145 433L56 433C34 433 23 432 23 411C23 400 33 395 54 395L135 395C86 200 62 97 62 84C62 28 100-11 156-11C194-11 227 6 256 41C280 70 297 98 308 125C312 136 314 142 314 145C314 154 309 159 299 159C291 159 285 154 281 143C247 60 206 19 157 19C140 19 131 33 131 60C131 75 133 91 137 107L208 395L297 395C323 395 330 397 330 419Z"></path></g></g></g></g><g data-mml-node="mtd" transform="translate(4749,0)"><g data-mml-node="msub" data-latex="y_{-g}"><g data-mml-node="mi" data-latex="y"><path data-c="1D466" d="M163 442C118 442 83 417 58 367C39 328 29 301 29 286C29 277 34 272 45 272C59 272 60 278 64 293C87 372 119 412 160 412C173 412 180 403 180 385C180 369 175 346 164 317C126 214 107 145 107 108C107 32 154-13 231-13C264-13 295-1 323 23C288-109 233-175 158-175C124-175 101-164 89-142C129-140 149-121 149-85C149-60 136-47 109-47C72-47 50-78 50-115C50-170 100-205 158-205C273-205 367-99 392-1L486 377C489 388 490 396 490 401C490 421 479 431 458 431C442 431 429 423 420 408C414 387 409 369 406 354L342 97C332 61 279 16 234 16C196 16 177 41 177 92C177 134 194 198 227 284C240 319 247 343 247 357C247 406 212 442 163 442Z"></path></g><g data-mml-node="TeXAtom" transform="translate(523,-150) scale(0.707)" data-latex="{-g}" data-mjx-texclass="ORD"><g data-mml-node="mo" data-latex="-"><path data-c="2212" d="M698 270L80 270C64 270 56 263 56 250C56 237 64 230 80 230L698 230C714 230 722 237 722 250C722 262 710 270 698 270Z"></path></g><g data-mml-node="mi" data-latex="g" transform="translate(778,0)"><path data-c="1D454" d="M15-141C15-184 60-205 150-205C197-205 241-193 280-170C324-144 351-109 362-66L471 373C473 383 474 389 474 392C474 412 463 422 442 422C420 422 406 410 399 387C377 424 347 442 310 442C246 442 189 410 140 346C95 286 72 223 72 158C72 71 123-3 207-3C246-3 282 14 315 47L285-71C256-140 211-175 148-175C122-175 100-173 82-169C103-158 113-141 113-118C113-93 99-80 72-80C40-80 15-109 15-141M356 392C376 371 386 351 386 331C386 330 385 325 383 318L336 129C330 106 313 82 286 60C259 38 233 27 210 27C170 27 150 56 150 114C150 169 184 291 204 327C235 384 270 412 311 412C329 412 344 405 356 392Z"></path></g></g></g></g><g data-mml-node="mtd" transform="translate(7250.4,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g></g><g data-mml-node="mtr" transform="translate(0,-827.8)"><g data-mml-node="mtd" transform="translate(53.5,0)"><g data-mml-node="msub" data-latex="z_{\hat{g}\times\hat{t}}"><g data-mml-node="mi" data-latex="z"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="TeXAtom" transform="translate(498,-360.6) scale(0.707)" data-latex="{\hat{g}\times\hat{t}}" data-mjx-texclass="ORD"><g data-mml-node="TeXAtom" data-latex="\hat{g}" data-mjx-texclass="ORD"><g data-mml-node="mover"><g data-mml-node="mi" data-latex="g"><path data-c="1D454" d="M15-141C15-184 60-205 150-205C197-205 241-193 280-170C324-144 351-109 362-66L471 373C473 383 474 389 474 392C474 412 463 422 442 422C420 422 406 410 399 387C377 424 347 442 310 442C246 442 189 410 140 346C95 286 72 223 72 158C72 71 123-3 207-3C246-3 282 14 315 47L285-71C256-140 211-175 148-175C122-175 100-173 82-169C103-158 113-141 113-118C113-93 99-80 72-80C40-80 15-109 15-141M356 392C376 371 386 351 386 331C386 330 385 325 383 318L336 129C330 106 313 82 286 60C259 38 233 27 210 27C170 27 150 56 150 114C150 169 184 291 204 327C235 384 270 412 311 412C329 412 344 405 356 392Z"></path></g><g data-mml-node="mo" transform="translate(315.5,32) translate(-250 0)"><path data-c="2C6" d="M386 515L403 533L250 694L97 533L114 515L250 618Z"></path></g></g></g><g data-mml-node="mo" data-latex="\times" transform="translate(477,0)"><path data-c="D7" d="M630 32C630 39 628 44 623 49L422 250L623 451C628 456 630 461 630 468C630 481 620 491 607 491C600 491 595 489 590 484L389 283L188 484C183 489 178 491 171 491C158 491 148 481 148 468C148 461 150 456 155 451L356 250L155 49C150 44 148 39 148 32C148 19 158 9 171 9C178 9 183 11 188 16L389 217L590 16C595 11 600 9 607 9C620 9 630 19 630 32Z"></path></g><g data-mml-node="TeXAtom" data-latex="\hat{t}" data-mjx-texclass="ORD" transform="translate(1255,0)"><g data-mml-node="mover"><g data-mml-node="mi" data-latex="t"><path data-c="1D461" d="M330 419C330 428 320 433 299 433L218 433C244 537 257 591 257 595C257 616 246 626 225 626C202 626 188 613 182 587L145 433L56 433C34 433 23 432 23 411C23 400 33 395 54 395L135 395C86 200 62 97 62 84C62 28 100-11 156-11C194-11 227 6 256 41C280 70 297 98 308 125C312 136 314 142 314 145C314 154 309 159 299 159C291 159 285 154 281 143C247 60 206 19 157 19C140 19 131 33 131 60C131 75 133 91 137 107L208 395L297 395C323 395 330 397 330 419Z"></path></g><g data-mml-node="mo" transform="translate(224.5,216) translate(-250 0)"><path data-c="2C6" d="M386 515L403 533L250 694L97 533L114 515L250 618Z"></path></g></g></g></g></g></g><g data-mml-node="mtd" transform="translate(2851.2,0)"><g data-mml-node="msub" data-latex="z_{t}"><g data-mml-node="mi" data-latex="z"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="TeXAtom" transform="translate(498,-150) scale(0.707)" data-latex="{t}" data-mjx-texclass="ORD"><g data-mml-node="mi" data-latex="t"><path data-c="1D461" d="M330 419C330 428 320 433 299 433L218 433C244 537 257 591 257 595C257 616 246 626 225 626C202 626 188 613 182 587L145 433L56 433C34 433 23 432 23 411C23 400 33 395 54 395L135 395C86 200 62 97 62 84C62 28 100-11 156-11C194-11 227 6 256 41C280 70 297 98 308 125C312 136 314 142 314 145C314 154 309 159 299 159C291 159 285 154 281 143C247 60 206 19 157 19C140 19 131 33 131 60C131 75 133 91 137 107L208 395L297 395C323 395 330 397 330 419Z"></path></g></g></g></g><g data-mml-node="mtd" transform="translate(4761.5,0)"><g data-mml-node="msub" data-latex="z_{-g}"><g data-mml-node="mi" data-latex="z"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="TeXAtom" transform="translate(498,-150) scale(0.707)" data-latex="{-g}" data-mjx-texclass="ORD"><g data-mml-node="mo" data-latex="-"><path data-c="2212" d="M698 270L80 270C64 270 56 263 56 250C56 237 64 230 80 230L698 230C714 230 722 237 722 250C722 262 710 270 698 270Z"></path></g><g data-mml-node="mi" data-latex="g" transform="translate(778,0)"><path data-c="1D454" d="M15-141C15-184 60-205 150-205C197-205 241-193 280-170C324-144 351-109 362-66L471 373C473 383 474 389 474 392C474 412 463 422 442 422C420 422 406 410 399 387C377 424 347 442 310 442C246 442 189 410 140 346C95 286 72 223 72 158C72 71 123-3 207-3C246-3 282 14 315 47L285-71C256-140 211-175 148-175C122-175 100-173 82-169C103-158 113-141 113-118C113-93 99-80 72-80C40-80 15-109 15-141M356 392C376 371 386 351 386 331C386 330 385 325 383 318L336 129C330 106 313 82 286 60C259 38 233 27 210 27C170 27 150 56 150 114C150 169 184 291 204 327C235 384 270 412 311 412C329 412 344 405 356 392Z"></path></g></g></g></g><g data-mml-node="mtd" transform="translate(7250.4,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g></g><g data-mml-node="mtr" transform="translate(0,-2483.3)"><g data-mml-node="mtd" transform="translate(648.8,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(3002.8,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(5229.2,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(7250.4,0)"><g data-mml-node="mn" data-latex="1"><path data-c="31" d="M269 666C228 624 168 603 89 603L89 564C141 564 184 572 217 588L217 82C217 64 213 52 204 47C195 42 170 39 130 39L95 39L95 0C120 2 174 3 257 3C340 3 394 2 419 0L419 39L384 39C343 39 318 42 310 47C302 52 297 64 297 82L297 636C297 660 295 666 269 666Z"></path></g></g></g></g><g data-mml-node="mo" transform="translate(8625.4,0)"><path data-c="239E" d="M490 0L598 0L598 253C598 581 487 920 363 1150C281 1301 190 1415 91 1490C87 1493 82 1495 77 1495C60 1495 52 1487 52 1470C52 1462 55 1455 62 1450C143 1389 216 1292 283 1160C402 924 490 593 490 253Z" transform="translate(0,1738.3)"></path><path data-c="23A0" d="M598 1242L598 1495L490 1495L490 1242C490 1088 472 933 437 776C375 494 246 184 63 44C56 40 52 34 52 25C52 8 60 0 77 0C82 0 87 2 91 5C178 71 261 170 339 303C477 539 598 892 598 1242Z" transform="translate(0,-2733.3)"></path><svg width="875" height="3116.6" y="-1308.3" x="0" viewBox="0 779.2 875 3116.6"><path data-c="239F" d="M490 0L598 0L598 498L490 498Z" transform="scale(1,9.387)"></path></svg></g></g></g></g></svg></mjx-container></p></li><li><p>注意到旋转变换矩阵是正交矩阵，因此：</p><p>  <mjx-container class="MathJax" jax="SVG" overflow="overflow" display="true"><svg style="vertical-align: -5.657ex;" xmlns="http://www.w3.org/2000/svg" width="55.141ex" height="12.445ex" role="img" focusable="false" viewBox="0 -3000.2 24372.3 5500.5"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="  R_{view} = (R_{view}^{-1})^{-1} = (R_{view}^{-1})^{T} =  \begin{pmatrix}  x_{\hat{g} \times \hat{t}} &amp; y_{\hat{g} \times \hat{t}} &amp; z_{\hat{g} \times \hat{t}} &amp; 0 \\  x_{t} &amp; y_{t} &amp; z_{t} &amp; 0 \\  x_{-g} &amp; y_{-g} &amp; z_{-g} &amp; 0 \\  0 &amp; 0 &amp; 0 &amp; 1  \end{pmatrix}  "><g data-mml-node="msub" data-latex="R_{v i e w}"><g data-mml-node="mi" data-latex="R"><path data-c="1D445" d="M739 531C739 582 713 621 662 649C621 672 572 683 517 683L235 683C212 683 202 682 202 659C202 652 205 647 211 646C221 645 229 644 234 644C264 643 281 641 286 640C291 639 294 636 294 631C294 629 293 623 290 613L158 82C153 60 143 46 128 41C121 39 103 38 72 38C50 38 41 37 41 15C41 4 47-1 59 0L183 3L309 0C325-1 333 8 333 23C333 33 322 38 301 38C261 38 241 43 241 52C241 52 242 54 244 68L308 327L423 327C492 327 527 298 527 241C527 232 522 210 513 174C502 132 497 104 497 89C497 13 556-22 632-22C660-22 687-9 714 16C741 41 755 68 755 96C755 106 750 111 739 111C732 111 726 106 723 95C712 64 698 41 682 28C666 15 651 8 636 8C613 8 601 27 601 64C601 88 604 125 611 176C614 197 615 212 615 223C615 276 587 315 531 339C625 362 739 429 739 531M609 616C629 603 639 581 639 550C639 530 635 507 626 480C599 398 531 357 422 357L316 357L379 610C384 631 392 642 403 643C408 644 428 644 463 644C528 644 566 642 609 616Z"></path></g><g data-mml-node="TeXAtom" transform="translate(792,-150) scale(0.707)" data-latex="{v i e w}" data-mjx-texclass="ORD"><g data-mml-node="mi" data-latex="v"><path data-c="1D463" d="M369 391C369 383 378 370 394 350C410 330 418 307 418 281C418 252 404 203 375 134C354 86 306 18 247 18C201 18 178 45 178 100C178 139 197 208 235 307C243 328 247 345 247 357C247 407 213 442 163 442C119 442 84 417 59 367C39 326 29 300 29 287C29 278 34 273 45 273C58 273 60 279 64 293C87 373 119 413 160 413C173 413 180 404 180 385C180 369 175 347 164 318C127 219 108 152 108 115C108 64 125 29 159 10C186-4 214-11 243-11C332-11 394 85 420 162C452 256 468 325 468 369C468 418 452 442 421 442C396 442 369 416 369 391Z"></path></g><g data-mml-node="mi" data-latex="i" transform="translate(485,0)"><path data-c="1D456" d="M284 621C284 648 271 661 244 661C216 661 188 633 188 605C188 578 202 565 229 565C257 565 284 593 284 621M259 138C237 59 205 19 164 19C151 19 144 28 144 47C144 64 173 150 232 306C240 329 244 347 244 360C244 409 210 445 161 445C118 445 84 420 59 369C39 328 29 301 29 288C29 279 34 275 45 275C58 275 60 281 64 295C87 375 118 415 158 415C171 415 178 406 178 387C178 373 175 357 168 338C145 275 121 208 101 155C86 115 78 88 78 74C78 25 114-11 162-11C205-11 239 14 264 64C283 103 293 130 293 145C293 154 288 159 277 159C274 159 259 150 259 138Z"></path></g><g data-mml-node="mi" data-latex="e" transform="translate(830,0)"><path data-c="1D452" d="M124 129C124 153 129 186 139 227L188 227C253 227 303 235 339 250C372 264 394 284 405 309C412 326 415 342 415 355C415 410 363 442 307 442C268 442 229 432 190 412C113 372 46 281 46 171C46 69 105-11 204-11C257-11 304 2 345 27C379 48 404 69 420 90C427 99 430 106 430 109C430 120 425 126 414 126C409 126 404 122 398 114C365 70 324 42 277 30C246 22 223 18 206 18C149 18 124 72 124 129M375 355C375 289 311 256 182 256L147 256C166 322 194 366 232 387C262 404 287 413 307 413C343 413 375 391 375 355Z"></path></g><g data-mml-node="mi" data-latex="w" transform="translate(1296,0)"><path data-c="1D464" d="M590 391C590 382 595 372 606 362C629 340 641 313 641 281C641 264 635 237 623 198C586 78 539 18 482 18C435 18 412 45 412 100C412 119 416 142 423 171C441 243 460 314 477 387C479 394 480 398 480 401C480 421 469 431 447 431C427 431 414 421 407 401L367 245C352 187 341 167 341 115C341 107 341 101 342 98C319 45 290 18 255 18C205 18 180 47 180 104C180 141 197 204 231 293C242 323 248 344 248 357C248 406 212 442 163 442C118 442 84 417 59 367C39 328 29 301 29 287C29 278 34 273 45 273C58 273 60 279 64 293C88 373 120 413 160 413C174 413 181 403 181 384C181 369 175 347 164 317C127 220 108 154 108 117C108 32 165-11 252-11C294-11 328 10 355 53C375 10 416-11 479-11C541-11 590 30 625 112C648 164 691 302 691 369C691 384 690 394 689 399C685 418 666 442 644 442C618 442 590 417 590 391Z"></path></g></g></g><g data-mml-node="mo" data-latex="=" transform="translate(2542.5,0)"><path data-c="3D" d="M698 367L80 367C64 367 56 359 56 344C56 329 64 321 80 321L698 321C714 321 722 329 722 344C722 356 711 367 698 367M698 179L80 179C64 179 56 171 56 156C56 141 64 133 80 133L698 133C714 133 722 141 722 156C722 169 711 179 698 179Z"></path></g><g data-mml-node="mo" data-latex="(" transform="translate(3598.3,0)"><path data-c="28" d="M318-248C327-248 332-243 332-234C332-231 330-227 327-223C275-183 233-117 202-26C175 53 161 131 161 208L161 292C161 369 175 447 202 526C233 617 275 683 327 723C330 726 332 730 332 734C332 743 327 748 318 748C317 748 314 747 311 745C251 699 201 631 160 540C121 453 101 371 101 292L101 208C101 129 121 47 160-40C201-131 251-199 311-245C314-247 317-248 318-248Z"></path></g><g data-mml-node="msubsup" data-latex="R_{v i e w}^{-1}" transform="translate(3987.3,0)"><g data-mml-node="mi" data-latex="R"><path data-c="1D445" d="M739 531C739 582 713 621 662 649C621 672 572 683 517 683L235 683C212 683 202 682 202 659C202 652 205 647 211 646C221 645 229 644 234 644C264 643 281 641 286 640C291 639 294 636 294 631C294 629 293 623 290 613L158 82C153 60 143 46 128 41C121 39 103 38 72 38C50 38 41 37 41 15C41 4 47-1 59 0L183 3L309 0C325-1 333 8 333 23C333 33 322 38 301 38C261 38 241 43 241 52C241 52 242 54 244 68L308 327L423 327C492 327 527 298 527 241C527 232 522 210 513 174C502 132 497 104 497 89C497 13 556-22 632-22C660-22 687-9 714 16C741 41 755 68 755 96C755 106 750 111 739 111C732 111 726 106 723 95C712 64 698 41 682 28C666 15 651 8 636 8C613 8 601 27 601 64C601 88 604 125 611 176C614 197 615 212 615 223C615 276 587 315 531 339C625 362 739 429 739 531M609 616C629 603 639 581 639 550C639 530 635 507 626 480C599 398 531 357 422 357L316 357L379 610C384 631 392 642 403 643C408 644 428 644 463 644C528 644 566 642 609 616Z"></path></g><g data-mml-node="TeXAtom" transform="translate(792,413) scale(0.707)" data-latex="{-1}" data-mjx-texclass="ORD"><g data-mml-node="mo" data-latex="-"><path data-c="2212" d="M698 270L80 270C64 270 56 263 56 250C56 237 64 230 80 230L698 230C714 230 722 237 722 250C722 262 710 270 698 270Z"></path></g><g data-mml-node="mn" data-latex="1" transform="translate(778,0)"><path data-c="31" d="M269 666C228 624 168 603 89 603L89 564C141 564 184 572 217 588L217 82C217 64 213 52 204 47C195 42 170 39 130 39L95 39L95 0C120 2 174 3 257 3C340 3 394 2 419 0L419 39L384 39C343 39 318 42 310 47C302 52 297 64 297 82L297 636C297 660 295 666 269 666Z"></path></g></g><g data-mml-node="TeXAtom" transform="translate(792,-293.1) scale(0.707)" data-latex="{v i e w}" data-mjx-texclass="ORD"><g data-mml-node="mi" data-latex="v"><path data-c="1D463" d="M369 391C369 383 378 370 394 350C410 330 418 307 418 281C418 252 404 203 375 134C354 86 306 18 247 18C201 18 178 45 178 100C178 139 197 208 235 307C243 328 247 345 247 357C247 407 213 442 163 442C119 442 84 417 59 367C39 326 29 300 29 287C29 278 34 273 45 273C58 273 60 279 64 293C87 373 119 413 160 413C173 413 180 404 180 385C180 369 175 347 164 318C127 219 108 152 108 115C108 64 125 29 159 10C186-4 214-11 243-11C332-11 394 85 420 162C452 256 468 325 468 369C468 418 452 442 421 442C396 442 369 416 369 391Z"></path></g><g data-mml-node="mi" data-latex="i" transform="translate(485,0)"><path data-c="1D456" d="M284 621C284 648 271 661 244 661C216 661 188 633 188 605C188 578 202 565 229 565C257 565 284 593 284 621M259 138C237 59 205 19 164 19C151 19 144 28 144 47C144 64 173 150 232 306C240 329 244 347 244 360C244 409 210 445 161 445C118 445 84 420 59 369C39 328 29 301 29 288C29 279 34 275 45 275C58 275 60 281 64 295C87 375 118 415 158 415C171 415 178 406 178 387C178 373 175 357 168 338C145 275 121 208 101 155C86 115 78 88 78 74C78 25 114-11 162-11C205-11 239 14 264 64C283 103 293 130 293 145C293 154 288 159 277 159C274 159 259 150 259 138Z"></path></g><g data-mml-node="mi" data-latex="e" transform="translate(830,0)"><path data-c="1D452" d="M124 129C124 153 129 186 139 227L188 227C253 227 303 235 339 250C372 264 394 284 405 309C412 326 415 342 415 355C415 410 363 442 307 442C268 442 229 432 190 412C113 372 46 281 46 171C46 69 105-11 204-11C257-11 304 2 345 27C379 48 404 69 420 90C427 99 430 106 430 109C430 120 425 126 414 126C409 126 404 122 398 114C365 70 324 42 277 30C246 22 223 18 206 18C149 18 124 72 124 129M375 355C375 289 311 256 182 256L147 256C166 322 194 366 232 387C262 404 287 413 307 413C343 413 375 391 375 355Z"></path></g><g data-mml-node="mi" data-latex="w" transform="translate(1296,0)"><path data-c="1D464" d="M590 391C590 382 595 372 606 362C629 340 641 313 641 281C641 264 635 237 623 198C586 78 539 18 482 18C435 18 412 45 412 100C412 119 416 142 423 171C441 243 460 314 477 387C479 394 480 398 480 401C480 421 469 431 447 431C427 431 414 421 407 401L367 245C352 187 341 167 341 115C341 107 341 101 342 98C319 45 290 18 255 18C205 18 180 47 180 104C180 141 197 204 231 293C242 323 248 344 248 357C248 406 212 442 163 442C118 442 84 417 59 367C39 328 29 301 29 287C29 278 34 273 45 273C58 273 60 279 64 293C88 373 120 413 160 413C174 413 181 403 181 384C181 369 175 347 164 317C127 220 108 154 108 117C108 32 165-11 252-11C294-11 328 10 355 53C375 10 416-11 479-11C541-11 590 30 625 112C648 164 691 302 691 369C691 384 690 394 689 399C685 418 666 442 644 442C618 442 590 417 590 391Z"></path></g></g></g><g data-mml-node="msup" data-latex=")^{-1}" transform="translate(6252,0)"><g data-mml-node="mo" data-latex=")"><path data-c="29" d="M78-245C138-199 188-131 229-40C268 47 288 129 288 208L288 292C288 371 268 453 229 540C188 631 138 699 78 745C75 747 72 748 71 748C62 748 57 743 57 734C57 730 59 726 62 723C114 683 156 617 187 526C214 447 228 369 228 292L228 208C228 131 214 53 187-26C156-117 114-183 62-223C59-227 57-231 57-234C57-243 62-248 71-248C72-248 75-247 78-245Z"></path></g><g data-mml-node="TeXAtom" transform="translate(422,413) scale(0.707)" data-latex="{-1}" data-mjx-texclass="ORD"><g data-mml-node="mo" data-latex="-"><path data-c="2212" d="M698 270L80 270C64 270 56 263 56 250C56 237 64 230 80 230L698 230C714 230 722 237 722 250C722 262 710 270 698 270Z"></path></g><g data-mml-node="mn" data-latex="1" transform="translate(778,0)"><path data-c="31" d="M269 666C228 624 168 603 89 603L89 564C141 564 184 572 217 588L217 82C217 64 213 52 204 47C195 42 170 39 130 39L95 39L95 0C120 2 174 3 257 3C340 3 394 2 419 0L419 39L384 39C343 39 318 42 310 47C302 52 297 64 297 82L297 636C297 660 295 666 269 666Z"></path></g></g></g><g data-mml-node="mo" data-latex="=" transform="translate(7905.4,0)"><path data-c="3D" d="M698 367L80 367C64 367 56 359 56 344C56 329 64 321 80 321L698 321C714 321 722 329 722 344C722 356 711 367 698 367M698 179L80 179C64 179 56 171 56 156C56 141 64 133 80 133L698 133C714 133 722 141 722 156C722 169 711 179 698 179Z"></path></g><g data-mml-node="mo" data-latex="(" transform="translate(8961.2,0)"><path data-c="28" d="M318-248C327-248 332-243 332-234C332-231 330-227 327-223C275-183 233-117 202-26C175 53 161 131 161 208L161 292C161 369 175 447 202 526C233 617 275 683 327 723C330 726 332 730 332 734C332 743 327 748 318 748C317 748 314 747 311 745C251 699 201 631 160 540C121 453 101 371 101 292L101 208C101 129 121 47 160-40C201-131 251-199 311-245C314-247 317-248 318-248Z"></path></g><g data-mml-node="msubsup" data-latex="R_{v i e w}^{-1}" transform="translate(9350.2,0)"><g data-mml-node="mi" data-latex="R"><path data-c="1D445" d="M739 531C739 582 713 621 662 649C621 672 572 683 517 683L235 683C212 683 202 682 202 659C202 652 205 647 211 646C221 645 229 644 234 644C264 643 281 641 286 640C291 639 294 636 294 631C294 629 293 623 290 613L158 82C153 60 143 46 128 41C121 39 103 38 72 38C50 38 41 37 41 15C41 4 47-1 59 0L183 3L309 0C325-1 333 8 333 23C333 33 322 38 301 38C261 38 241 43 241 52C241 52 242 54 244 68L308 327L423 327C492 327 527 298 527 241C527 232 522 210 513 174C502 132 497 104 497 89C497 13 556-22 632-22C660-22 687-9 714 16C741 41 755 68 755 96C755 106 750 111 739 111C732 111 726 106 723 95C712 64 698 41 682 28C666 15 651 8 636 8C613 8 601 27 601 64C601 88 604 125 611 176C614 197 615 212 615 223C615 276 587 315 531 339C625 362 739 429 739 531M609 616C629 603 639 581 639 550C639 530 635 507 626 480C599 398 531 357 422 357L316 357L379 610C384 631 392 642 403 643C408 644 428 644 463 644C528 644 566 642 609 616Z"></path></g><g data-mml-node="TeXAtom" transform="translate(792,413) scale(0.707)" data-latex="{-1}" data-mjx-texclass="ORD"><g data-mml-node="mo" data-latex="-"><path data-c="2212" d="M698 270L80 270C64 270 56 263 56 250C56 237 64 230 80 230L698 230C714 230 722 237 722 250C722 262 710 270 698 270Z"></path></g><g data-mml-node="mn" data-latex="1" transform="translate(778,0)"><path data-c="31" d="M269 666C228 624 168 603 89 603L89 564C141 564 184 572 217 588L217 82C217 64 213 52 204 47C195 42 170 39 130 39L95 39L95 0C120 2 174 3 257 3C340 3 394 2 419 0L419 39L384 39C343 39 318 42 310 47C302 52 297 64 297 82L297 636C297 660 295 666 269 666Z"></path></g></g><g data-mml-node="TeXAtom" transform="translate(792,-293.1) scale(0.707)" data-latex="{v i e w}" data-mjx-texclass="ORD"><g data-mml-node="mi" data-latex="v"><path data-c="1D463" d="M369 391C369 383 378 370 394 350C410 330 418 307 418 281C418 252 404 203 375 134C354 86 306 18 247 18C201 18 178 45 178 100C178 139 197 208 235 307C243 328 247 345 247 357C247 407 213 442 163 442C119 442 84 417 59 367C39 326 29 300 29 287C29 278 34 273 45 273C58 273 60 279 64 293C87 373 119 413 160 413C173 413 180 404 180 385C180 369 175 347 164 318C127 219 108 152 108 115C108 64 125 29 159 10C186-4 214-11 243-11C332-11 394 85 420 162C452 256 468 325 468 369C468 418 452 442 421 442C396 442 369 416 369 391Z"></path></g><g data-mml-node="mi" data-latex="i" transform="translate(485,0)"><path data-c="1D456" d="M284 621C284 648 271 661 244 661C216 661 188 633 188 605C188 578 202 565 229 565C257 565 284 593 284 621M259 138C237 59 205 19 164 19C151 19 144 28 144 47C144 64 173 150 232 306C240 329 244 347 244 360C244 409 210 445 161 445C118 445 84 420 59 369C39 328 29 301 29 288C29 279 34 275 45 275C58 275 60 281 64 295C87 375 118 415 158 415C171 415 178 406 178 387C178 373 175 357 168 338C145 275 121 208 101 155C86 115 78 88 78 74C78 25 114-11 162-11C205-11 239 14 264 64C283 103 293 130 293 145C293 154 288 159 277 159C274 159 259 150 259 138Z"></path></g><g data-mml-node="mi" data-latex="e" transform="translate(830,0)"><path data-c="1D452" d="M124 129C124 153 129 186 139 227L188 227C253 227 303 235 339 250C372 264 394 284 405 309C412 326 415 342 415 355C415 410 363 442 307 442C268 442 229 432 190 412C113 372 46 281 46 171C46 69 105-11 204-11C257-11 304 2 345 27C379 48 404 69 420 90C427 99 430 106 430 109C430 120 425 126 414 126C409 126 404 122 398 114C365 70 324 42 277 30C246 22 223 18 206 18C149 18 124 72 124 129M375 355C375 289 311 256 182 256L147 256C166 322 194 366 232 387C262 404 287 413 307 413C343 413 375 391 375 355Z"></path></g><g data-mml-node="mi" data-latex="w" transform="translate(1296,0)"><path data-c="1D464" d="M590 391C590 382 595 372 606 362C629 340 641 313 641 281C641 264 635 237 623 198C586 78 539 18 482 18C435 18 412 45 412 100C412 119 416 142 423 171C441 243 460 314 477 387C479 394 480 398 480 401C480 421 469 431 447 431C427 431 414 421 407 401L367 245C352 187 341 167 341 115C341 107 341 101 342 98C319 45 290 18 255 18C205 18 180 47 180 104C180 141 197 204 231 293C242 323 248 344 248 357C248 406 212 442 163 442C118 442 84 417 59 367C39 328 29 301 29 287C29 278 34 273 45 273C58 273 60 279 64 293C88 373 120 413 160 413C174 413 181 403 181 384C181 369 175 347 164 317C127 220 108 154 108 117C108 32 165-11 252-11C294-11 328 10 355 53C375 10 416-11 479-11C541-11 590 30 625 112C648 164 691 302 691 369C691 384 690 394 689 399C685 418 666 442 644 442C618 442 590 417 590 391Z"></path></g></g></g><g data-mml-node="msup" data-latex=")^{T}" transform="translate(11614.9,0)"><g data-mml-node="mo" data-latex=")"><path data-c="29" d="M78-245C138-199 188-131 229-40C268 47 288 129 288 208L288 292C288 371 268 453 229 540C188 631 138 699 78 745C75 747 72 748 71 748C62 748 57 743 57 734C57 730 59 726 62 723C114 683 156 617 187 526C214 447 228 369 228 292L228 208C228 131 214 53 187-26C156-117 114-183 62-223C59-227 57-231 57-234C57-243 62-248 71-248C72-248 75-247 78-245Z"></path></g><g data-mml-node="TeXAtom" transform="translate(422,413) scale(0.707)" data-latex="{T}" data-mjx-texclass="ORD"><g data-mml-node="mi" data-latex="T"><path data-c="1D447" d="M344 631C344 628 343 621 340 611L208 83C204 68 200 59 197 55C188 44 154 39 94 39C63 39 49 42 49 16C49 5 56 0 69 0C120 0 192 4 235 3L317 2C331 2 386 0 403 0C420 0 428 8 428 24C428 34 416 39 391 39C339 39 309 41 300 46C297 48 295 52 295 58L430 603C433 617 436 626 439 629C443 635 467 638 511 638C566 638 604 634 623 625C642 616 652 595 652 561C652 543 649 517 644 483C642 475 641 469 641 464C641 453 646 447 657 447C666 447 672 456 675 473L702 645C703 650 704 656 704 662C704 672 694 677 673 677L125 677C99 677 97 674 89 655L30 481C27 472 25 466 24 462C24 452 29 447 40 447C48 447 55 455 60 470C85 543 110 588 133 607C159 628 209 638 282 638L321 638C332 638 344 639 344 631Z"></path></g></g></g><g data-mml-node="mo" data-latex="=" transform="translate(12862.5,0)"><path data-c="3D" d="M698 367L80 367C64 367 56 359 56 344C56 329 64 321 80 321L698 321C714 321 722 329 722 344C722 356 711 367 698 367M698 179L80 179C64 179 56 171 56 156C56 141 64 133 80 133L698 133C714 133 722 141 722 156C722 169 711 179 698 179Z"></path></g><g data-mml-node="mrow" data-latex="{pmatrix}" transform="translate(13918.2,0)"><g data-mml-node="mo"><path data-c="239B" d="M813 1450C820 1455 823 1462 823 1470C823 1487 815 1495 798 1495C793 1495 788 1493 784 1490C697 1423 614 1324 536 1192C399 956 277 603 277 253L277 0L385 0L385 253C385 407 403 562 438 719C500 999 630 1313 813 1450Z" transform="translate(0,1505.2)"></path><path data-c="239D" d="M798 0C815 0 823 8 823 25C823 34 819 40 812 44C731 106 658 202 592 334C474 569 385 903 385 1242L385 1495L277 1495L277 1242C277 914 388 575 512 345C594 193 685 80 784 5C788 2 793 0 798 0Z" transform="translate(0,-2500.2)"></path><svg width="875" height="2650.5" y="-1075.2" x="0" viewBox="0 662.6 875 2650.5"><path data-c="239C" d="M277 0L385 0L385 498L277 498Z" transform="scale(1,7.983)"></path></svg></g><g data-mml-node="mtable" transform="translate(875,0)"><g data-mml-node="mtr" transform="translate(0,2250.2)"><g data-mml-node="mtd"><g data-mml-node="msub" data-latex="x_{\hat{g}\times\hat{t}}"><g data-mml-node="mi" data-latex="x"><path data-c="1D465" d="M527 373C527 419 482 442 432 442C389 442 355 419 329 373C308 419 273 442 222 442C173 442 133 419 101 374C74 335 60 306 60 287C60 278 65 273 75 273C84 273 90 278 92 287C111 345 153 413 220 413C253 413 269 392 269 351C269 330 251 252 216 118C199 51 169 18 126 18C112 18 99 21 88 26C114 36 127 54 127 80C127 106 114 119 87 119C54 119 29 91 29 58C29 12 76-11 125-11C167-11 201 12 228 58C247 12 283-11 335-11C383-11 423 12 455 57C482 96 496 125 496 144C496 153 491 158 481 158C472 158 467 153 464 144C447 87 402 18 337 18C304 18 287 38 287 79C287 92 292 120 303 165L337 300C356 375 387 413 431 413C445 413 458 410 469 405C442 396 429 378 429 351C429 325 443 312 470 312C502 312 527 341 527 373Z"></path></g><g data-mml-node="TeXAtom" transform="translate(605,-360.6) scale(0.707)" data-latex="{\hat{g}\times\hat{t}}" data-mjx-texclass="ORD"><g data-mml-node="TeXAtom" data-latex="\hat{g}" data-mjx-texclass="ORD"><g data-mml-node="mover"><g data-mml-node="mi" data-latex="g"><path data-c="1D454" d="M15-141C15-184 60-205 150-205C197-205 241-193 280-170C324-144 351-109 362-66L471 373C473 383 474 389 474 392C474 412 463 422 442 422C420 422 406 410 399 387C377 424 347 442 310 442C246 442 189 410 140 346C95 286 72 223 72 158C72 71 123-3 207-3C246-3 282 14 315 47L285-71C256-140 211-175 148-175C122-175 100-173 82-169C103-158 113-141 113-118C113-93 99-80 72-80C40-80 15-109 15-141M356 392C376 371 386 351 386 331C386 330 385 325 383 318L336 129C330 106 313 82 286 60C259 38 233 27 210 27C170 27 150 56 150 114C150 169 184 291 204 327C235 384 270 412 311 412C329 412 344 405 356 392Z"></path></g><g data-mml-node="mo" transform="translate(315.5,32) translate(-250 0)"><path data-c="2C6" d="M386 515L403 533L250 694L97 533L114 515L250 618Z"></path></g></g></g><g data-mml-node="mo" data-latex="\times" transform="translate(477,0)"><path data-c="D7" d="M630 32C630 39 628 44 623 49L422 250L623 451C628 456 630 461 630 468C630 481 620 491 607 491C600 491 595 489 590 484L389 283L188 484C183 489 178 491 171 491C158 491 148 481 148 468C148 461 150 456 155 451L356 250L155 49C150 44 148 39 148 32C148 19 158 9 171 9C178 9 183 11 188 16L389 217L590 16C595 11 600 9 607 9C620 9 630 19 630 32Z"></path></g><g data-mml-node="TeXAtom" data-latex="\hat{t}" data-mjx-texclass="ORD" transform="translate(1255,0)"><g data-mml-node="mover"><g data-mml-node="mi" data-latex="t"><path data-c="1D461" d="M330 419C330 428 320 433 299 433L218 433C244 537 257 591 257 595C257 616 246 626 225 626C202 626 188 613 182 587L145 433L56 433C34 433 23 432 23 411C23 400 33 395 54 395L135 395C86 200 62 97 62 84C62 28 100-11 156-11C194-11 227 6 256 41C280 70 297 98 308 125C312 136 314 142 314 145C314 154 309 159 299 159C291 159 285 154 281 143C247 60 206 19 157 19C140 19 131 33 131 60C131 75 133 91 137 107L208 395L297 395C323 395 330 397 330 419Z"></path></g><g data-mml-node="mo" transform="translate(224.5,216) translate(-250 0)"><path data-c="2C6" d="M386 515L403 533L250 694L97 533L114 515L250 618Z"></path></g></g></g></g></g></g><g data-mml-node="mtd" transform="translate(2797.7,0)"><g data-mml-node="msub" data-latex="y_{\hat{g}\times\hat{t}}"><g data-mml-node="mi" data-latex="y"><path data-c="1D466" d="M163 442C118 442 83 417 58 367C39 328 29 301 29 286C29 277 34 272 45 272C59 272 60 278 64 293C87 372 119 412 160 412C173 412 180 403 180 385C180 369 175 346 164 317C126 214 107 145 107 108C107 32 154-13 231-13C264-13 295-1 323 23C288-109 233-175 158-175C124-175 101-164 89-142C129-140 149-121 149-85C149-60 136-47 109-47C72-47 50-78 50-115C50-170 100-205 158-205C273-205 367-99 392-1L486 377C489 388 490 396 490 401C490 421 479 431 458 431C442 431 429 423 420 408C414 387 409 369 406 354L342 97C332 61 279 16 234 16C196 16 177 41 177 92C177 134 194 198 227 284C240 319 247 343 247 357C247 406 212 442 163 442Z"></path></g><g data-mml-node="TeXAtom" transform="translate(523,-360.6) scale(0.707)" data-latex="{\hat{g}\times\hat{t}}" data-mjx-texclass="ORD"><g data-mml-node="TeXAtom" data-latex="\hat{g}" data-mjx-texclass="ORD"><g data-mml-node="mover"><g data-mml-node="mi" data-latex="g"><path data-c="1D454" d="M15-141C15-184 60-205 150-205C197-205 241-193 280-170C324-144 351-109 362-66L471 373C473 383 474 389 474 392C474 412 463 422 442 422C420 422 406 410 399 387C377 424 347 442 310 442C246 442 189 410 140 346C95 286 72 223 72 158C72 71 123-3 207-3C246-3 282 14 315 47L285-71C256-140 211-175 148-175C122-175 100-173 82-169C103-158 113-141 113-118C113-93 99-80 72-80C40-80 15-109 15-141M356 392C376 371 386 351 386 331C386 330 385 325 383 318L336 129C330 106 313 82 286 60C259 38 233 27 210 27C170 27 150 56 150 114C150 169 184 291 204 327C235 384 270 412 311 412C329 412 344 405 356 392Z"></path></g><g data-mml-node="mo" transform="translate(315.5,32) translate(-250 0)"><path data-c="2C6" d="M386 515L403 533L250 694L97 533L114 515L250 618Z"></path></g></g></g><g data-mml-node="mo" data-latex="\times" transform="translate(477,0)"><path data-c="D7" d="M630 32C630 39 628 44 623 49L422 250L623 451C628 456 630 461 630 468C630 481 620 491 607 491C600 491 595 489 590 484L389 283L188 484C183 489 178 491 171 491C158 491 148 481 148 468C148 461 150 456 155 451L356 250L155 49C150 44 148 39 148 32C148 19 158 9 171 9C178 9 183 11 188 16L389 217L590 16C595 11 600 9 607 9C620 9 630 19 630 32Z"></path></g><g data-mml-node="TeXAtom" data-latex="\hat{t}" data-mjx-texclass="ORD" transform="translate(1255,0)"><g data-mml-node="mover"><g data-mml-node="mi" data-latex="t"><path data-c="1D461" d="M330 419C330 428 320 433 299 433L218 433C244 537 257 591 257 595C257 616 246 626 225 626C202 626 188 613 182 587L145 433L56 433C34 433 23 432 23 411C23 400 33 395 54 395L135 395C86 200 62 97 62 84C62 28 100-11 156-11C194-11 227 6 256 41C280 70 297 98 308 125C312 136 314 142 314 145C314 154 309 159 299 159C291 159 285 154 281 143C247 60 206 19 157 19C140 19 131 33 131 60C131 75 133 91 137 107L208 395L297 395C323 395 330 397 330 419Z"></path></g><g data-mml-node="mo" transform="translate(224.5,216) translate(-250 0)"><path data-c="2C6" d="M386 515L403 533L250 694L97 533L114 515L250 618Z"></path></g></g></g></g></g></g><g data-mml-node="mtd" transform="translate(5513.4,0)"><g data-mml-node="msub" data-latex="z_{\hat{g}\times\hat{t}}"><g data-mml-node="mi" data-latex="z"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="TeXAtom" transform="translate(498,-360.6) scale(0.707)" data-latex="{\hat{g}\times\hat{t}}" data-mjx-texclass="ORD"><g data-mml-node="TeXAtom" data-latex="\hat{g}" data-mjx-texclass="ORD"><g data-mml-node="mover"><g data-mml-node="mi" data-latex="g"><path data-c="1D454" d="M15-141C15-184 60-205 150-205C197-205 241-193 280-170C324-144 351-109 362-66L471 373C473 383 474 389 474 392C474 412 463 422 442 422C420 422 406 410 399 387C377 424 347 442 310 442C246 442 189 410 140 346C95 286 72 223 72 158C72 71 123-3 207-3C246-3 282 14 315 47L285-71C256-140 211-175 148-175C122-175 100-173 82-169C103-158 113-141 113-118C113-93 99-80 72-80C40-80 15-109 15-141M356 392C376 371 386 351 386 331C386 330 385 325 383 318L336 129C330 106 313 82 286 60C259 38 233 27 210 27C170 27 150 56 150 114C150 169 184 291 204 327C235 384 270 412 311 412C329 412 344 405 356 392Z"></path></g><g data-mml-node="mo" transform="translate(315.5,32) translate(-250 0)"><path data-c="2C6" d="M386 515L403 533L250 694L97 533L114 515L250 618Z"></path></g></g></g><g data-mml-node="mo" data-latex="\times" transform="translate(477,0)"><path data-c="D7" d="M630 32C630 39 628 44 623 49L422 250L623 451C628 456 630 461 630 468C630 481 620 491 607 491C600 491 595 489 590 484L389 283L188 484C183 489 178 491 171 491C158 491 148 481 148 468C148 461 150 456 155 451L356 250L155 49C150 44 148 39 148 32C148 19 158 9 171 9C178 9 183 11 188 16L389 217L590 16C595 11 600 9 607 9C620 9 630 19 630 32Z"></path></g><g data-mml-node="TeXAtom" data-latex="\hat{t}" data-mjx-texclass="ORD" transform="translate(1255,0)"><g data-mml-node="mover"><g data-mml-node="mi" data-latex="t"><path data-c="1D461" d="M330 419C330 428 320 433 299 433L218 433C244 537 257 591 257 595C257 616 246 626 225 626C202 626 188 613 182 587L145 433L56 433C34 433 23 432 23 411C23 400 33 395 54 395L135 395C86 200 62 97 62 84C62 28 100-11 156-11C194-11 227 6 256 41C280 70 297 98 308 125C312 136 314 142 314 145C314 154 309 159 299 159C291 159 285 154 281 143C247 60 206 19 157 19C140 19 131 33 131 60C131 75 133 91 137 107L208 395L297 395C323 395 330 397 330 419Z"></path></g><g data-mml-node="mo" transform="translate(224.5,216) translate(-250 0)"><path data-c="2C6" d="M386 515L403 533L250 694L97 533L114 515L250 618Z"></path></g></g></g></g></g></g><g data-mml-node="mtd" transform="translate(8204.1,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g></g><g data-mml-node="mtr" transform="translate(0,594.7)"><g data-mml-node="mtd" transform="translate(443.7,0)"><g data-mml-node="msub" data-latex="x_{t}"><g data-mml-node="mi" data-latex="x"><path data-c="1D465" d="M527 373C527 419 482 442 432 442C389 442 355 419 329 373C308 419 273 442 222 442C173 442 133 419 101 374C74 335 60 306 60 287C60 278 65 273 75 273C84 273 90 278 92 287C111 345 153 413 220 413C253 413 269 392 269 351C269 330 251 252 216 118C199 51 169 18 126 18C112 18 99 21 88 26C114 36 127 54 127 80C127 106 114 119 87 119C54 119 29 91 29 58C29 12 76-11 125-11C167-11 201 12 228 58C247 12 283-11 335-11C383-11 423 12 455 57C482 96 496 125 496 144C496 153 491 158 481 158C472 158 467 153 464 144C447 87 402 18 337 18C304 18 287 38 287 79C287 92 292 120 303 165L337 300C356 375 387 413 431 413C445 413 458 410 469 405C442 396 429 378 429 351C429 325 443 312 470 312C502 312 527 341 527 373Z"></path></g><g data-mml-node="TeXAtom" transform="translate(605,-150) scale(0.707)" data-latex="{t}" data-mjx-texclass="ORD"><g data-mml-node="mi" data-latex="t"><path data-c="1D461" d="M330 419C330 428 320 433 299 433L218 433C244 537 257 591 257 595C257 616 246 626 225 626C202 626 188 613 182 587L145 433L56 433C34 433 23 432 23 411C23 400 33 395 54 395L135 395C86 200 62 97 62 84C62 28 100-11 156-11C194-11 227 6 256 41C280 70 297 98 308 125C312 136 314 142 314 145C314 154 309 159 299 159C291 159 285 154 281 143C247 60 206 19 157 19C140 19 131 33 131 60C131 75 133 91 137 107L208 395L297 395C323 395 330 397 330 419Z"></path></g></g></g></g><g data-mml-node="mtd" transform="translate(3241.4,0)"><g data-mml-node="msub" data-latex="y_{t}"><g data-mml-node="mi" data-latex="y"><path data-c="1D466" d="M163 442C118 442 83 417 58 367C39 328 29 301 29 286C29 277 34 272 45 272C59 272 60 278 64 293C87 372 119 412 160 412C173 412 180 403 180 385C180 369 175 346 164 317C126 214 107 145 107 108C107 32 154-13 231-13C264-13 295-1 323 23C288-109 233-175 158-175C124-175 101-164 89-142C129-140 149-121 149-85C149-60 136-47 109-47C72-47 50-78 50-115C50-170 100-205 158-205C273-205 367-99 392-1L486 377C489 388 490 396 490 401C490 421 479 431 458 431C442 431 429 423 420 408C414 387 409 369 406 354L342 97C332 61 279 16 234 16C196 16 177 41 177 92C177 134 194 198 227 284C240 319 247 343 247 357C247 406 212 442 163 442Z"></path></g><g data-mml-node="TeXAtom" transform="translate(523,-150) scale(0.707)" data-latex="{t}" data-mjx-texclass="ORD"><g data-mml-node="mi" data-latex="t"><path data-c="1D461" d="M330 419C330 428 320 433 299 433L218 433C244 537 257 591 257 595C257 616 246 626 225 626C202 626 188 613 182 587L145 433L56 433C34 433 23 432 23 411C23 400 33 395 54 395L135 395C86 200 62 97 62 84C62 28 100-11 156-11C194-11 227 6 256 41C280 70 297 98 308 125C312 136 314 142 314 145C314 154 309 159 299 159C291 159 285 154 281 143C247 60 206 19 157 19C140 19 131 33 131 60C131 75 133 91 137 107L208 395L297 395C323 395 330 397 330 419Z"></path></g></g></g></g><g data-mml-node="mtd" transform="translate(5957.1,0)"><g data-mml-node="msub" data-latex="z_{t}"><g data-mml-node="mi" data-latex="z"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="TeXAtom" transform="translate(498,-150) scale(0.707)" data-latex="{t}" data-mjx-texclass="ORD"><g data-mml-node="mi" data-latex="t"><path data-c="1D461" d="M330 419C330 428 320 433 299 433L218 433C244 537 257 591 257 595C257 616 246 626 225 626C202 626 188 613 182 587L145 433L56 433C34 433 23 432 23 411C23 400 33 395 54 395L135 395C86 200 62 97 62 84C62 28 100-11 156-11C194-11 227 6 256 41C280 70 297 98 308 125C312 136 314 142 314 145C314 154 309 159 299 159C291 159 285 154 281 143C247 60 206 19 157 19C140 19 131 33 131 60C131 75 133 91 137 107L208 395L297 395C323 395 330 397 330 419Z"></path></g></g></g></g><g data-mml-node="mtd" transform="translate(8204.1,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g></g><g data-mml-node="mtr" transform="translate(0,-805.3)"><g data-mml-node="mtd" transform="translate(127.6,0)"><g data-mml-node="msub" data-latex="x_{-g}"><g data-mml-node="mi" data-latex="x"><path data-c="1D465" d="M527 373C527 419 482 442 432 442C389 442 355 419 329 373C308 419 273 442 222 442C173 442 133 419 101 374C74 335 60 306 60 287C60 278 65 273 75 273C84 273 90 278 92 287C111 345 153 413 220 413C253 413 269 392 269 351C269 330 251 252 216 118C199 51 169 18 126 18C112 18 99 21 88 26C114 36 127 54 127 80C127 106 114 119 87 119C54 119 29 91 29 58C29 12 76-11 125-11C167-11 201 12 228 58C247 12 283-11 335-11C383-11 423 12 455 57C482 96 496 125 496 144C496 153 491 158 481 158C472 158 467 153 464 144C447 87 402 18 337 18C304 18 287 38 287 79C287 92 292 120 303 165L337 300C356 375 387 413 431 413C445 413 458 410 469 405C442 396 429 378 429 351C429 325 443 312 470 312C502 312 527 341 527 373Z"></path></g><g data-mml-node="TeXAtom" transform="translate(605,-150) scale(0.707)" data-latex="{-g}" data-mjx-texclass="ORD"><g data-mml-node="mo" data-latex="-"><path data-c="2212" d="M698 270L80 270C64 270 56 263 56 250C56 237 64 230 80 230L698 230C714 230 722 237 722 250C722 262 710 270 698 270Z"></path></g><g data-mml-node="mi" data-latex="g" transform="translate(778,0)"><path data-c="1D454" d="M15-141C15-184 60-205 150-205C197-205 241-193 280-170C324-144 351-109 362-66L471 373C473 383 474 389 474 392C474 412 463 422 442 422C420 422 406 410 399 387C377 424 347 442 310 442C246 442 189 410 140 346C95 286 72 223 72 158C72 71 123-3 207-3C246-3 282 14 315 47L285-71C256-140 211-175 148-175C122-175 100-173 82-169C103-158 113-141 113-118C113-93 99-80 72-80C40-80 15-109 15-141M356 392C376 371 386 351 386 331C386 330 385 325 383 318L336 129C330 106 313 82 286 60C259 38 233 27 210 27C170 27 150 56 150 114C150 169 184 291 204 327C235 384 270 412 311 412C329 412 344 405 356 392Z"></path></g></g></g></g><g data-mml-node="mtd" transform="translate(2925.3,0)"><g data-mml-node="msub" data-latex="y_{-g}"><g data-mml-node="mi" data-latex="y"><path data-c="1D466" d="M163 442C118 442 83 417 58 367C39 328 29 301 29 286C29 277 34 272 45 272C59 272 60 278 64 293C87 372 119 412 160 412C173 412 180 403 180 385C180 369 175 346 164 317C126 214 107 145 107 108C107 32 154-13 231-13C264-13 295-1 323 23C288-109 233-175 158-175C124-175 101-164 89-142C129-140 149-121 149-85C149-60 136-47 109-47C72-47 50-78 50-115C50-170 100-205 158-205C273-205 367-99 392-1L486 377C489 388 490 396 490 401C490 421 479 431 458 431C442 431 429 423 420 408C414 387 409 369 406 354L342 97C332 61 279 16 234 16C196 16 177 41 177 92C177 134 194 198 227 284C240 319 247 343 247 357C247 406 212 442 163 442Z"></path></g><g data-mml-node="TeXAtom" transform="translate(523,-150) scale(0.707)" data-latex="{-g}" data-mjx-texclass="ORD"><g data-mml-node="mo" data-latex="-"><path data-c="2212" d="M698 270L80 270C64 270 56 263 56 250C56 237 64 230 80 230L698 230C714 230 722 237 722 250C722 262 710 270 698 270Z"></path></g><g data-mml-node="mi" data-latex="g" transform="translate(778,0)"><path data-c="1D454" d="M15-141C15-184 60-205 150-205C197-205 241-193 280-170C324-144 351-109 362-66L471 373C473 383 474 389 474 392C474 412 463 422 442 422C420 422 406 410 399 387C377 424 347 442 310 442C246 442 189 410 140 346C95 286 72 223 72 158C72 71 123-3 207-3C246-3 282 14 315 47L285-71C256-140 211-175 148-175C122-175 100-173 82-169C103-158 113-141 113-118C113-93 99-80 72-80C40-80 15-109 15-141M356 392C376 371 386 351 386 331C386 330 385 325 383 318L336 129C330 106 313 82 286 60C259 38 233 27 210 27C170 27 150 56 150 114C150 169 184 291 204 327C235 384 270 412 311 412C329 412 344 405 356 392Z"></path></g></g></g></g><g data-mml-node="mtd" transform="translate(5641,0)"><g data-mml-node="msub" data-latex="z_{-g}"><g data-mml-node="mi" data-latex="z"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="TeXAtom" transform="translate(498,-150) scale(0.707)" data-latex="{-g}" data-mjx-texclass="ORD"><g data-mml-node="mo" data-latex="-"><path data-c="2212" d="M698 270L80 270C64 270 56 263 56 250C56 237 64 230 80 230L698 230C714 230 722 237 722 250C722 262 710 270 698 270Z"></path></g><g data-mml-node="mi" data-latex="g" transform="translate(778,0)"><path data-c="1D454" d="M15-141C15-184 60-205 150-205C197-205 241-193 280-170C324-144 351-109 362-66L471 373C473 383 474 389 474 392C474 412 463 422 442 422C420 422 406 410 399 387C377 424 347 442 310 442C246 442 189 410 140 346C95 286 72 223 72 158C72 71 123-3 207-3C246-3 282 14 315 47L285-71C256-140 211-175 148-175C122-175 100-173 82-169C103-158 113-141 113-118C113-93 99-80 72-80C40-80 15-109 15-141M356 392C376 371 386 351 386 331C386 330 385 325 383 318L336 129C330 106 313 82 286 60C259 38 233 27 210 27C170 27 150 56 150 114C150 169 184 291 204 327C235 384 270 412 311 412C329 412 344 405 356 392Z"></path></g></g></g></g><g data-mml-node="mtd" transform="translate(8204.1,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g></g><g data-mml-node="mtr" transform="translate(0,-2250.2)"><g data-mml-node="mtd" transform="translate(648.8,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(3405.5,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(6108.7,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(8204.1,0)"><g data-mml-node="mn" data-latex="1"><path data-c="31" d="M269 666C228 624 168 603 89 603L89 564C141 564 184 572 217 588L217 82C217 64 213 52 204 47C195 42 170 39 130 39L95 39L95 0C120 2 174 3 257 3C340 3 394 2 419 0L419 39L384 39C343 39 318 42 310 47C302 52 297 64 297 82L297 636C297 660 295 666 269 666Z"></path></g></g></g></g><g data-mml-node="mo" transform="translate(9579.1,0)"><path data-c="239E" d="M490 0L598 0L598 253C598 581 487 920 363 1150C281 1301 190 1415 91 1490C87 1493 82 1495 77 1495C60 1495 52 1487 52 1470C52 1462 55 1455 62 1450C143 1389 216 1292 283 1160C402 924 490 593 490 253Z" transform="translate(0,1505.2)"></path><path data-c="23A0" d="M598 1242L598 1495L490 1495L490 1242C490 1088 472 933 437 776C375 494 246 184 63 44C56 40 52 34 52 25C52 8 60 0 77 0C82 0 87 2 91 5C178 71 261 170 339 303C477 539 598 892 598 1242Z" transform="translate(0,-2500.2)"></path><svg width="875" height="2650.5" y="-1075.2" x="0" viewBox="0 662.6 875 2650.5"><path data-c="239F" d="M490 0L598 0L598 498L490 498Z" transform="scale(1,7.983)"></path></svg></g></g></g></g></svg></mjx-container></p></li></ul><div class="callout callout--titled info mb-4 rounded-small shadow-redefine-flat bg-(--callout-bg-color) p-3 pl-1 relative flex flex-row gap-2"><div role="none" class="rounded-full self-stretch w-0.5 bg-(--callout-primary-color) shrink-0 opacity-60"></div><div class="flex flex-col gap-2"><div class="callout__title flex items-center gap-2 font-semibold tracking-tight"><i class="callout__icon fa-solid leading-none text-(--callout-primary-color) text-sm shrink-0"></i> TODO</div><div class="callout__content markdown-body flex-1 min-w-0"><p>为什么旋转变换矩阵一定是正交矩阵？</p></div></div></div><ul><li><p>当然，还有平移变换矩阵：</p><p>  <mjx-container class="MathJax" jax="SVG" overflow="overflow" display="true"><svg style="vertical-align: -5.368ex;" xmlns="http://www.w3.org/2000/svg" width="25.803ex" height="11.866ex" role="img" focusable="false" viewBox="0 -2872.5 11404.7 5245"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="  T_{view} =  \begin{pmatrix}  1 &amp; 0 &amp; 0 &amp; -e_{x} \\  0 &amp; 1 &amp; 0 &amp; -e_{y} \\  0 &amp; 0 &amp; 1 &amp; -e_{z} \\  0 &amp; 0 &amp; 0 &amp; 1  \end{pmatrix}  "><g data-mml-node="msub" data-latex="T_{v i e w}"><g data-mml-node="mi" data-latex="T"><path data-c="1D447" d="M344 631C344 628 343 621 340 611L208 83C204 68 200 59 197 55C188 44 154 39 94 39C63 39 49 42 49 16C49 5 56 0 69 0C120 0 192 4 235 3L317 2C331 2 386 0 403 0C420 0 428 8 428 24C428 34 416 39 391 39C339 39 309 41 300 46C297 48 295 52 295 58L430 603C433 617 436 626 439 629C443 635 467 638 511 638C566 638 604 634 623 625C642 616 652 595 652 561C652 543 649 517 644 483C642 475 641 469 641 464C641 453 646 447 657 447C666 447 672 456 675 473L702 645C703 650 704 656 704 662C704 672 694 677 673 677L125 677C99 677 97 674 89 655L30 481C27 472 25 466 24 462C24 452 29 447 40 447C48 447 55 455 60 470C85 543 110 588 133 607C159 628 209 638 282 638L321 638C332 638 344 639 344 631Z"></path></g><g data-mml-node="TeXAtom" transform="translate(617,-150) scale(0.707)" data-latex="{v i e w}" data-mjx-texclass="ORD"><g data-mml-node="mi" data-latex="v"><path data-c="1D463" d="M369 391C369 383 378 370 394 350C410 330 418 307 418 281C418 252 404 203 375 134C354 86 306 18 247 18C201 18 178 45 178 100C178 139 197 208 235 307C243 328 247 345 247 357C247 407 213 442 163 442C119 442 84 417 59 367C39 326 29 300 29 287C29 278 34 273 45 273C58 273 60 279 64 293C87 373 119 413 160 413C173 413 180 404 180 385C180 369 175 347 164 318C127 219 108 152 108 115C108 64 125 29 159 10C186-4 214-11 243-11C332-11 394 85 420 162C452 256 468 325 468 369C468 418 452 442 421 442C396 442 369 416 369 391Z"></path></g><g data-mml-node="mi" data-latex="i" transform="translate(485,0)"><path data-c="1D456" d="M284 621C284 648 271 661 244 661C216 661 188 633 188 605C188 578 202 565 229 565C257 565 284 593 284 621M259 138C237 59 205 19 164 19C151 19 144 28 144 47C144 64 173 150 232 306C240 329 244 347 244 360C244 409 210 445 161 445C118 445 84 420 59 369C39 328 29 301 29 288C29 279 34 275 45 275C58 275 60 281 64 295C87 375 118 415 158 415C171 415 178 406 178 387C178 373 175 357 168 338C145 275 121 208 101 155C86 115 78 88 78 74C78 25 114-11 162-11C205-11 239 14 264 64C283 103 293 130 293 145C293 154 288 159 277 159C274 159 259 150 259 138Z"></path></g><g data-mml-node="mi" data-latex="e" transform="translate(830,0)"><path data-c="1D452" d="M124 129C124 153 129 186 139 227L188 227C253 227 303 235 339 250C372 264 394 284 405 309C412 326 415 342 415 355C415 410 363 442 307 442C268 442 229 432 190 412C113 372 46 281 46 171C46 69 105-11 204-11C257-11 304 2 345 27C379 48 404 69 420 90C427 99 430 106 430 109C430 120 425 126 414 126C409 126 404 122 398 114C365 70 324 42 277 30C246 22 223 18 206 18C149 18 124 72 124 129M375 355C375 289 311 256 182 256L147 256C166 322 194 366 232 387C262 404 287 413 307 413C343 413 375 391 375 355Z"></path></g><g data-mml-node="mi" data-latex="w" transform="translate(1296,0)"><path data-c="1D464" d="M590 391C590 382 595 372 606 362C629 340 641 313 641 281C641 264 635 237 623 198C586 78 539 18 482 18C435 18 412 45 412 100C412 119 416 142 423 171C441 243 460 314 477 387C479 394 480 398 480 401C480 421 469 431 447 431C427 431 414 421 407 401L367 245C352 187 341 167 341 115C341 107 341 101 342 98C319 45 290 18 255 18C205 18 180 47 180 104C180 141 197 204 231 293C242 323 248 344 248 357C248 406 212 442 163 442C118 442 84 417 59 367C39 328 29 301 29 287C29 278 34 273 45 273C58 273 60 279 64 293C88 373 120 413 160 413C174 413 181 403 181 384C181 369 175 347 164 317C127 220 108 154 108 117C108 32 165-11 252-11C294-11 328 10 355 53C375 10 416-11 479-11C541-11 590 30 625 112C648 164 691 302 691 369C691 384 690 394 689 399C685 418 666 442 644 442C618 442 590 417 590 391Z"></path></g></g></g><g data-mml-node="mo" data-latex="=" transform="translate(2367.5,0)"><path data-c="3D" d="M698 367L80 367C64 367 56 359 56 344C56 329 64 321 80 321L698 321C714 321 722 329 722 344C722 356 711 367 698 367M698 179L80 179C64 179 56 171 56 156C56 141 64 133 80 133L698 133C714 133 722 141 722 156C722 169 711 179 698 179Z"></path></g><g data-mml-node="mrow" data-latex="{pmatrix}" transform="translate(3423.3,0)"><g data-mml-node="mo"><path data-c="239B" d="M813 1450C820 1455 823 1462 823 1470C823 1487 815 1495 798 1495C793 1495 788 1493 784 1490C697 1423 614 1324 536 1192C399 956 277 603 277 253L277 0L385 0L385 253C385 407 403 562 438 719C500 999 630 1313 813 1450Z" transform="translate(0,1377.5)"></path><path data-c="239D" d="M798 0C815 0 823 8 823 25C823 34 819 40 812 44C731 106 658 202 592 334C474 569 385 903 385 1242L385 1495L277 1495L277 1242C277 914 388 575 512 345C594 193 685 80 784 5C788 2 793 0 798 0Z" transform="translate(0,-2372.5)"></path><svg width="875" height="2395" y="-947.5" x="0" viewBox="0 598.7 875 2395"><path data-c="239C" d="M277 0L385 0L385 498L277 498Z" transform="scale(1,7.214)"></path></svg></g><g data-mml-node="mtable" transform="translate(875,0)"><g data-mml-node="mtr" transform="translate(0,2122.5)"><g data-mml-node="mtd"><g data-mml-node="mn" data-latex="1"><path data-c="31" d="M269 666C228 624 168 603 89 603L89 564C141 564 184 572 217 588L217 82C217 64 213 52 204 47C195 42 170 39 130 39L95 39L95 0C120 2 174 3 257 3C340 3 394 2 419 0L419 39L384 39C343 39 318 42 310 47C302 52 297 64 297 82L297 636C297 660 295 666 269 666Z"></path></g></g><g data-mml-node="mtd" transform="translate(1500,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(3000,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(4500,0)"><g data-mml-node="mo" data-latex="-"><path data-c="2212" d="M698 270L80 270C64 270 56 263 56 250C56 237 64 230 80 230L698 230C714 230 722 237 722 250C722 262 710 270 698 270Z"></path></g><g data-mml-node="msub" data-latex="e_{x}" transform="translate(778,0)"><g data-mml-node="mi" data-latex="e"><path data-c="1D452" d="M124 129C124 153 129 186 139 227L188 227C253 227 303 235 339 250C372 264 394 284 405 309C412 326 415 342 415 355C415 410 363 442 307 442C268 442 229 432 190 412C113 372 46 281 46 171C46 69 105-11 204-11C257-11 304 2 345 27C379 48 404 69 420 90C427 99 430 106 430 109C430 120 425 126 414 126C409 126 404 122 398 114C365 70 324 42 277 30C246 22 223 18 206 18C149 18 124 72 124 129M375 355C375 289 311 256 182 256L147 256C166 322 194 366 232 387C262 404 287 413 307 413C343 413 375 391 375 355Z"></path></g><g data-mml-node="TeXAtom" transform="translate(499,-150) scale(0.707)" data-latex="{x}" data-mjx-texclass="ORD"><g data-mml-node="mi" data-latex="x"><path data-c="1D465" d="M527 373C527 419 482 442 432 442C389 442 355 419 329 373C308 419 273 442 222 442C173 442 133 419 101 374C74 335 60 306 60 287C60 278 65 273 75 273C84 273 90 278 92 287C111 345 153 413 220 413C253 413 269 392 269 351C269 330 251 252 216 118C199 51 169 18 126 18C112 18 99 21 88 26C114 36 127 54 127 80C127 106 114 119 87 119C54 119 29 91 29 58C29 12 76-11 125-11C167-11 201 12 228 58C247 12 283-11 335-11C383-11 423 12 455 57C482 96 496 125 496 144C496 153 491 158 481 158C472 158 467 153 464 144C447 87 402 18 337 18C304 18 287 38 287 79C287 92 292 120 303 165L337 300C356 375 387 413 431 413C445 413 458 410 469 405C442 396 429 378 429 351C429 325 443 312 470 312C502 312 527 341 527 373Z"></path></g></g></g></g></g><g data-mml-node="mtr" transform="translate(0,722.5)"><g data-mml-node="mtd"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(1500,0)"><g data-mml-node="mn" data-latex="1"><path data-c="31" d="M269 666C228 624 168 603 89 603L89 564C141 564 184 572 217 588L217 82C217 64 213 52 204 47C195 42 170 39 130 39L95 39L95 0C120 2 174 3 257 3C340 3 394 2 419 0L419 39L384 39C343 39 318 42 310 47C302 52 297 64 297 82L297 636C297 660 295 666 269 666Z"></path></g></g><g data-mml-node="mtd" transform="translate(3000,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(4529,0)"><g data-mml-node="mo" data-latex="-"><path data-c="2212" d="M698 270L80 270C64 270 56 263 56 250C56 237 64 230 80 230L698 230C714 230 722 237 722 250C722 262 710 270 698 270Z"></path></g><g data-mml-node="msub" data-latex="e_{y}" transform="translate(778,0)"><g data-mml-node="mi" data-latex="e"><path data-c="1D452" d="M124 129C124 153 129 186 139 227L188 227C253 227 303 235 339 250C372 264 394 284 405 309C412 326 415 342 415 355C415 410 363 442 307 442C268 442 229 432 190 412C113 372 46 281 46 171C46 69 105-11 204-11C257-11 304 2 345 27C379 48 404 69 420 90C427 99 430 106 430 109C430 120 425 126 414 126C409 126 404 122 398 114C365 70 324 42 277 30C246 22 223 18 206 18C149 18 124 72 124 129M375 355C375 289 311 256 182 256L147 256C166 322 194 366 232 387C262 404 287 413 307 413C343 413 375 391 375 355Z"></path></g><g data-mml-node="TeXAtom" transform="translate(499,-150) scale(0.707)" data-latex="{y}" data-mjx-texclass="ORD"><g data-mml-node="mi" data-latex="y"><path data-c="1D466" d="M163 442C118 442 83 417 58 367C39 328 29 301 29 286C29 277 34 272 45 272C59 272 60 278 64 293C87 372 119 412 160 412C173 412 180 403 180 385C180 369 175 346 164 317C126 214 107 145 107 108C107 32 154-13 231-13C264-13 295-1 323 23C288-109 233-175 158-175C124-175 101-164 89-142C129-140 149-121 149-85C149-60 136-47 109-47C72-47 50-78 50-115C50-170 100-205 158-205C273-205 367-99 392-1L486 377C489 388 490 396 490 401C490 421 479 431 458 431C442 431 429 423 420 408C414 387 409 369 406 354L342 97C332 61 279 16 234 16C196 16 177 41 177 92C177 134 194 198 227 284C240 319 247 343 247 357C247 406 212 442 163 442Z"></path></g></g></g></g></g><g data-mml-node="mtr" transform="translate(0,-722.5)"><g data-mml-node="mtd"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(1500,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(3000,0)"><g data-mml-node="mn" data-latex="1"><path data-c="31" d="M269 666C228 624 168 603 89 603L89 564C141 564 184 572 217 588L217 82C217 64 213 52 204 47C195 42 170 39 130 39L95 39L95 0C120 2 174 3 257 3C340 3 394 2 419 0L419 39L384 39C343 39 318 42 310 47C302 52 297 64 297 82L297 636C297 660 295 666 269 666Z"></path></g></g><g data-mml-node="mtd" transform="translate(4537.1,0)"><g data-mml-node="mo" data-latex="-"><path data-c="2212" d="M698 270L80 270C64 270 56 263 56 250C56 237 64 230 80 230L698 230C714 230 722 237 722 250C722 262 710 270 698 270Z"></path></g><g data-mml-node="msub" data-latex="e_{z}" transform="translate(778,0)"><g data-mml-node="mi" data-latex="e"><path data-c="1D452" d="M124 129C124 153 129 186 139 227L188 227C253 227 303 235 339 250C372 264 394 284 405 309C412 326 415 342 415 355C415 410 363 442 307 442C268 442 229 432 190 412C113 372 46 281 46 171C46 69 105-11 204-11C257-11 304 2 345 27C379 48 404 69 420 90C427 99 430 106 430 109C430 120 425 126 414 126C409 126 404 122 398 114C365 70 324 42 277 30C246 22 223 18 206 18C149 18 124 72 124 129M375 355C375 289 311 256 182 256L147 256C166 322 194 366 232 387C262 404 287 413 307 413C343 413 375 391 375 355Z"></path></g><g data-mml-node="TeXAtom" transform="translate(499,-150) scale(0.707)" data-latex="{z}" data-mjx-texclass="ORD"><g data-mml-node="mi" data-latex="z"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g></g></g></g></g><g data-mml-node="mtr" transform="translate(0,-2122.5)"><g data-mml-node="mtd"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(1500,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(3000,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(5115.7,0)"><g data-mml-node="mn" data-latex="1"><path data-c="31" d="M269 666C228 624 168 603 89 603L89 564C141 564 184 572 217 588L217 82C217 64 213 52 204 47C195 42 170 39 130 39L95 39L95 0C120 2 174 3 257 3C340 3 394 2 419 0L419 39L384 39C343 39 318 42 310 47C302 52 297 64 297 82L297 636C297 660 295 666 269 666Z"></path></g></g></g></g><g data-mml-node="mo" transform="translate(7106.5,0)"><path data-c="239E" d="M490 0L598 0L598 253C598 581 487 920 363 1150C281 1301 190 1415 91 1490C87 1493 82 1495 77 1495C60 1495 52 1487 52 1470C52 1462 55 1455 62 1450C143 1389 216 1292 283 1160C402 924 490 593 490 253Z" transform="translate(0,1377.5)"></path><path data-c="23A0" d="M598 1242L598 1495L490 1495L490 1242C490 1088 472 933 437 776C375 494 246 184 63 44C56 40 52 34 52 25C52 8 60 0 77 0C82 0 87 2 91 5C178 71 261 170 339 303C477 539 598 892 598 1242Z" transform="translate(0,-2372.5)"></path><svg width="875" height="2395" y="-947.5" x="0" viewBox="0 598.7 875 2395"><path data-c="239F" d="M490 0L598 0L598 498L490 498Z" transform="scale(1,7.214)"></path></svg></g></g></g></g></svg></mjx-container></p></li><li><p>如此一来，视图变换就完成了：</p><p>  <mjx-container class="MathJax" jax="SVG" overflow="overflow" display="true"><svg style="vertical-align: -0.357ex;" xmlns="http://www.w3.org/2000/svg" width="18.47ex" height="1.902ex" role="img" focusable="false" viewBox="0 -683 8163.7 840.8"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="  M_{view} = R_{view}T_{view}  "><g data-mml-node="msub" data-latex="M_{v i e w}"><g data-mml-node="mi" data-latex="M"><path data-c="1D440" d="M594 16C594 5 600 0 613 0L736 3C759 4 840 0 859 0C874 0 882 8 882 24C882 34 872 39 851 39C810 39 790 43 790 52C790 55 792 62 795 75L927 602C932 623 942 636 955 641C961 643 979 644 1008 644C1033 644 1044 645 1044 668C1044 678 1034 683 1013 683L882 683C853 683 853 681 840 662L484 108L408 657C404 682 402 683 373 683L237 683C215 683 204 682 204 660C204 649 215 644 236 644C256 644 297 647 297 631C297 629 296 623 293 613L167 110C158 72 135 49 100 42C75 39 42 43 42 16C42 5 48 0 60 0C78 0 141 3 159 3C178 3 242 0 261 0C276 0 283 8 283 24C283 33 276 38 261 39C219 39 198 52 198 78C198 82 199 89 202 100L332 621L415 26C418 9 424 0 434 0C442 0 450 7 459 20L848 627L712 82C706 60 696 47 681 42C675 40 656 39 625 39C604 39 594 37 594 16Z"></path></g><g data-mml-node="TeXAtom" transform="translate(1003,-150) scale(0.707)" data-latex="{v i e w}" data-mjx-texclass="ORD"><g data-mml-node="mi" data-latex="v"><path data-c="1D463" d="M369 391C369 383 378 370 394 350C410 330 418 307 418 281C418 252 404 203 375 134C354 86 306 18 247 18C201 18 178 45 178 100C178 139 197 208 235 307C243 328 247 345 247 357C247 407 213 442 163 442C119 442 84 417 59 367C39 326 29 300 29 287C29 278 34 273 45 273C58 273 60 279 64 293C87 373 119 413 160 413C173 413 180 404 180 385C180 369 175 347 164 318C127 219 108 152 108 115C108 64 125 29 159 10C186-4 214-11 243-11C332-11 394 85 420 162C452 256 468 325 468 369C468 418 452 442 421 442C396 442 369 416 369 391Z"></path></g><g data-mml-node="mi" data-latex="i" transform="translate(485,0)"><path data-c="1D456" d="M284 621C284 648 271 661 244 661C216 661 188 633 188 605C188 578 202 565 229 565C257 565 284 593 284 621M259 138C237 59 205 19 164 19C151 19 144 28 144 47C144 64 173 150 232 306C240 329 244 347 244 360C244 409 210 445 161 445C118 445 84 420 59 369C39 328 29 301 29 288C29 279 34 275 45 275C58 275 60 281 64 295C87 375 118 415 158 415C171 415 178 406 178 387C178 373 175 357 168 338C145 275 121 208 101 155C86 115 78 88 78 74C78 25 114-11 162-11C205-11 239 14 264 64C283 103 293 130 293 145C293 154 288 159 277 159C274 159 259 150 259 138Z"></path></g><g data-mml-node="mi" data-latex="e" transform="translate(830,0)"><path data-c="1D452" d="M124 129C124 153 129 186 139 227L188 227C253 227 303 235 339 250C372 264 394 284 405 309C412 326 415 342 415 355C415 410 363 442 307 442C268 442 229 432 190 412C113 372 46 281 46 171C46 69 105-11 204-11C257-11 304 2 345 27C379 48 404 69 420 90C427 99 430 106 430 109C430 120 425 126 414 126C409 126 404 122 398 114C365 70 324 42 277 30C246 22 223 18 206 18C149 18 124 72 124 129M375 355C375 289 311 256 182 256L147 256C166 322 194 366 232 387C262 404 287 413 307 413C343 413 375 391 375 355Z"></path></g><g data-mml-node="mi" data-latex="w" transform="translate(1296,0)"><path data-c="1D464" d="M590 391C590 382 595 372 606 362C629 340 641 313 641 281C641 264 635 237 623 198C586 78 539 18 482 18C435 18 412 45 412 100C412 119 416 142 423 171C441 243 460 314 477 387C479 394 480 398 480 401C480 421 469 431 447 431C427 431 414 421 407 401L367 245C352 187 341 167 341 115C341 107 341 101 342 98C319 45 290 18 255 18C205 18 180 47 180 104C180 141 197 204 231 293C242 323 248 344 248 357C248 406 212 442 163 442C118 442 84 417 59 367C39 328 29 301 29 287C29 278 34 273 45 273C58 273 60 279 64 293C88 373 120 413 160 413C174 413 181 403 181 384C181 369 175 347 164 317C127 220 108 154 108 117C108 32 165-11 252-11C294-11 328 10 355 53C375 10 416-11 479-11C541-11 590 30 625 112C648 164 691 302 691 369C691 384 690 394 689 399C685 418 666 442 644 442C618 442 590 417 590 391Z"></path></g></g></g><g data-mml-node="mo" data-latex="=" transform="translate(2753.5,0)"><path data-c="3D" d="M698 367L80 367C64 367 56 359 56 344C56 329 64 321 80 321L698 321C714 321 722 329 722 344C722 356 711 367 698 367M698 179L80 179C64 179 56 171 56 156C56 141 64 133 80 133L698 133C714 133 722 141 722 156C722 169 711 179 698 179Z"></path></g><g data-mml-node="msub" data-latex="R_{v i e w}" transform="translate(3809.3,0)"><g data-mml-node="mi" data-latex="R"><path data-c="1D445" d="M739 531C739 582 713 621 662 649C621 672 572 683 517 683L235 683C212 683 202 682 202 659C202 652 205 647 211 646C221 645 229 644 234 644C264 643 281 641 286 640C291 639 294 636 294 631C294 629 293 623 290 613L158 82C153 60 143 46 128 41C121 39 103 38 72 38C50 38 41 37 41 15C41 4 47-1 59 0L183 3L309 0C325-1 333 8 333 23C333 33 322 38 301 38C261 38 241 43 241 52C241 52 242 54 244 68L308 327L423 327C492 327 527 298 527 241C527 232 522 210 513 174C502 132 497 104 497 89C497 13 556-22 632-22C660-22 687-9 714 16C741 41 755 68 755 96C755 106 750 111 739 111C732 111 726 106 723 95C712 64 698 41 682 28C666 15 651 8 636 8C613 8 601 27 601 64C601 88 604 125 611 176C614 197 615 212 615 223C615 276 587 315 531 339C625 362 739 429 739 531M609 616C629 603 639 581 639 550C639 530 635 507 626 480C599 398 531 357 422 357L316 357L379 610C384 631 392 642 403 643C408 644 428 644 463 644C528 644 566 642 609 616Z"></path></g><g data-mml-node="TeXAtom" transform="translate(792,-150) scale(0.707)" data-latex="{v i e w}" data-mjx-texclass="ORD"><g data-mml-node="mi" data-latex="v"><path data-c="1D463" d="M369 391C369 383 378 370 394 350C410 330 418 307 418 281C418 252 404 203 375 134C354 86 306 18 247 18C201 18 178 45 178 100C178 139 197 208 235 307C243 328 247 345 247 357C247 407 213 442 163 442C119 442 84 417 59 367C39 326 29 300 29 287C29 278 34 273 45 273C58 273 60 279 64 293C87 373 119 413 160 413C173 413 180 404 180 385C180 369 175 347 164 318C127 219 108 152 108 115C108 64 125 29 159 10C186-4 214-11 243-11C332-11 394 85 420 162C452 256 468 325 468 369C468 418 452 442 421 442C396 442 369 416 369 391Z"></path></g><g data-mml-node="mi" data-latex="i" transform="translate(485,0)"><path data-c="1D456" d="M284 621C284 648 271 661 244 661C216 661 188 633 188 605C188 578 202 565 229 565C257 565 284 593 284 621M259 138C237 59 205 19 164 19C151 19 144 28 144 47C144 64 173 150 232 306C240 329 244 347 244 360C244 409 210 445 161 445C118 445 84 420 59 369C39 328 29 301 29 288C29 279 34 275 45 275C58 275 60 281 64 295C87 375 118 415 158 415C171 415 178 406 178 387C178 373 175 357 168 338C145 275 121 208 101 155C86 115 78 88 78 74C78 25 114-11 162-11C205-11 239 14 264 64C283 103 293 130 293 145C293 154 288 159 277 159C274 159 259 150 259 138Z"></path></g><g data-mml-node="mi" data-latex="e" transform="translate(830,0)"><path data-c="1D452" d="M124 129C124 153 129 186 139 227L188 227C253 227 303 235 339 250C372 264 394 284 405 309C412 326 415 342 415 355C415 410 363 442 307 442C268 442 229 432 190 412C113 372 46 281 46 171C46 69 105-11 204-11C257-11 304 2 345 27C379 48 404 69 420 90C427 99 430 106 430 109C430 120 425 126 414 126C409 126 404 122 398 114C365 70 324 42 277 30C246 22 223 18 206 18C149 18 124 72 124 129M375 355C375 289 311 256 182 256L147 256C166 322 194 366 232 387C262 404 287 413 307 413C343 413 375 391 375 355Z"></path></g><g data-mml-node="mi" data-latex="w" transform="translate(1296,0)"><path data-c="1D464" d="M590 391C590 382 595 372 606 362C629 340 641 313 641 281C641 264 635 237 623 198C586 78 539 18 482 18C435 18 412 45 412 100C412 119 416 142 423 171C441 243 460 314 477 387C479 394 480 398 480 401C480 421 469 431 447 431C427 431 414 421 407 401L367 245C352 187 341 167 341 115C341 107 341 101 342 98C319 45 290 18 255 18C205 18 180 47 180 104C180 141 197 204 231 293C242 323 248 344 248 357C248 406 212 442 163 442C118 442 84 417 59 367C39 328 29 301 29 287C29 278 34 273 45 273C58 273 60 279 64 293C88 373 120 413 160 413C174 413 181 403 181 384C181 369 175 347 164 317C127 220 108 154 108 117C108 32 165-11 252-11C294-11 328 10 355 53C375 10 416-11 479-11C541-11 590 30 625 112C648 164 691 302 691 369C691 384 690 394 689 399C685 418 666 442 644 442C618 442 590 417 590 391Z"></path></g></g></g><g data-mml-node="msub" data-latex="T_{v i e w}" transform="translate(6074,0)"><g data-mml-node="mi" data-latex="T"><path data-c="1D447" d="M344 631C344 628 343 621 340 611L208 83C204 68 200 59 197 55C188 44 154 39 94 39C63 39 49 42 49 16C49 5 56 0 69 0C120 0 192 4 235 3L317 2C331 2 386 0 403 0C420 0 428 8 428 24C428 34 416 39 391 39C339 39 309 41 300 46C297 48 295 52 295 58L430 603C433 617 436 626 439 629C443 635 467 638 511 638C566 638 604 634 623 625C642 616 652 595 652 561C652 543 649 517 644 483C642 475 641 469 641 464C641 453 646 447 657 447C666 447 672 456 675 473L702 645C703 650 704 656 704 662C704 672 694 677 673 677L125 677C99 677 97 674 89 655L30 481C27 472 25 466 24 462C24 452 29 447 40 447C48 447 55 455 60 470C85 543 110 588 133 607C159 628 209 638 282 638L321 638C332 638 344 639 344 631Z"></path></g><g data-mml-node="TeXAtom" transform="translate(617,-150) scale(0.707)" data-latex="{v i e w}" data-mjx-texclass="ORD"><g data-mml-node="mi" data-latex="v"><path data-c="1D463" d="M369 391C369 383 378 370 394 350C410 330 418 307 418 281C418 252 404 203 375 134C354 86 306 18 247 18C201 18 178 45 178 100C178 139 197 208 235 307C243 328 247 345 247 357C247 407 213 442 163 442C119 442 84 417 59 367C39 326 29 300 29 287C29 278 34 273 45 273C58 273 60 279 64 293C87 373 119 413 160 413C173 413 180 404 180 385C180 369 175 347 164 318C127 219 108 152 108 115C108 64 125 29 159 10C186-4 214-11 243-11C332-11 394 85 420 162C452 256 468 325 468 369C468 418 452 442 421 442C396 442 369 416 369 391Z"></path></g><g data-mml-node="mi" data-latex="i" transform="translate(485,0)"><path data-c="1D456" d="M284 621C284 648 271 661 244 661C216 661 188 633 188 605C188 578 202 565 229 565C257 565 284 593 284 621M259 138C237 59 205 19 164 19C151 19 144 28 144 47C144 64 173 150 232 306C240 329 244 347 244 360C244 409 210 445 161 445C118 445 84 420 59 369C39 328 29 301 29 288C29 279 34 275 45 275C58 275 60 281 64 295C87 375 118 415 158 415C171 415 178 406 178 387C178 373 175 357 168 338C145 275 121 208 101 155C86 115 78 88 78 74C78 25 114-11 162-11C205-11 239 14 264 64C283 103 293 130 293 145C293 154 288 159 277 159C274 159 259 150 259 138Z"></path></g><g data-mml-node="mi" data-latex="e" transform="translate(830,0)"><path data-c="1D452" d="M124 129C124 153 129 186 139 227L188 227C253 227 303 235 339 250C372 264 394 284 405 309C412 326 415 342 415 355C415 410 363 442 307 442C268 442 229 432 190 412C113 372 46 281 46 171C46 69 105-11 204-11C257-11 304 2 345 27C379 48 404 69 420 90C427 99 430 106 430 109C430 120 425 126 414 126C409 126 404 122 398 114C365 70 324 42 277 30C246 22 223 18 206 18C149 18 124 72 124 129M375 355C375 289 311 256 182 256L147 256C166 322 194 366 232 387C262 404 287 413 307 413C343 413 375 391 375 355Z"></path></g><g data-mml-node="mi" data-latex="w" transform="translate(1296,0)"><path data-c="1D464" d="M590 391C590 382 595 372 606 362C629 340 641 313 641 281C641 264 635 237 623 198C586 78 539 18 482 18C435 18 412 45 412 100C412 119 416 142 423 171C441 243 460 314 477 387C479 394 480 398 480 401C480 421 469 431 447 431C427 431 414 421 407 401L367 245C352 187 341 167 341 115C341 107 341 101 342 98C319 45 290 18 255 18C205 18 180 47 180 104C180 141 197 204 231 293C242 323 248 344 248 357C248 406 212 442 163 442C118 442 84 417 59 367C39 328 29 301 29 287C29 278 34 273 45 273C58 273 60 279 64 293C88 373 120 413 160 413C174 413 181 403 181 384C181 369 175 347 164 317C127 220 108 154 108 117C108 32 165-11 252-11C294-11 328 10 355 53C375 10 416-11 479-11C541-11 590 30 625 112C648 164 691 302 691 369C691 384 690 394 689 399C685 418 666 442 644 442C618 442 590 417 590 391Z"></path></g></g></g></g></g></svg></mjx-container></p></li></ul><h1 id="投影变换"><a href="#投影变换" class="headerlink" title="投影变换"></a>投影变换</h1><div class="callout callout--titled warning mb-4 rounded-small shadow-redefine-flat bg-(--callout-bg-color) p-3 pl-1 relative flex flex-row gap-2"><div role="none" class="rounded-full self-stretch w-0.5 bg-(--callout-primary-color) shrink-0 opacity-60"></div><div class="flex flex-col gap-2"><div class="callout__title flex items-center gap-2 font-semibold tracking-tight"><i class="callout__icon fa-solid leading-none text-(--callout-primary-color) text-sm shrink-0"></i> <strong>注意</strong></div><div class="callout__content markdown-body flex-1 min-w-0"><p>在进行投影变换前，应当先 <strong>应用视图变换，进入以相机为中心的坐标系</strong>。换言之，将摄像机置于坐标原点，摄像机面朝的方向是 <mjx-container class="MathJax" jax="SVG" overflow="overflow"><svg style="vertical-align: -0.188ex;" xmlns="http://www.w3.org/2000/svg" width="2.817ex" height="1.507ex" role="img" focusable="false" viewBox="0 -583 1245 666"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="-z"><g data-mml-node="mo" data-latex="-"><path data-c="2212" d="M698 270L80 270C64 270 56 263 56 250C56 237 64 230 80 230L698 230C714 230 722 237 722 250C722 262 710 270 698 270Z"></path></g><g data-mml-node="mi" data-latex="z" transform="translate(778,0)"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g></g></g></svg></mjx-container>，</p></div></div></div><h2 id="正交投影-Orthographic-Projection"><a href="#正交投影-Orthographic-Projection" class="headerlink" title="正交投影 Orthographic Projection"></a>正交投影 Orthographic Projection</h2><ul><li><p>对于正交投影，主要的步骤是将摄像机前方的可视区域变换成一个 <strong>标准立方体</strong>，即在三维都在 -1 ~ 1 之间的立方体空间。</p></li><li><p>对于摄像机坐标系，一般情况下其正交可视区域已经天然关于 Z 轴对称。考虑到视角裁剪和部分渲染的情况，仍然需要将可视区域视作一个可能存在于任何位置的长方体。</p></li></ul><img src="https://files.seeusercontent.com/2026/08/22/piU6/otho.png" alt="otho.png" width="600"><ul><li><p>因此，我们需要将其平移到坐标原点，然后缩放为标准立方体（canonical cube），然后进行视口变换和光栅化。</p></li><li><p>变换矩阵：</p><p>  <mjx-container class="MathJax" jax="SVG" overflow="overflow" display="true"><svg style="vertical-align: -6.326ex;" xmlns="http://www.w3.org/2000/svg" width="52.436ex" height="13.783ex" role="img" focusable="false" viewBox="0 -3296.1 23176.5 6092.1"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="  M_{ortho} =  \begin{pmatrix}  \frac{2}{r - l} &amp; 0 &amp; 0 &amp; 0 \\  0 &amp; \frac{2}{t - b} &amp; 0 &amp; 0 \\  0 &amp; 0 &amp; \frac{2}{n - f} &amp; 0 \\  0 &amp; 0 &amp; 0 &amp; 1  \end{pmatrix}  \begin{pmatrix}  1 &amp; 0 &amp; 0 &amp; -\frac{r + l}{2} \\  0 &amp; 1 &amp; 0 &amp; -\frac{b + t}{2} \\  0 &amp; 0 &amp; 1 &amp; -\frac{n + f}{2} \\  0 &amp; 0 &amp; 0 &amp; 1  \end{pmatrix}  "><g data-mml-node="msub" data-latex="M_{o r t h o}"><g data-mml-node="mi" data-latex="M"><path data-c="1D440" d="M594 16C594 5 600 0 613 0L736 3C759 4 840 0 859 0C874 0 882 8 882 24C882 34 872 39 851 39C810 39 790 43 790 52C790 55 792 62 795 75L927 602C932 623 942 636 955 641C961 643 979 644 1008 644C1033 644 1044 645 1044 668C1044 678 1034 683 1013 683L882 683C853 683 853 681 840 662L484 108L408 657C404 682 402 683 373 683L237 683C215 683 204 682 204 660C204 649 215 644 236 644C256 644 297 647 297 631C297 629 296 623 293 613L167 110C158 72 135 49 100 42C75 39 42 43 42 16C42 5 48 0 60 0C78 0 141 3 159 3C178 3 242 0 261 0C276 0 283 8 283 24C283 33 276 38 261 39C219 39 198 52 198 78C198 82 199 89 202 100L332 621L415 26C418 9 424 0 434 0C442 0 450 7 459 20L848 627L712 82C706 60 696 47 681 42C675 40 656 39 625 39C604 39 594 37 594 16Z"></path></g><g data-mml-node="TeXAtom" transform="translate(1003,-150) scale(0.707)" data-latex="{o r t h o}" data-mjx-texclass="ORD"><g data-mml-node="mi" data-latex="o"><path data-c="1D45C" d="M308 442C239 442 176 412 122 353C68 294 41 229 41 159C41 63 106-11 202-11C272-11 334 19 388 78C442 137 469 201 469 272C469 369 405 442 308 442M389 310C389 287 384 255 374 213C353 130 319 73 272 42C248 26 225 18 203 18C149 18 121 65 121 122C121 180 155 288 178 324C216 383 259 413 307 413C361 413 389 367 389 310Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(485,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g><g data-mml-node="mi" data-latex="t" transform="translate(936,0)"><path data-c="1D461" d="M330 419C330 428 320 433 299 433L218 433C244 537 257 591 257 595C257 616 246 626 225 626C202 626 188 613 182 587L145 433L56 433C34 433 23 432 23 411C23 400 33 395 54 395L135 395C86 200 62 97 62 84C62 28 100-11 156-11C194-11 227 6 256 41C280 70 297 98 308 125C312 136 314 142 314 145C314 154 309 159 299 159C291 159 285 154 281 143C247 60 206 19 157 19C140 19 131 33 131 60C131 75 133 91 137 107L208 395L297 395C323 395 330 397 330 419Z"></path></g><g data-mml-node="mi" data-latex="h" transform="translate(1297,0)"><path data-c="210E" d="M512 138C489 59 457 19 415 19C402 19 395 28 395 47C395 62 401 85 413 116C453 223 473 296 473 335C473 406 427 445 356 445C303 445 257 423 218 380L291 679C289 688 287 694 274 694C241 694 168 685 155 684C140 682 132 675 132 660C132 650 141 645 159 645C180 645 203 646 205 632L59 43C56 32 55 25 55 21C55 0 66-11 87-11C107-11 121-1 128 18L168 182C180 231 189 268 196 293C199 300 207 314 220 334C256 388 300 415 353 415C386 415 402 393 402 350C402 309 382 236 342 130C333 107 329 89 329 74C329 26 365-11 413-11C457-11 492 14 517 65C536 105 546 132 546 145C546 154 541 159 530 159C527 159 512 150 512 138Z"></path></g><g data-mml-node="mi" data-latex="o" transform="translate(1873,0)"><path data-c="1D45C" d="M308 442C239 442 176 412 122 353C68 294 41 229 41 159C41 63 106-11 202-11C272-11 334 19 388 78C442 137 469 201 469 272C469 369 405 442 308 442M389 310C389 287 384 255 374 213C353 130 319 73 272 42C248 26 225 18 203 18C149 18 121 65 121 122C121 180 155 288 178 324C216 383 259 413 307 413C361 413 389 367 389 310Z"></path></g></g></g><g data-mml-node="mo" data-latex="=" transform="translate(2998.1,0)"><path data-c="3D" d="M698 367L80 367C64 367 56 359 56 344C56 329 64 321 80 321L698 321C714 321 722 329 722 344C722 356 711 367 698 367M698 179L80 179C64 179 56 171 56 156C56 141 64 133 80 133L698 133C714 133 722 141 722 156C722 169 711 179 698 179Z"></path></g><g data-mml-node="mrow" data-latex="{pmatrix}" transform="translate(4053.9,0)"><g data-mml-node="mo"><path data-c="239B" d="M813 1450C820 1455 823 1462 823 1470C823 1487 815 1495 798 1495C793 1495 788 1493 784 1490C697 1423 614 1324 536 1192C399 956 277 603 277 253L277 0L385 0L385 253C385 407 403 562 438 719C500 999 630 1313 813 1450Z" transform="translate(0,1801.1)"></path><path data-c="239D" d="M798 0C815 0 823 8 823 25C823 34 819 40 812 44C731 106 658 202 592 334C474 569 385 903 385 1242L385 1495L277 1495L277 1242C277 914 388 575 512 345C594 193 685 80 784 5C788 2 793 0 798 0Z" transform="translate(0,-2796.1)"></path><svg width="875" height="3242.1" y="-1371.1" x="0" viewBox="0 810.5 875 3242.1"><path data-c="239C" d="M277 0L385 0L385 498L277 498Z" transform="scale(1,9.765)"></path></svg></g><g data-mml-node="mtable" transform="translate(875,0)"><g data-mml-node="mtr" transform="translate(0,2431.1)"><g data-mml-node="mtd"><g data-mml-node="mfrac" data-latex="\frac{2}{r - l}"><g data-mml-node="mn" transform="translate(583.1,394) scale(0.707)" data-latex="2"><path data-c="32" d="M237 666C186 666 143 648 106 612C69 576 50 534 50 483C50 449 75 424 106 424C136 424 161 450 161 480C161 513 137 536 105 536C102 536 100 536 98 535C117 584 161 627 224 627C306 627 352 556 352 470C352 403 318 331 250 255L62 43C49 28 50 29 50 0L421 0L450 180L417 180C409 129 402 100 396 91C391 86 361 84 306 84L139 84L236 179C304 243 390 312 419 365C439 400 449 435 449 470C449 588 357 666 237 666Z"></path></g><g data-mml-node="mrow" transform="translate(220,-345) scale(0.707)" data-latex="r - l"><g data-mml-node="mi" data-latex="r"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g><g data-mml-node="mo" data-latex="-" transform="translate(451,0)"><path data-c="2212" d="M698 270L80 270C64 270 56 263 56 250C56 237 64 230 80 230L698 230C714 230 722 237 722 250C722 262 710 270 698 270Z"></path></g><g data-mml-node="mi" data-latex="l" transform="translate(1229,0)"><path data-c="1D459" d="M173 632L49 119C46 105 44 93 44 84C44 31 83-11 136-11C185-11 220 41 241 145C241 154 236 159 225 159C217 159 211 152 208 138C188 59 165 19 138 19C121 19 113 33 113 60C113 75 115 91 119 107L258 679L258 683C255 690 249 694 242 694C210 694 136 685 124 684C109 682 102 674 102 659C102 650 111 645 130 645C147 645 173 645 173 632Z"></path></g></g><rect width="1279.8" height="60" x="120" y="220"></rect></g></g><g data-mml-node="mtd" transform="translate(3044.1,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(5720.9,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(7873.2,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g></g><g data-mml-node="mtr" transform="translate(0,762.5)"><g data-mml-node="mtd" transform="translate(509.9,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(2519.8,0)"><g data-mml-node="mfrac" data-latex="\frac{2}{t - b}"><g data-mml-node="mn" transform="translate(597.6,394) scale(0.707)" data-latex="2"><path data-c="32" d="M237 666C186 666 143 648 106 612C69 576 50 534 50 483C50 449 75 424 106 424C136 424 161 450 161 480C161 513 137 536 105 536C102 536 100 536 98 535C117 584 161 627 224 627C306 627 352 556 352 470C352 403 318 331 250 255L62 43C49 28 50 29 50 0L421 0L450 180L417 180C409 129 402 100 396 91C391 86 361 84 306 84L139 84L236 179C304 243 390 312 419 365C439 400 449 435 449 470C449 588 357 666 237 666Z"></path></g><g data-mml-node="mrow" transform="translate(220,-345) scale(0.707)" data-latex="t - b"><g data-mml-node="mi" data-latex="t"><path data-c="1D461" d="M330 419C330 428 320 433 299 433L218 433C244 537 257 591 257 595C257 616 246 626 225 626C202 626 188 613 182 587L145 433L56 433C34 433 23 432 23 411C23 400 33 395 54 395L135 395C86 200 62 97 62 84C62 28 100-11 156-11C194-11 227 6 256 41C280 70 297 98 308 125C312 136 314 142 314 145C314 154 309 159 299 159C291 159 285 154 281 143C247 60 206 19 157 19C140 19 131 33 131 60C131 75 133 91 137 107L208 395L297 395C323 395 330 397 330 419Z"></path></g><g data-mml-node="mo" data-latex="-" transform="translate(361,0)"><path data-c="2212" d="M698 270L80 270C64 270 56 263 56 250C56 237 64 230 80 230L698 230C714 230 722 237 722 250C722 262 710 270 698 270Z"></path></g><g data-mml-node="mi" data-latex="b" transform="translate(1139,0)"><path data-c="1D44F" d="M281 445C245 445 209 428 174 394L243 679C241 688 238 694 226 694C193 694 120 685 107 684C92 682 84 675 84 660C84 650 93 645 112 645C131 645 157 646 157 632C157 628 152 608 143 571L63 249C52 207 47 173 47 148C47 62 93-11 175-11C240-11 297 22 347 89C392 151 415 216 415 283C415 370 364 445 281 445M279 415C318 415 337 385 337 326C337 299 331 263 319 218C297 133 268 75 233 44C213 27 194 19 175 19C134 19 114 51 114 115C114 137 119 170 129 214L151 304C154 319 159 330 165 338C204 389 242 415 279 415Z"></path></g></g><rect width="1308.7" height="60" x="120" y="220"></rect></g></g><g data-mml-node="mtd" transform="translate(5720.9,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(7873.2,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g></g><g data-mml-node="mtr" transform="translate(0,-906.1)"><g data-mml-node="mtd" transform="translate(509.9,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(3044.1,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(5068.5,0)"><g data-mml-node="mfrac" data-latex="\frac{2}{n - f}"><g data-mml-node="mn" transform="translate(725.6,394) scale(0.707)" data-latex="2"><path data-c="32" d="M237 666C186 666 143 648 106 612C69 576 50 534 50 483C50 449 75 424 106 424C136 424 161 450 161 480C161 513 137 536 105 536C102 536 100 536 98 535C117 584 161 627 224 627C306 627 352 556 352 470C352 403 318 331 250 255L62 43C49 28 50 29 50 0L421 0L450 180L417 180C409 129 402 100 396 91C391 86 361 84 306 84L139 84L236 179C304 243 390 312 419 365C439 400 449 435 449 470C449 588 357 666 237 666Z"></path></g><g data-mml-node="mrow" transform="translate(220,-345) scale(0.707)" data-latex="n - f"><g data-mml-node="mi" data-latex="n"><path data-c="1D45B" d="M537 137C514 58 481 18 440 18C427 18 420 28 420 47C420 61 426 84 438 115C478 224 498 296 498 333C498 403 451 442 381 442C322 442 271 416 230 363C222 407 187 442 136 442C80 442 58 390 44 345C34 313 29 294 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C151 413 160 399 160 371C160 358 155 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 111-11C130-11 144-1 151 19C153 24 159 49 170 92L191 181L221 295C232 318 249 341 270 365C299 397 335 413 378 413C411 413 427 391 427 348C427 310 406 234 363 120C356 102 353 87 353 74C353 25 390-11 438-11C482-11 517 14 542 64C561 104 571 131 571 144C571 153 566 158 555 158C552 158 537 149 537 137Z"></path></g><g data-mml-node="mo" data-latex="-" transform="translate(600,0)"><path data-c="2212" d="M698 270L80 270C64 270 56 263 56 250C56 237 64 230 80 230L698 230C714 230 722 237 722 250C722 262 710 270 698 270Z"></path></g><g data-mml-node="mi" data-latex="f" transform="translate(1378,0)"><path data-c="1D453" d="M552 633C552 677 509 705 462 705C400 705 357 665 334 586C329 568 318 517 302 433L237 433C215 433 204 432 204 411C204 400 214 395 235 395L295 395L222 8C211-49 201-91 192-119C180-156 163-175 141-175C126-175 114-171 103-164C135-159 151-140 151-108C151-82 138-69 111-69C77-69 53-99 53-133C53-177 94-205 141-205C166-205 189-195 208-174C240-141 265-94 283-31C294 8 304 46 311 84L369 395L451 395C474 395 484 396 484 419C484 428 474 433 454 433L377 433C383 474 411 625 420 644C430 665 444 675 462 675C477 675 490 671 501 664C470 657 454 639 454 608C454 582 467 569 494 569C528 569 552 599 552 633Z"></path></g></g><rect width="1564.7" height="60" x="120" y="220"></rect></g></g><g data-mml-node="mtd" transform="translate(7873.2,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g></g><g data-mml-node="mtr" transform="translate(0,-2546.1)"><g data-mml-node="mtd" transform="translate(509.9,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(3044.1,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(5720.9,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(7873.2,0)"><g data-mml-node="mn" data-latex="1"><path data-c="31" d="M269 666C228 624 168 603 89 603L89 564C141 564 184 572 217 588L217 82C217 64 213 52 204 47C195 42 170 39 130 39L95 39L95 0C120 2 174 3 257 3C340 3 394 2 419 0L419 39L384 39C343 39 318 42 310 47C302 52 297 64 297 82L297 636C297 660 295 666 269 666Z"></path></g></g></g></g><g data-mml-node="mo" transform="translate(9248.2,0)"><path data-c="239E" d="M490 0L598 0L598 253C598 581 487 920 363 1150C281 1301 190 1415 91 1490C87 1493 82 1495 77 1495C60 1495 52 1487 52 1470C52 1462 55 1455 62 1450C143 1389 216 1292 283 1160C402 924 490 593 490 253Z" transform="translate(0,1801.1)"></path><path data-c="23A0" d="M598 1242L598 1495L490 1495L490 1242C490 1088 472 933 437 776C375 494 246 184 63 44C56 40 52 34 52 25C52 8 60 0 77 0C82 0 87 2 91 5C178 71 261 170 339 303C477 539 598 892 598 1242Z" transform="translate(0,-2796.1)"></path><svg width="875" height="3242.1" y="-1371.1" x="0" viewBox="0 810.5 875 3242.1"><path data-c="239F" d="M490 0L598 0L598 498L490 498Z" transform="scale(1,9.765)"></path></svg></g></g><g data-mml-node="mrow" data-latex="{pmatrix}" transform="translate(14343.8,0)"><g data-mml-node="mo"><path data-c="239B" d="M813 1450C820 1455 823 1462 823 1470C823 1487 815 1495 798 1495C793 1495 788 1493 784 1490C697 1423 614 1324 536 1192C399 956 277 603 277 253L277 0L385 0L385 253C385 407 403 562 438 719C500 999 630 1313 813 1450Z" transform="translate(0,1753.7)"></path><path data-c="239D" d="M798 0C815 0 823 8 823 25C823 34 819 40 812 44C731 106 658 202 592 334C474 569 385 903 385 1242L385 1495L277 1495L277 1242C277 914 388 575 512 345C594 193 685 80 784 5C788 2 793 0 798 0Z" transform="translate(0,-2748.7)"></path><svg width="875" height="3147.3" y="-1323.7" x="0" viewBox="0 786.8 875 3147.3"><path data-c="239C" d="M277 0L385 0L385 498L277 498Z" transform="scale(1,9.48)"></path></svg></g><g data-mml-node="mtable" transform="translate(875,0)"><g data-mml-node="mtr" transform="translate(0,2359.2)"><g data-mml-node="mtd"><g data-mml-node="mn" data-latex="1"><path data-c="31" d="M269 666C228 624 168 603 89 603L89 564C141 564 184 572 217 588L217 82C217 64 213 52 204 47C195 42 170 39 130 39L95 39L95 0C120 2 174 3 257 3C340 3 394 2 419 0L419 39L384 39C343 39 318 42 310 47C302 52 297 64 297 82L297 636C297 660 295 666 269 666Z"></path></g></g><g data-mml-node="mtd" transform="translate(1500,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(3000,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(4642.5,0)"><g data-mml-node="mo" data-latex="-"><path data-c="2212" d="M698 270L80 270C64 270 56 263 56 250C56 237 64 230 80 230L698 230C714 230 722 237 722 250C722 262 710 270 698 270Z"></path></g><g data-mml-node="mfrac" data-latex="\frac{r + l}{2}" transform="translate(778,0)"><g data-mml-node="mrow" transform="translate(220,398.7) scale(0.707)" data-latex="r + l"><g data-mml-node="mi" data-latex="r"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g><g data-mml-node="mo" data-latex="+" transform="translate(451,0)"><path data-c="2B" d="M698 274L413 274L413 559C413 575 405 583 389 583C373 583 365 575 365 559L365 274L80 274C64 274 56 266 56 250C56 234 64 226 80 226L365 226L365-59C365-75 373-83 389-83C405-83 413-75 413-59L413 226L698 226C714 226 722 234 722 250C722 263 711 274 698 274Z"></path></g><g data-mml-node="mi" data-latex="l" transform="translate(1229,0)"><path data-c="1D459" d="M173 632L49 119C46 105 44 93 44 84C44 31 83-11 136-11C185-11 220 41 241 145C241 154 236 159 225 159C217 159 211 152 208 138C188 59 165 19 138 19C121 19 113 33 113 60C113 75 115 91 119 107L258 679L258 683C255 690 249 694 242 694C210 694 136 685 124 684C109 682 102 674 102 659C102 650 111 645 130 645C147 645 173 645 173 632Z"></path></g></g><g data-mml-node="mn" transform="translate(583.1,-345) scale(0.707)" data-latex="2"><path data-c="32" d="M237 666C186 666 143 648 106 612C69 576 50 534 50 483C50 449 75 424 106 424C136 424 161 450 161 480C161 513 137 536 105 536C102 536 100 536 98 535C117 584 161 627 224 627C306 627 352 556 352 470C352 403 318 331 250 255L62 43C49 28 50 29 50 0L421 0L450 180L417 180C409 129 402 100 396 91C391 86 361 84 306 84L139 84L236 179C304 243 390 312 419 365C439 400 449 435 449 470C449 588 357 666 237 666Z"></path></g><rect width="1279.8" height="60" x="120" y="220"></rect></g></g></g><g data-mml-node="mtr" transform="translate(0,724.8)"><g data-mml-node="mtd"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(1500,0)"><g data-mml-node="mn" data-latex="1"><path data-c="31" d="M269 666C228 624 168 603 89 603L89 564C141 564 184 572 217 588L217 82C217 64 213 52 204 47C195 42 170 39 130 39L95 39L95 0C120 2 174 3 257 3C340 3 394 2 419 0L419 39L384 39C343 39 318 42 310 47C302 52 297 64 297 82L297 636C297 660 295 666 269 666Z"></path></g></g><g data-mml-node="mtd" transform="translate(3000,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(4628,0)"><g data-mml-node="mo" data-latex="-"><path data-c="2212" d="M698 270L80 270C64 270 56 263 56 250C56 237 64 230 80 230L698 230C714 230 722 237 722 250C722 262 710 270 698 270Z"></path></g><g data-mml-node="mfrac" data-latex="\frac{b + t}{2}" transform="translate(778,0)"><g data-mml-node="mrow" transform="translate(220,398.7) scale(0.707)" data-latex="b + t"><g data-mml-node="mi" data-latex="b"><path data-c="1D44F" d="M281 445C245 445 209 428 174 394L243 679C241 688 238 694 226 694C193 694 120 685 107 684C92 682 84 675 84 660C84 650 93 645 112 645C131 645 157 646 157 632C157 628 152 608 143 571L63 249C52 207 47 173 47 148C47 62 93-11 175-11C240-11 297 22 347 89C392 151 415 216 415 283C415 370 364 445 281 445M279 415C318 415 337 385 337 326C337 299 331 263 319 218C297 133 268 75 233 44C213 27 194 19 175 19C134 19 114 51 114 115C114 137 119 170 129 214L151 304C154 319 159 330 165 338C204 389 242 415 279 415Z"></path></g><g data-mml-node="mo" data-latex="+" transform="translate(429,0)"><path data-c="2B" d="M698 274L413 274L413 559C413 575 405 583 389 583C373 583 365 575 365 559L365 274L80 274C64 274 56 266 56 250C56 234 64 226 80 226L365 226L365-59C365-75 373-83 389-83C405-83 413-75 413-59L413 226L698 226C714 226 722 234 722 250C722 263 711 274 698 274Z"></path></g><g data-mml-node="mi" data-latex="t" transform="translate(1207,0)"><path data-c="1D461" d="M330 419C330 428 320 433 299 433L218 433C244 537 257 591 257 595C257 616 246 626 225 626C202 626 188 613 182 587L145 433L56 433C34 433 23 432 23 411C23 400 33 395 54 395L135 395C86 200 62 97 62 84C62 28 100-11 156-11C194-11 227 6 256 41C280 70 297 98 308 125C312 136 314 142 314 145C314 154 309 159 299 159C291 159 285 154 281 143C247 60 206 19 157 19C140 19 131 33 131 60C131 75 133 91 137 107L208 395L297 395C323 395 330 397 330 419Z"></path></g></g><g data-mml-node="mn" transform="translate(597.6,-345) scale(0.707)" data-latex="2"><path data-c="32" d="M237 666C186 666 143 648 106 612C69 576 50 534 50 483C50 449 75 424 106 424C136 424 161 450 161 480C161 513 137 536 105 536C102 536 100 536 98 535C117 584 161 627 224 627C306 627 352 556 352 470C352 403 318 331 250 255L62 43C49 28 50 29 50 0L421 0L450 180L417 180C409 129 402 100 396 91C391 86 361 84 306 84L139 84L236 179C304 243 390 312 419 365C439 400 449 435 449 470C449 588 357 666 237 666Z"></path></g><rect width="1308.7" height="60" x="120" y="220"></rect></g></g></g><g data-mml-node="mtr" transform="translate(0,-1003.7)"><g data-mml-node="mtd"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(1500,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(3000,0)"><g data-mml-node="mn" data-latex="1"><path data-c="31" d="M269 666C228 624 168 603 89 603L89 564C141 564 184 572 217 588L217 82C217 64 213 52 204 47C195 42 170 39 130 39L95 39L95 0C120 2 174 3 257 3C340 3 394 2 419 0L419 39L384 39C343 39 318 42 310 47C302 52 297 64 297 82L297 636C297 660 295 666 269 666Z"></path></g></g><g data-mml-node="mtd" transform="translate(4500,0)"><g data-mml-node="mo" data-latex="-"><path data-c="2212" d="M698 270L80 270C64 270 56 263 56 250C56 237 64 230 80 230L698 230C714 230 722 237 722 250C722 262 710 270 698 270Z"></path></g><g data-mml-node="mfrac" data-latex="\frac{n + f}{2}" transform="translate(778,0)"><g data-mml-node="mrow" transform="translate(220,485) scale(0.707)" data-latex="n + f"><g data-mml-node="mi" data-latex="n"><path data-c="1D45B" d="M537 137C514 58 481 18 440 18C427 18 420 28 420 47C420 61 426 84 438 115C478 224 498 296 498 333C498 403 451 442 381 442C322 442 271 416 230 363C222 407 187 442 136 442C80 442 58 390 44 345C34 313 29 294 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C151 413 160 399 160 371C160 358 155 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 111-11C130-11 144-1 151 19C153 24 159 49 170 92L191 181L221 295C232 318 249 341 270 365C299 397 335 413 378 413C411 413 427 391 427 348C427 310 406 234 363 120C356 102 353 87 353 74C353 25 390-11 438-11C482-11 517 14 542 64C561 104 571 131 571 144C571 153 566 158 555 158C552 158 537 149 537 137Z"></path></g><g data-mml-node="mo" data-latex="+" transform="translate(600,0)"><path data-c="2B" d="M698 274L413 274L413 559C413 575 405 583 389 583C373 583 365 575 365 559L365 274L80 274C64 274 56 266 56 250C56 234 64 226 80 226L365 226L365-59C365-75 373-83 389-83C405-83 413-75 413-59L413 226L698 226C714 226 722 234 722 250C722 263 711 274 698 274Z"></path></g><g data-mml-node="mi" data-latex="f" transform="translate(1378,0)"><path data-c="1D453" d="M552 633C552 677 509 705 462 705C400 705 357 665 334 586C329 568 318 517 302 433L237 433C215 433 204 432 204 411C204 400 214 395 235 395L295 395L222 8C211-49 201-91 192-119C180-156 163-175 141-175C126-175 114-171 103-164C135-159 151-140 151-108C151-82 138-69 111-69C77-69 53-99 53-133C53-177 94-205 141-205C166-205 189-195 208-174C240-141 265-94 283-31C294 8 304 46 311 84L369 395L451 395C474 395 484 396 484 419C484 428 474 433 454 433L377 433C383 474 411 625 420 644C430 665 444 675 462 675C477 675 490 671 501 664C470 657 454 639 454 608C454 582 467 569 494 569C528 569 552 599 552 633Z"></path></g></g><g data-mml-node="mn" transform="translate(725.6,-345) scale(0.707)" data-latex="2"><path data-c="32" d="M237 666C186 666 143 648 106 612C69 576 50 534 50 483C50 449 75 424 106 424C136 424 161 450 161 480C161 513 137 536 105 536C102 536 100 536 98 535C117 584 161 627 224 627C306 627 352 556 352 470C352 403 318 331 250 255L62 43C49 28 50 29 50 0L421 0L450 180L417 180C409 129 402 100 396 91C391 86 361 84 306 84L139 84L236 179C304 243 390 312 419 365C439 400 449 435 449 470C449 588 357 666 237 666Z"></path></g><rect width="1564.7" height="60" x="120" y="220"></rect></g></g></g><g data-mml-node="mtr" transform="translate(0,-2498.7)"><g data-mml-node="mtd"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(1500,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(3000,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(5541.4,0)"><g data-mml-node="mn" data-latex="1"><path data-c="31" d="M269 666C228 624 168 603 89 603L89 564C141 564 184 572 217 588L217 82C217 64 213 52 204 47C195 42 170 39 130 39L95 39L95 0C120 2 174 3 257 3C340 3 394 2 419 0L419 39L384 39C343 39 318 42 310 47C302 52 297 64 297 82L297 636C297 660 295 666 269 666Z"></path></g></g></g></g><g data-mml-node="mo" transform="translate(7957.7,0)"><path data-c="239E" d="M490 0L598 0L598 253C598 581 487 920 363 1150C281 1301 190 1415 91 1490C87 1493 82 1495 77 1495C60 1495 52 1487 52 1470C52 1462 55 1455 62 1450C143 1389 216 1292 283 1160C402 924 490 593 490 253Z" transform="translate(0,1753.7)"></path><path data-c="23A0" d="M598 1242L598 1495L490 1495L490 1242C490 1088 472 933 437 776C375 494 246 184 63 44C56 40 52 34 52 25C52 8 60 0 77 0C82 0 87 2 91 5C178 71 261 170 339 303C477 539 598 892 598 1242Z" transform="translate(0,-2748.7)"></path><svg width="875" height="3147.3" y="-1323.7" x="0" viewBox="0 786.8 875 3147.3"><path data-c="239F" d="M490 0L598 0L598 498L490 498Z" transform="scale(1,9.48)"></path></svg></g></g></g></g></svg></mjx-container></p></li></ul><div class="callout callout--titled primary mb-4 rounded-small shadow-redefine-flat bg-(--callout-bg-color) p-3 pl-1 relative flex flex-row gap-2"><div role="none" class="rounded-full self-stretch w-0.5 bg-(--callout-primary-color) shrink-0 opacity-60"></div><div class="flex flex-col gap-2"><div class="callout__title flex items-center gap-2 font-semibold tracking-tight"><i class="callout__icon fa-solid leading-none text-(--callout-primary-color) text-sm shrink-0"></i> NOTE</div><div class="callout__content markdown-body flex-1 min-w-0"><p>先平移后缩放</p></div></div></div><h2 id="透视投影-Perspective-Projection"><a href="#透视投影-Perspective-Projection" class="headerlink" title="透视投影 Perspective Projection"></a>透视投影 Perspective Projection</h2><div class="callout callout--titled warning mb-4 rounded-small shadow-redefine-flat bg-(--callout-bg-color) p-3 pl-1 relative flex flex-row gap-2"><div role="none" class="rounded-full self-stretch w-0.5 bg-(--callout-primary-color) shrink-0 opacity-60"></div><div class="flex flex-col gap-2"><div class="callout__title flex items-center gap-2 font-semibold tracking-tight"><i class="callout__icon fa-solid leading-none text-(--callout-primary-color) text-sm shrink-0"></i> <strong>注意</strong></div><div class="callout__content markdown-body flex-1 min-w-0"><ul><li><p>近远平面变量 <mjx-container class="MathJax" jax="SVG" overflow="overflow"><svg style="vertical-align: -0.437ex;" xmlns="http://www.w3.org/2000/svg" width="12.3ex" height="1.982ex" role="img" focusable="false" viewBox="0 -683 5436.7 876"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="zNear,zFar"><g data-mml-node="mi" data-latex="z"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="mi" data-latex="N" transform="translate(467,0)"><path data-c="1D441" d="M864 683C845 683 783 680 764 680C745 680 682 683 663 683C648 683 641 675 641 659C641 650 648 645 663 644C705 644 726 631 726 605C726 599 725 592 724 585L616 157L401 662C393 681 391 683 366 683L233 683C209 683 200 681 200 659C200 649 211 644 232 644C274 644 295 643 296 640L163 110C154 71 131 49 95 42C69 39 39 43 39 15C39 5 45 0 56 0C74 0 136 3 155 3C174 3 238 0 257 0C272 0 279 8 279 24C279 33 271 38 255 39C214 40 194 53 194 78C194 83 195 90 197 100L326 611L576 21C582 7 590 0 599 0C608 0 614 8 618 24L757 574C770 625 798 643 860 644C874 645 881 653 881 669C878 678 877 683 864 683Z"></path></g><g data-mml-node="mi" data-latex="e" transform="translate(1348,0)"><path data-c="1D452" d="M124 129C124 153 129 186 139 227L188 227C253 227 303 235 339 250C372 264 394 284 405 309C412 326 415 342 415 355C415 410 363 442 307 442C268 442 229 432 190 412C113 372 46 281 46 171C46 69 105-11 204-11C257-11 304 2 345 27C379 48 404 69 420 90C427 99 430 106 430 109C430 120 425 126 414 126C409 126 404 122 398 114C365 70 324 42 277 30C246 22 223 18 206 18C149 18 124 72 124 129M375 355C375 289 311 256 182 256L147 256C166 322 194 366 232 387C262 404 287 413 307 413C343 413 375 391 375 355Z"></path></g><g data-mml-node="mi" data-latex="a" transform="translate(1814,0)"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(2343,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g><g data-mml-node="mo" data-latex="," transform="translate(2794,0)"><path data-c="2C" d="M139 106C107 106 86 82 86 50C86 20 109-5 139-5C153-5 165-1 174 8L175 0C175-63 154-117 112-160C105-168 101-174 101-178C101-188 105-193 114-193C123-193 135-181 152-158C186-110 203-57 203 0C203 53 185 106 139 106Z"></path></g><g data-mml-node="mi" data-latex="z" transform="translate(3238.7,0)"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="mi" data-latex="F" transform="translate(3705.7,0)"><path data-c="1D439" d="M199 656C199 646 210 641 231 641C271 641 291 637 291 628C291 625 289 618 286 605L156 82C150 60 140 47 126 42C119 40 101 39 70 39C48 39 38 37 38 16C38 5 44 0 57 0L187 3L335 0C351 0 359 8 359 23C359 40 348 39 322 39C278 39 253 41 247 46C244 47 243 51 243 56L307 321L400 321C446 321 478 319 478 281C478 268 476 252 471 233C470 230 469 226 468 222C468 211 473 206 484 206C489 207 496 214 503 229L557 444C559 452 560 458 560 461C557 470 551 475 544 475C536 475 530 467 526 452C516 414 502 390 486 378C470 366 442 360 402 360L317 360L379 606C387 640 387 641 429 641L559 641C656 641 700 626 700 537C700 517 699 499 697 484C696 473 695 467 695 466C695 455 700 450 710 450C720 450 726 459 728 478L748 649C751 677 744 680 717 680L233 680C210 680 199 679 199 656Z"></path></g><g data-mml-node="mi" data-latex="a" transform="translate(4456.7,0)"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(4985.7,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g></g></g></svg></mjx-container> 分别表示它们在相机空间中的带符号 <mjx-container class="MathJax" jax="SVG" overflow="overflow"><svg style="vertical-align: -0.025ex;" xmlns="http://www.w3.org/2000/svg" width="1.057ex" height="1.025ex" role="img" focusable="false" viewBox="0 -442 467 453"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="z"><g data-mml-node="mi" data-latex="z"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g></g></g></svg></mjx-container> 坐标，因此：</p><p>  <mjx-container class="MathJax" jax="SVG" overflow="overflow" display="true"><svg style="vertical-align: -0.118ex;" xmlns="http://www.w3.org/2000/svg" width="18.46ex" height="1.663ex" role="img" focusable="false" viewBox="0 -683 8159.1 735"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="  zFar < zNear < 0  "><g data-mml-node="mi" data-latex="z"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="mi" data-latex="F" transform="translate(467,0)"><path data-c="1D439" d="M199 656C199 646 210 641 231 641C271 641 291 637 291 628C291 625 289 618 286 605L156 82C150 60 140 47 126 42C119 40 101 39 70 39C48 39 38 37 38 16C38 5 44 0 57 0L187 3L335 0C351 0 359 8 359 23C359 40 348 39 322 39C278 39 253 41 247 46C244 47 243 51 243 56L307 321L400 321C446 321 478 319 478 281C478 268 476 252 471 233C470 230 469 226 468 222C468 211 473 206 484 206C489 207 496 214 503 229L557 444C559 452 560 458 560 461C557 470 551 475 544 475C536 475 530 467 526 452C516 414 502 390 486 378C470 366 442 360 402 360L317 360L379 606C387 640 387 641 429 641L559 641C656 641 700 626 700 537C700 517 699 499 697 484C696 473 695 467 695 466C695 455 700 450 710 450C720 450 726 459 728 478L748 649C751 677 744 680 717 680L233 680C210 680 199 679 199 656Z"></path></g><g data-mml-node="mi" data-latex="a" transform="translate(1218,0)"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(1747,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g><g data-mml-node="mo" data-latex="<" transform="translate(2475.8,0)"><path data-c="3C" d="M666-45C683-52 701-39 701-23C701-13 696-6 687-2L153 250L687 502C696 506 701 513 701 522C701 539 693 547 677 547C673 547 669 546 666 545L92 273C82 268 77 261 77 250C77 239 82 232 92 227Z"></path></g><g data-mml-node="mi" data-latex="z" transform="translate(3531.6,0)"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="mi" data-latex="N" transform="translate(3998.6,0)"><path data-c="1D441" d="M864 683C845 683 783 680 764 680C745 680 682 683 663 683C648 683 641 675 641 659C641 650 648 645 663 644C705 644 726 631 726 605C726 599 725 592 724 585L616 157L401 662C393 681 391 683 366 683L233 683C209 683 200 681 200 659C200 649 211 644 232 644C274 644 295 643 296 640L163 110C154 71 131 49 95 42C69 39 39 43 39 15C39 5 45 0 56 0C74 0 136 3 155 3C174 3 238 0 257 0C272 0 279 8 279 24C279 33 271 38 255 39C214 40 194 53 194 78C194 83 195 90 197 100L326 611L576 21C582 7 590 0 599 0C608 0 614 8 618 24L757 574C770 625 798 643 860 644C874 645 881 653 881 669C878 678 877 683 864 683Z"></path></g><g data-mml-node="mi" data-latex="e" transform="translate(4879.6,0)"><path data-c="1D452" d="M124 129C124 153 129 186 139 227L188 227C253 227 303 235 339 250C372 264 394 284 405 309C412 326 415 342 415 355C415 410 363 442 307 442C268 442 229 432 190 412C113 372 46 281 46 171C46 69 105-11 204-11C257-11 304 2 345 27C379 48 404 69 420 90C427 99 430 106 430 109C430 120 425 126 414 126C409 126 404 122 398 114C365 70 324 42 277 30C246 22 223 18 206 18C149 18 124 72 124 129M375 355C375 289 311 256 182 256L147 256C166 322 194 366 232 387C262 404 287 413 307 413C343 413 375 391 375 355Z"></path></g><g data-mml-node="mi" data-latex="a" transform="translate(5345.6,0)"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(5874.6,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g><g data-mml-node="mo" data-latex="<" transform="translate(6603.3,0)"><path data-c="3C" d="M666-45C683-52 701-39 701-23C701-13 696-6 687-2L153 250L687 502C696 506 701 513 701 522C701 539 693 547 677 547C673 547 669 546 666 545L92 273C82 268 77 261 77 250C77 239 82 232 92 227Z"></path></g><g data-mml-node="mn" data-latex="0" transform="translate(7659.1,0)"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g></g></svg></mjx-container></p></li></ul></div></div></div><ul><li>对于透视投影，摄像机面朝的可视区域不再是一个长方体，而是一个 <strong>截头四棱锥</strong>。投影的思路是先将这个截头四棱锥变换成为正交投影中，被转换为标准立方体之前的长方体可视区域，然后再进行正交投影。 因此透视投影本质上就是在 <mjx-container class="MathJax" jax="SVG" overflow="overflow"><svg style="vertical-align: -0.357ex;" xmlns="http://www.w3.org/2000/svg" width="6.155ex" height="1.902ex" role="img" focusable="false" viewBox="0 -683 2720.4 840.8"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="M_{ortho}"><g data-mml-node="msub" data-latex="M_{ortho}"><g data-mml-node="mi" data-latex="M"><path data-c="1D440" d="M594 16C594 5 600 0 613 0L736 3C759 4 840 0 859 0C874 0 882 8 882 24C882 34 872 39 851 39C810 39 790 43 790 52C790 55 792 62 795 75L927 602C932 623 942 636 955 641C961 643 979 644 1008 644C1033 644 1044 645 1044 668C1044 678 1034 683 1013 683L882 683C853 683 853 681 840 662L484 108L408 657C404 682 402 683 373 683L237 683C215 683 204 682 204 660C204 649 215 644 236 644C256 644 297 647 297 631C297 629 296 623 293 613L167 110C158 72 135 49 100 42C75 39 42 43 42 16C42 5 48 0 60 0C78 0 141 3 159 3C178 3 242 0 261 0C276 0 283 8 283 24C283 33 276 38 261 39C219 39 198 52 198 78C198 82 199 89 202 100L332 621L415 26C418 9 424 0 434 0C442 0 450 7 459 20L848 627L712 82C706 60 696 47 681 42C675 40 656 39 625 39C604 39 594 37 594 16Z"></path></g><g data-mml-node="TeXAtom" transform="translate(1003,-150) scale(0.707)" data-latex="{o r t h o}" data-mjx-texclass="ORD"><g data-mml-node="mi" data-latex="o"><path data-c="1D45C" d="M308 442C239 442 176 412 122 353C68 294 41 229 41 159C41 63 106-11 202-11C272-11 334 19 388 78C442 137 469 201 469 272C469 369 405 442 308 442M389 310C389 287 384 255 374 213C353 130 319 73 272 42C248 26 225 18 203 18C149 18 121 65 121 122C121 180 155 288 178 324C216 383 259 413 307 413C361 413 389 367 389 310Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(485,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g><g data-mml-node="mi" data-latex="t" transform="translate(936,0)"><path data-c="1D461" d="M330 419C330 428 320 433 299 433L218 433C244 537 257 591 257 595C257 616 246 626 225 626C202 626 188 613 182 587L145 433L56 433C34 433 23 432 23 411C23 400 33 395 54 395L135 395C86 200 62 97 62 84C62 28 100-11 156-11C194-11 227 6 256 41C280 70 297 98 308 125C312 136 314 142 314 145C314 154 309 159 299 159C291 159 285 154 281 143C247 60 206 19 157 19C140 19 131 33 131 60C131 75 133 91 137 107L208 395L297 395C323 395 330 397 330 419Z"></path></g><g data-mml-node="mi" data-latex="h" transform="translate(1297,0)"><path data-c="210E" d="M512 138C489 59 457 19 415 19C402 19 395 28 395 47C395 62 401 85 413 116C453 223 473 296 473 335C473 406 427 445 356 445C303 445 257 423 218 380L291 679C289 688 287 694 274 694C241 694 168 685 155 684C140 682 132 675 132 660C132 650 141 645 159 645C180 645 203 646 205 632L59 43C56 32 55 25 55 21C55 0 66-11 87-11C107-11 121-1 128 18L168 182C180 231 189 268 196 293C199 300 207 314 220 334C256 388 300 415 353 415C386 415 402 393 402 350C402 309 382 236 342 130C333 107 329 89 329 74C329 26 365-11 413-11C457-11 492 14 517 65C536 105 546 132 546 145C546 154 541 159 530 159C527 159 512 150 512 138Z"></path></g><g data-mml-node="mi" data-latex="o" transform="translate(1873,0)"><path data-c="1D45C" d="M308 442C239 442 176 412 122 353C68 294 41 229 41 159C41 63 106-11 202-11C272-11 334 19 388 78C442 137 469 201 469 272C469 369 405 442 308 442M389 310C389 287 384 255 374 213C353 130 319 73 272 42C248 26 225 18 203 18C149 18 121 65 121 122C121 180 155 288 178 324C216 383 259 413 307 413C361 413 389 367 389 310Z"></path></g></g></g></g></g></svg></mjx-container> 右侧乘一个新的变换矩阵 <mjx-container class="MathJax" jax="SVG" overflow="overflow"><svg style="vertical-align: -0.65ex;" xmlns="http://www.w3.org/2000/svg" width="12.4ex" height="2.195ex" role="img" focusable="false" viewBox="0 -683 5480.9 970.2"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="M_{persp\_to\_ortho}"><g data-mml-node="msub" data-latex="M_{persp\_to\_ortho}"><g data-mml-node="mi" data-latex="M"><path data-c="1D440" d="M594 16C594 5 600 0 613 0L736 3C759 4 840 0 859 0C874 0 882 8 882 24C882 34 872 39 851 39C810 39 790 43 790 52C790 55 792 62 795 75L927 602C932 623 942 636 955 641C961 643 979 644 1008 644C1033 644 1044 645 1044 668C1044 678 1034 683 1013 683L882 683C853 683 853 681 840 662L484 108L408 657C404 682 402 683 373 683L237 683C215 683 204 682 204 660C204 649 215 644 236 644C256 644 297 647 297 631C297 629 296 623 293 613L167 110C158 72 135 49 100 42C75 39 42 43 42 16C42 5 48 0 60 0C78 0 141 3 159 3C178 3 242 0 261 0C276 0 283 8 283 24C283 33 276 38 261 39C219 39 198 52 198 78C198 82 199 89 202 100L332 621L415 26C418 9 424 0 434 0C442 0 450 7 459 20L848 627L712 82C706 60 696 47 681 42C675 40 656 39 625 39C604 39 594 37 594 16Z"></path></g><g data-mml-node="TeXAtom" transform="translate(1003,-150) scale(0.707)" data-latex="{p e r s p\_t o\_o r t h o}" data-mjx-texclass="ORD"><g data-mml-node="mi" data-latex="p"><path data-c="1D45D" d="M355 442C311 442 269 419 228 373C217 419 186 442 137 442C96 442 66 409 45 344C35 311 30 292 30 286C30 277 35 272 46 272C51 272 54 273 57 275C62 284 65 291 66 298C84 374 107 412 134 412C152 412 161 398 161 371C161 356 159 339 154 321L44-118C35-151 34-155-5-155C-23-155-32-163-32-178C-32-189-26-194-15-194C0-194 52-191 67-191C86-191 146-194 165-194C180-194 187-186 187-170C187-160 178-155 159-155C141-155 114-156 114-144C114-131 155 26 159 43C179 6 209-13 249-13C314-13 371 20 421 87C467 148 490 213 490 280C490 367 438 442 355 442M352 412C391 412 411 382 411 323C411 296 405 260 394 215C371 128 342 71 307 42C286 25 267 16 248 16C219 16 199 29 188 56C179 77 174 92 174 100L225 309C230 331 248 354 276 377C304 400 329 412 352 412Z"></path></g><g data-mml-node="mi" data-latex="e" transform="translate(503,0)"><path data-c="1D452" d="M124 129C124 153 129 186 139 227L188 227C253 227 303 235 339 250C372 264 394 284 405 309C412 326 415 342 415 355C415 410 363 442 307 442C268 442 229 432 190 412C113 372 46 281 46 171C46 69 105-11 204-11C257-11 304 2 345 27C379 48 404 69 420 90C427 99 430 106 430 109C430 120 425 126 414 126C409 126 404 122 398 114C365 70 324 42 277 30C246 22 223 18 206 18C149 18 124 72 124 129M375 355C375 289 311 256 182 256L147 256C166 322 194 366 232 387C262 404 287 413 307 413C343 413 375 391 375 355Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(969,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g><g data-mml-node="mi" data-latex="s" transform="translate(1420,0)"><path data-c="1D460" d="M420 354C420 411 362 442 300 442C237 442 192 423 165 385C142 352 130 322 130 295C130 242 165 208 234 193C263 188 285 181 302 173C323 164 333 147 333 123C333 105 325 85 308 62C287 33 250 18 197 18C143 18 108 33 92 62C124 61 151 87 151 119C151 144 138 157 111 157C75 157 52 124 52 88C52 22 124-11 196-11C271-11 325 11 357 56C384 93 397 126 397 156C397 199 376 231 335 252C304 263 280 270 265 273C230 282 194 285 194 328C194 381 244 413 300 413C342 413 369 400 382 375C360 371 337 352 337 327C337 306 348 295 371 295C402 295 420 323 420 354Z"></path></g><g data-mml-node="mi" data-latex="p" transform="translate(1889,0)"><path data-c="1D45D" d="M355 442C311 442 269 419 228 373C217 419 186 442 137 442C96 442 66 409 45 344C35 311 30 292 30 286C30 277 35 272 46 272C51 272 54 273 57 275C62 284 65 291 66 298C84 374 107 412 134 412C152 412 161 398 161 371C161 356 159 339 154 321L44-118C35-151 34-155-5-155C-23-155-32-163-32-178C-32-189-26-194-15-194C0-194 52-191 67-191C86-191 146-194 165-194C180-194 187-186 187-170C187-160 178-155 159-155C141-155 114-156 114-144C114-131 155 26 159 43C179 6 209-13 249-13C314-13 371 20 421 87C467 148 490 213 490 280C490 367 438 442 355 442M352 412C391 412 411 382 411 323C411 296 405 260 394 215C371 128 342 71 307 42C286 25 267 16 248 16C219 16 199 29 188 56C179 77 174 92 174 100L225 309C230 331 248 354 276 377C304 400 329 412 352 412Z"></path></g><g data-mml-node="mi" data-latex="\_" transform="translate(2392,0)"><path data-c="5F" d="M0-140L333-140L333-100L0-100Z"></path></g><g data-mml-node="mi" data-latex="t" transform="translate(2725,0)"><path data-c="1D461" d="M330 419C330 428 320 433 299 433L218 433C244 537 257 591 257 595C257 616 246 626 225 626C202 626 188 613 182 587L145 433L56 433C34 433 23 432 23 411C23 400 33 395 54 395L135 395C86 200 62 97 62 84C62 28 100-11 156-11C194-11 227 6 256 41C280 70 297 98 308 125C312 136 314 142 314 145C314 154 309 159 299 159C291 159 285 154 281 143C247 60 206 19 157 19C140 19 131 33 131 60C131 75 133 91 137 107L208 395L297 395C323 395 330 397 330 419Z"></path></g><g data-mml-node="mi" data-latex="o" transform="translate(3086,0)"><path data-c="1D45C" d="M308 442C239 442 176 412 122 353C68 294 41 229 41 159C41 63 106-11 202-11C272-11 334 19 388 78C442 137 469 201 469 272C469 369 405 442 308 442M389 310C389 287 384 255 374 213C353 130 319 73 272 42C248 26 225 18 203 18C149 18 121 65 121 122C121 180 155 288 178 324C216 383 259 413 307 413C361 413 389 367 389 310Z"></path></g><g data-mml-node="mi" data-latex="\_" transform="translate(3571,0)"><path data-c="5F" d="M0-140L333-140L333-100L0-100Z"></path></g><g data-mml-node="mi" data-latex="o" transform="translate(3904,0)"><path data-c="1D45C" d="M308 442C239 442 176 412 122 353C68 294 41 229 41 159C41 63 106-11 202-11C272-11 334 19 388 78C442 137 469 201 469 272C469 369 405 442 308 442M389 310C389 287 384 255 374 213C353 130 319 73 272 42C248 26 225 18 203 18C149 18 121 65 121 122C121 180 155 288 178 324C216 383 259 413 307 413C361 413 389 367 389 310Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(4389,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g><g data-mml-node="mi" data-latex="t" transform="translate(4840,0)"><path data-c="1D461" d="M330 419C330 428 320 433 299 433L218 433C244 537 257 591 257 595C257 616 246 626 225 626C202 626 188 613 182 587L145 433L56 433C34 433 23 432 23 411C23 400 33 395 54 395L135 395C86 200 62 97 62 84C62 28 100-11 156-11C194-11 227 6 256 41C280 70 297 98 308 125C312 136 314 142 314 145C314 154 309 159 299 159C291 159 285 154 281 143C247 60 206 19 157 19C140 19 131 33 131 60C131 75 133 91 137 107L208 395L297 395C323 395 330 397 330 419Z"></path></g><g data-mml-node="mi" data-latex="h" transform="translate(5201,0)"><path data-c="210E" d="M512 138C489 59 457 19 415 19C402 19 395 28 395 47C395 62 401 85 413 116C453 223 473 296 473 335C473 406 427 445 356 445C303 445 257 423 218 380L291 679C289 688 287 694 274 694C241 694 168 685 155 684C140 682 132 675 132 660C132 650 141 645 159 645C180 645 203 646 205 632L59 43C56 32 55 25 55 21C55 0 66-11 87-11C107-11 121-1 128 18L168 182C180 231 189 268 196 293C199 300 207 314 220 334C256 388 300 415 353 415C386 415 402 393 402 350C402 309 382 236 342 130C333 107 329 89 329 74C329 26 365-11 413-11C457-11 492 14 517 65C536 105 546 132 546 145C546 154 541 159 530 159C527 159 512 150 512 138Z"></path></g><g data-mml-node="mi" data-latex="o" transform="translate(5777,0)"><path data-c="1D45C" d="M308 442C239 442 176 412 122 353C68 294 41 229 41 159C41 63 106-11 202-11C272-11 334 19 388 78C442 137 469 201 469 272C469 369 405 442 308 442M389 310C389 287 384 255 374 213C353 130 319 73 272 42C248 26 225 18 203 18C149 18 121 65 121 122C121 180 155 288 178 324C216 383 259 413 307 413C361 413 389 367 389 310Z"></path></g></g></g></g></g></svg></mjx-container>（先将截头四棱锥变换为正交可视区域，也就是那个长方体）。</li></ul><img src="https://files.seeusercontent.com/2026/08/22/piU6/otho.png" alt="otho.png" width="600"><div style="margin: 10px"></div><img src="https://files.seeusercontent.com/2026/08/22/q0pR/persp.png" alt="persp.png" width="600"><div class="callout callout--titled info mb-4 rounded-small shadow-redefine-flat bg-(--callout-bg-color) p-3 pl-1 relative flex flex-row gap-2"><div role="none" class="rounded-full self-stretch w-0.5 bg-(--callout-primary-color) shrink-0 opacity-60"></div><div class="flex flex-col gap-2"><div class="callout__title flex items-center gap-2 font-semibold tracking-tight"><i class="callout__icon fa-solid leading-none text-(--callout-primary-color) text-sm shrink-0"></i> NOTE</div><div class="callout__content markdown-body flex-1 min-w-0"><p>上图有些许的不准确，因为透视投影中，截头四棱锥的近截面应该在 <mjx-container class="MathJax" jax="SVG" overflow="overflow"><svg style="vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="1.057ex" height="2.262ex" role="img" focusable="false" viewBox="0 -750 467 1000"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="z = zNear"><g data-mml-node="mi" data-latex="z"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g></g></g></svg><mjx-break size="4"> </mjx-break><svg style="vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="8.71ex" height="2.262ex" role="img" focusable="false" viewBox="0 -750 3849.8 1000"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="z = zNear"><g data-mml-node="mo" data-latex="="><path data-c="3D" d="M698 367L80 367C64 367 56 359 56 344C56 329 64 321 80 321L698 321C714 321 722 329 722 344C722 356 711 367 698 367M698 179L80 179C64 179 56 171 56 156C56 141 64 133 80 133L698 133C714 133 722 141 722 156C722 169 711 179 698 179Z"></path></g><g data-mml-node="mi" data-latex="z" transform="translate(1055.8,0)"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="mi" data-latex="N" transform="translate(1522.8,0)"><path data-c="1D441" d="M864 683C845 683 783 680 764 680C745 680 682 683 663 683C648 683 641 675 641 659C641 650 648 645 663 644C705 644 726 631 726 605C726 599 725 592 724 585L616 157L401 662C393 681 391 683 366 683L233 683C209 683 200 681 200 659C200 649 211 644 232 644C274 644 295 643 296 640L163 110C154 71 131 49 95 42C69 39 39 43 39 15C39 5 45 0 56 0C74 0 136 3 155 3C174 3 238 0 257 0C272 0 279 8 279 24C279 33 271 38 255 39C214 40 194 53 194 78C194 83 195 90 197 100L326 611L576 21C582 7 590 0 599 0C608 0 614 8 618 24L757 574C770 625 798 643 860 644C874 645 881 653 881 669C878 678 877 683 864 683Z"></path></g><g data-mml-node="mi" data-latex="e" transform="translate(2403.8,0)"><path data-c="1D452" d="M124 129C124 153 129 186 139 227L188 227C253 227 303 235 339 250C372 264 394 284 405 309C412 326 415 342 415 355C415 410 363 442 307 442C268 442 229 432 190 412C113 372 46 281 46 171C46 69 105-11 204-11C257-11 304 2 345 27C379 48 404 69 420 90C427 99 430 106 430 109C430 120 425 126 414 126C409 126 404 122 398 114C365 70 324 42 277 30C246 22 223 18 206 18C149 18 124 72 124 129M375 355C375 289 311 256 182 256L147 256C166 322 194 366 232 387C262 404 287 413 307 413C343 413 375 391 375 355Z"></path></g><g data-mml-node="mi" data-latex="a" transform="translate(2869.8,0)"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(3398.8,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g></g></g></svg></mjx-container> 上，而不是 <mjx-container class="MathJax" jax="SVG" overflow="overflow"><svg style="vertical-align: -0.464ex;" xmlns="http://www.w3.org/2000/svg" width="2.403ex" height="1.464ex" role="img" focusable="false" viewBox="0 -442 1062 647"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="xy"><g data-mml-node="mi" data-latex="x"><path data-c="1D465" d="M527 373C527 419 482 442 432 442C389 442 355 419 329 373C308 419 273 442 222 442C173 442 133 419 101 374C74 335 60 306 60 287C60 278 65 273 75 273C84 273 90 278 92 287C111 345 153 413 220 413C253 413 269 392 269 351C269 330 251 252 216 118C199 51 169 18 126 18C112 18 99 21 88 26C114 36 127 54 127 80C127 106 114 119 87 119C54 119 29 91 29 58C29 12 76-11 125-11C167-11 201 12 228 58C247 12 283-11 335-11C383-11 423 12 455 57C482 96 496 125 496 144C496 153 491 158 481 158C472 158 467 153 464 144C447 87 402 18 337 18C304 18 287 38 287 79C287 92 292 120 303 165L337 300C356 375 387 413 431 413C445 413 458 410 469 405C442 396 429 378 429 351C429 325 443 312 470 312C502 312 527 341 527 373Z"></path></g><g data-mml-node="mi" data-latex="y" transform="translate(572,0)"><path data-c="1D466" d="M163 442C118 442 83 417 58 367C39 328 29 301 29 286C29 277 34 272 45 272C59 272 60 278 64 293C87 372 119 412 160 412C173 412 180 403 180 385C180 369 175 346 164 317C126 214 107 145 107 108C107 32 154-13 231-13C264-13 295-1 323 23C288-109 233-175 158-175C124-175 101-164 89-142C129-140 149-121 149-85C149-60 136-47 109-47C72-47 50-78 50-115C50-170 100-205 158-205C273-205 367-99 392-1L486 377C489 388 490 396 490 401C490 421 479 431 458 431C442 431 429 423 420 408C414 387 409 369 406 354L342 97C332 61 279 16 234 16C196 16 177 41 177 92C177 134 194 198 227 284C240 319 247 343 247 357C247 406 212 442 163 442Z"></path></g></g></g></svg></mjx-container> 平面。</p></div></div></div><ul><li><p>观察上图可知：</p><ol><li>截头四棱锥中任意垂直于 <mjx-container class="MathJax" jax="SVG" overflow="overflow"><svg style="vertical-align: -0.025ex;" xmlns="http://www.w3.org/2000/svg" width="1.057ex" height="1.025ex" role="img" focusable="false" viewBox="0 -442 467 453"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="z"><g data-mml-node="mi" data-latex="z"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g></g></g></svg></mjx-container> 轴的截面，都将被缩放到 <mjx-container class="MathJax" jax="SVG" overflow="overflow"><svg style="vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="1.057ex" height="2.262ex" role="img" focusable="false" viewBox="0 -750 467 1000"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="z = zNear"><g data-mml-node="mi" data-latex="z"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g></g></g></svg><mjx-break size="4"> </mjx-break><svg style="vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="8.71ex" height="2.262ex" role="img" focusable="false" viewBox="0 -750 3849.8 1000"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="z = zNear"><g data-mml-node="mo" data-latex="="><path data-c="3D" d="M698 367L80 367C64 367 56 359 56 344C56 329 64 321 80 321L698 321C714 321 722 329 722 344C722 356 711 367 698 367M698 179L80 179C64 179 56 171 56 156C56 141 64 133 80 133L698 133C714 133 722 141 722 156C722 169 711 179 698 179Z"></path></g><g data-mml-node="mi" data-latex="z" transform="translate(1055.8,0)"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="mi" data-latex="N" transform="translate(1522.8,0)"><path data-c="1D441" d="M864 683C845 683 783 680 764 680C745 680 682 683 663 683C648 683 641 675 641 659C641 650 648 645 663 644C705 644 726 631 726 605C726 599 725 592 724 585L616 157L401 662C393 681 391 683 366 683L233 683C209 683 200 681 200 659C200 649 211 644 232 644C274 644 295 643 296 640L163 110C154 71 131 49 95 42C69 39 39 43 39 15C39 5 45 0 56 0C74 0 136 3 155 3C174 3 238 0 257 0C272 0 279 8 279 24C279 33 271 38 255 39C214 40 194 53 194 78C194 83 195 90 197 100L326 611L576 21C582 7 590 0 599 0C608 0 614 8 618 24L757 574C770 625 798 643 860 644C874 645 881 653 881 669C878 678 877 683 864 683Z"></path></g><g data-mml-node="mi" data-latex="e" transform="translate(2403.8,0)"><path data-c="1D452" d="M124 129C124 153 129 186 139 227L188 227C253 227 303 235 339 250C372 264 394 284 405 309C412 326 415 342 415 355C415 410 363 442 307 442C268 442 229 432 190 412C113 372 46 281 46 171C46 69 105-11 204-11C257-11 304 2 345 27C379 48 404 69 420 90C427 99 430 106 430 109C430 120 425 126 414 126C409 126 404 122 398 114C365 70 324 42 277 30C246 22 223 18 206 18C149 18 124 72 124 129M375 355C375 289 311 256 182 256L147 256C166 322 194 366 232 387C262 404 287 413 307 413C343 413 375 391 375 355Z"></path></g><g data-mml-node="mi" data-latex="a" transform="translate(2869.8,0)"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(3398.8,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g></g></g></svg></mjx-container> 的平面大小</li><li><mjx-container class="MathJax" jax="SVG" overflow="overflow"><svg style="vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="1.057ex" height="2.262ex" role="img" focusable="false" viewBox="0 -750 467 1000"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="z = zNear"><g data-mml-node="mi" data-latex="z"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g></g></g></svg><mjx-break size="4"> </mjx-break><svg style="vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="8.71ex" height="2.262ex" role="img" focusable="false" viewBox="0 -750 3849.8 1000"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="z = zNear"><g data-mml-node="mo" data-latex="="><path data-c="3D" d="M698 367L80 367C64 367 56 359 56 344C56 329 64 321 80 321L698 321C714 321 722 329 722 344C722 356 711 367 698 367M698 179L80 179C64 179 56 171 56 156C56 141 64 133 80 133L698 133C714 133 722 141 722 156C722 169 711 179 698 179Z"></path></g><g data-mml-node="mi" data-latex="z" transform="translate(1055.8,0)"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="mi" data-latex="N" transform="translate(1522.8,0)"><path data-c="1D441" d="M864 683C845 683 783 680 764 680C745 680 682 683 663 683C648 683 641 675 641 659C641 650 648 645 663 644C705 644 726 631 726 605C726 599 725 592 724 585L616 157L401 662C393 681 391 683 366 683L233 683C209 683 200 681 200 659C200 649 211 644 232 644C274 644 295 643 296 640L163 110C154 71 131 49 95 42C69 39 39 43 39 15C39 5 45 0 56 0C74 0 136 3 155 3C174 3 238 0 257 0C272 0 279 8 279 24C279 33 271 38 255 39C214 40 194 53 194 78C194 83 195 90 197 100L326 611L576 21C582 7 590 0 599 0C608 0 614 8 618 24L757 574C770 625 798 643 860 644C874 645 881 653 881 669C878 678 877 683 864 683Z"></path></g><g data-mml-node="mi" data-latex="e" transform="translate(2403.8,0)"><path data-c="1D452" d="M124 129C124 153 129 186 139 227L188 227C253 227 303 235 339 250C372 264 394 284 405 309C412 326 415 342 415 355C415 410 363 442 307 442C268 442 229 432 190 412C113 372 46 281 46 171C46 69 105-11 204-11C257-11 304 2 345 27C379 48 404 69 420 90C427 99 430 106 430 109C430 120 425 126 414 126C409 126 404 122 398 114C365 70 324 42 277 30C246 22 223 18 206 18C149 18 124 72 124 129M375 355C375 289 311 256 182 256L147 256C166 322 194 366 232 387C262 404 287 413 307 413C343 413 375 391 375 355Z"></path></g><g data-mml-node="mi" data-latex="a" transform="translate(2869.8,0)"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(3398.8,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g></g></g></svg></mjx-container> 和 <mjx-container class="MathJax" jax="SVG" overflow="overflow"><svg style="vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="1.057ex" height="2.262ex" role="img" focusable="false" viewBox="0 -750 467 1000"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="z = zFar"><g data-mml-node="mi" data-latex="z"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g></g></g></svg><mjx-break size="4"> </mjx-break><svg style="vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="7.361ex" height="2.262ex" role="img" focusable="false" viewBox="0 -750 3253.8 1000"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="z = zFar"><g data-mml-node="mo" data-latex="="><path data-c="3D" d="M698 367L80 367C64 367 56 359 56 344C56 329 64 321 80 321L698 321C714 321 722 329 722 344C722 356 711 367 698 367M698 179L80 179C64 179 56 171 56 156C56 141 64 133 80 133L698 133C714 133 722 141 722 156C722 169 711 179 698 179Z"></path></g><g data-mml-node="mi" data-latex="z" transform="translate(1055.8,0)"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="mi" data-latex="F" transform="translate(1522.8,0)"><path data-c="1D439" d="M199 656C199 646 210 641 231 641C271 641 291 637 291 628C291 625 289 618 286 605L156 82C150 60 140 47 126 42C119 40 101 39 70 39C48 39 38 37 38 16C38 5 44 0 57 0L187 3L335 0C351 0 359 8 359 23C359 40 348 39 322 39C278 39 253 41 247 46C244 47 243 51 243 56L307 321L400 321C446 321 478 319 478 281C478 268 476 252 471 233C470 230 469 226 468 222C468 211 473 206 484 206C489 207 496 214 503 229L557 444C559 452 560 458 560 461C557 470 551 475 544 475C536 475 530 467 526 452C516 414 502 390 486 378C470 366 442 360 402 360L317 360L379 606C387 640 387 641 429 641L559 641C656 641 700 626 700 537C700 517 699 499 697 484C696 473 695 467 695 466C695 455 700 450 710 450C720 450 726 459 728 478L748 649C751 677 744 680 717 680L233 680C210 680 199 679 199 656Z"></path></g><g data-mml-node="mi" data-latex="a" transform="translate(2273.8,0)"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(2802.8,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g></g></g></svg></mjx-container> 处的平面，变换前后的齐次坐标在完成齐次除法之后，其三维坐标中的深度仍然是 <mjx-container class="MathJax" jax="SVG" overflow="overflow"><svg style="vertical-align: -0.025ex;" xmlns="http://www.w3.org/2000/svg" width="6.321ex" height="1.57ex" role="img" focusable="false" viewBox="0 -683 2794 694"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="zNear"><g data-mml-node="mi" data-latex="z"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="mi" data-latex="N" transform="translate(467,0)"><path data-c="1D441" d="M864 683C845 683 783 680 764 680C745 680 682 683 663 683C648 683 641 675 641 659C641 650 648 645 663 644C705 644 726 631 726 605C726 599 725 592 724 585L616 157L401 662C393 681 391 683 366 683L233 683C209 683 200 681 200 659C200 649 211 644 232 644C274 644 295 643 296 640L163 110C154 71 131 49 95 42C69 39 39 43 39 15C39 5 45 0 56 0C74 0 136 3 155 3C174 3 238 0 257 0C272 0 279 8 279 24C279 33 271 38 255 39C214 40 194 53 194 78C194 83 195 90 197 100L326 611L576 21C582 7 590 0 599 0C608 0 614 8 618 24L757 574C770 625 798 643 860 644C874 645 881 653 881 669C878 678 877 683 864 683Z"></path></g><g data-mml-node="mi" data-latex="e" transform="translate(1348,0)"><path data-c="1D452" d="M124 129C124 153 129 186 139 227L188 227C253 227 303 235 339 250C372 264 394 284 405 309C412 326 415 342 415 355C415 410 363 442 307 442C268 442 229 432 190 412C113 372 46 281 46 171C46 69 105-11 204-11C257-11 304 2 345 27C379 48 404 69 420 90C427 99 430 106 430 109C430 120 425 126 414 126C409 126 404 122 398 114C365 70 324 42 277 30C246 22 223 18 206 18C149 18 124 72 124 129M375 355C375 289 311 256 182 256L147 256C166 322 194 366 232 387C262 404 287 413 307 413C343 413 375 391 375 355Z"></path></g><g data-mml-node="mi" data-latex="a" transform="translate(1814,0)"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(2343,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g></g></g></svg></mjx-container> 和 <mjx-container class="MathJax" jax="SVG" overflow="overflow"><svg style="vertical-align: -0.025ex;" xmlns="http://www.w3.org/2000/svg" width="4.973ex" height="1.563ex" role="img" focusable="false" viewBox="0 -680 2198 691"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="zFar"><g data-mml-node="mi" data-latex="z"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="mi" data-latex="F" transform="translate(467,0)"><path data-c="1D439" d="M199 656C199 646 210 641 231 641C271 641 291 637 291 628C291 625 289 618 286 605L156 82C150 60 140 47 126 42C119 40 101 39 70 39C48 39 38 37 38 16C38 5 44 0 57 0L187 3L335 0C351 0 359 8 359 23C359 40 348 39 322 39C278 39 253 41 247 46C244 47 243 51 243 56L307 321L400 321C446 321 478 319 478 281C478 268 476 252 471 233C470 230 469 226 468 222C468 211 473 206 484 206C489 207 496 214 503 229L557 444C559 452 560 458 560 461C557 470 551 475 544 475C536 475 530 467 526 452C516 414 502 390 486 378C470 366 442 360 402 360L317 360L379 606C387 640 387 641 429 641L559 641C656 641 700 626 700 537C700 517 699 499 697 484C696 473 695 467 695 466C695 455 700 450 710 450C720 450 726 459 728 478L748 649C751 677 744 680 717 680L233 680C210 680 199 679 199 656Z"></path></g><g data-mml-node="mi" data-latex="a" transform="translate(1218,0)"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(1747,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g></g></g></svg></mjx-container></li></ol></li><li><p>可以通过一个简单的剖面图理解这种变换的规律：</p></li></ul><img src="https://files.seeusercontent.com/2026/08/22/oBj5/persp_to_ortho.png" alt="persp_to_ortho.png" width="500"><ul><li><p>显然，对于平面 <mjx-container class="MathJax" jax="SVG" overflow="overflow"><svg style="vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="6.033ex" height="2.262ex" role="img" focusable="false" viewBox="0 -750 2666.5 1000"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="z_{k}, (z_{k} \in [zFar, zNear])"><g data-mml-node="msub" data-latex="z_{k}"><g data-mml-node="mi" data-latex="z"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="TeXAtom" transform="translate(498,-150) scale(0.707)" data-latex="{k}" data-mjx-texclass="ORD"><g data-mml-node="mi" data-latex="k"><path data-c="1D458" d="M409 353C409 327 423 314 450 314C485 314 508 345 508 379C508 418 476 445 437 445C392 445 344 415 291 356C250 311 217 282 190 269L291 679C289 688 287 694 274 694C242 694 166 685 154 684C139 682 132 675 132 660C132 650 141 645 159 645C178 645 204 646 204 632L59 43C56 32 55 25 55 21C55 0 66-11 87-11C104-11 117-3 124 12C129 21 147 92 179 226C231 221 286 196 286 146C286 131 279 101 279 91C279 34 316-11 373-11C431-11 470 41 490 145C490 154 485 159 475 159C466 159 460 152 457 138C435 59 408 19 375 19C357 19 348 33 348 61C348 77 360 131 360 147C360 204 314 239 221 253C244 269 270 292 298 322C326 352 346 371 359 382C386 404 412 415 435 415C445 415 453 413 459 409C432 404 409 379 409 353Z"></path></g></g></g><g data-mml-node="mo" data-latex="," transform="translate(916.4,0)"><path data-c="2C" d="M139 106C107 106 86 82 86 50C86 20 109-5 139-5C153-5 165-1 174 8L175 0C175-63 154-117 112-160C105-168 101-174 101-178C101-188 105-193 114-193C123-193 135-181 152-158C186-110 203-57 203 0C203 53 185 106 139 106Z"></path></g><g data-mml-node="mo" data-latex="(" transform="translate(1361.1,0)"><path data-c="28" d="M318-248C327-248 332-243 332-234C332-231 330-227 327-223C275-183 233-117 202-26C175 53 161 131 161 208L161 292C161 369 175 447 202 526C233 617 275 683 327 723C330 726 332 730 332 734C332 743 327 748 318 748C317 748 314 747 311 745C251 699 201 631 160 540C121 453 101 371 101 292L101 208C101 129 121 47 160-40C201-131 251-199 311-245C314-247 317-248 318-248Z"></path></g><g data-mml-node="msub" data-latex="z_{k}" transform="translate(1750.1,0)"><g data-mml-node="mi" data-latex="z"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="TeXAtom" transform="translate(498,-150) scale(0.707)" data-latex="{k}" data-mjx-texclass="ORD"><g data-mml-node="mi" data-latex="k"><path data-c="1D458" d="M409 353C409 327 423 314 450 314C485 314 508 345 508 379C508 418 476 445 437 445C392 445 344 415 291 356C250 311 217 282 190 269L291 679C289 688 287 694 274 694C242 694 166 685 154 684C139 682 132 675 132 660C132 650 141 645 159 645C178 645 204 646 204 632L59 43C56 32 55 25 55 21C55 0 66-11 87-11C104-11 117-3 124 12C129 21 147 92 179 226C231 221 286 196 286 146C286 131 279 101 279 91C279 34 316-11 373-11C431-11 470 41 490 145C490 154 485 159 475 159C466 159 460 152 457 138C435 59 408 19 375 19C357 19 348 33 348 61C348 77 360 131 360 147C360 204 314 239 221 253C244 269 270 292 298 322C326 352 346 371 359 382C386 404 412 415 435 415C445 415 453 413 459 409C432 404 409 379 409 353Z"></path></g></g></g></g></g></svg><mjx-break size="4"> </mjx-break><svg style="vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="16.576ex" height="2.262ex" role="img" focusable="false" viewBox="0 -750 7326.4 1000"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="z_{k}, (z_{k} \in [zFar, zNear])"><g data-mml-node="mo" data-latex="\in"><path data-c="2208" d="M563 4L373 4C310 4 254 25 208 68C162 111 136 163 130 226L563 226C579 226 587 234 587 250C587 266 579 274 563 274L130 274C136 337 162 389 208 432C254 475 310 496 373 496L563 496C579 496 587 504 587 519C587 535 579 543 563 543L373 543C292 543 223 515 166 458C109 401 81 332 81 250C81 168 109 99 166 42C223-15 292-43 373-43L563-43C579-43 587-35 587-19C587-7 576 4 563 4Z"></path></g><g data-mml-node="mo" data-latex="[" transform="translate(944.8,0)"><path data-c="5B" d="M233-202L159-202L159 702L233 702C248 702 256 710 256 726C256 742 248 750 233 750L114 750L114-250L233-250C248-250 256-242 256-226C256-214 245-202 233-202Z"></path></g><g data-mml-node="mi" data-latex="z" transform="translate(1222.8,0)"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="mi" data-latex="F" transform="translate(1689.8,0)"><path data-c="1D439" d="M199 656C199 646 210 641 231 641C271 641 291 637 291 628C291 625 289 618 286 605L156 82C150 60 140 47 126 42C119 40 101 39 70 39C48 39 38 37 38 16C38 5 44 0 57 0L187 3L335 0C351 0 359 8 359 23C359 40 348 39 322 39C278 39 253 41 247 46C244 47 243 51 243 56L307 321L400 321C446 321 478 319 478 281C478 268 476 252 471 233C470 230 469 226 468 222C468 211 473 206 484 206C489 207 496 214 503 229L557 444C559 452 560 458 560 461C557 470 551 475 544 475C536 475 530 467 526 452C516 414 502 390 486 378C470 366 442 360 402 360L317 360L379 606C387 640 387 641 429 641L559 641C656 641 700 626 700 537C700 517 699 499 697 484C696 473 695 467 695 466C695 455 700 450 710 450C720 450 726 459 728 478L748 649C751 677 744 680 717 680L233 680C210 680 199 679 199 656Z"></path></g><g data-mml-node="mi" data-latex="a" transform="translate(2440.8,0)"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(2969.8,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g><g data-mml-node="mo" data-latex="," transform="translate(3420.8,0)"><path data-c="2C" d="M139 106C107 106 86 82 86 50C86 20 109-5 139-5C153-5 165-1 174 8L175 0C175-63 154-117 112-160C105-168 101-174 101-178C101-188 105-193 114-193C123-193 135-181 152-158C186-110 203-57 203 0C203 53 185 106 139 106Z"></path></g><g data-mml-node="mi" data-latex="z" transform="translate(3865.4,0)"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="mi" data-latex="N" transform="translate(4332.4,0)"><path data-c="1D441" d="M864 683C845 683 783 680 764 680C745 680 682 683 663 683C648 683 641 675 641 659C641 650 648 645 663 644C705 644 726 631 726 605C726 599 725 592 724 585L616 157L401 662C393 681 391 683 366 683L233 683C209 683 200 681 200 659C200 649 211 644 232 644C274 644 295 643 296 640L163 110C154 71 131 49 95 42C69 39 39 43 39 15C39 5 45 0 56 0C74 0 136 3 155 3C174 3 238 0 257 0C272 0 279 8 279 24C279 33 271 38 255 39C214 40 194 53 194 78C194 83 195 90 197 100L326 611L576 21C582 7 590 0 599 0C608 0 614 8 618 24L757 574C770 625 798 643 860 644C874 645 881 653 881 669C878 678 877 683 864 683Z"></path></g><g data-mml-node="mi" data-latex="e" transform="translate(5213.4,0)"><path data-c="1D452" d="M124 129C124 153 129 186 139 227L188 227C253 227 303 235 339 250C372 264 394 284 405 309C412 326 415 342 415 355C415 410 363 442 307 442C268 442 229 432 190 412C113 372 46 281 46 171C46 69 105-11 204-11C257-11 304 2 345 27C379 48 404 69 420 90C427 99 430 106 430 109C430 120 425 126 414 126C409 126 404 122 398 114C365 70 324 42 277 30C246 22 223 18 206 18C149 18 124 72 124 129M375 355C375 289 311 256 182 256L147 256C166 322 194 366 232 387C262 404 287 413 307 413C343 413 375 391 375 355Z"></path></g><g data-mml-node="mi" data-latex="a" transform="translate(5679.4,0)"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(6208.4,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g><g data-mml-node="mo" data-latex="]" transform="translate(6659.4,0)"><path data-c="5D" d="M45-250L164-250L164 750L45 750C30 750 22 742 22 726C22 710 30 702 45 702L119 702L119-202L45-202C30-202 22-210 22-226C22-242 30-250 45-250Z"></path></g><g data-mml-node="mo" data-latex=")" transform="translate(6937.4,0)"><path data-c="29" d="M78-245C138-199 188-131 229-40C268 47 288 129 288 208L288 292C288 371 268 453 229 540C188 631 138 699 78 745C75 747 72 748 71 748C62 748 57 743 57 734C57 730 59 726 62 723C114 683 156 617 187 526C214 447 228 369 228 292L228 208C228 131 214 53 187-26C156-117 114-183 62-223C59-227 57-231 57-234C57-243 62-248 71-248C72-248 75-247 78-245Z"></path></g></g></g></svg></mjx-container> 上的点 <mjx-container class="MathJax" jax="SVG" overflow="overflow"><svg style="vertical-align: -0.561ex;" xmlns="http://www.w3.org/2000/svg" width="9.954ex" height="2.253ex" role="img" focusable="false" viewBox="0 -748 4399.7 996"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="P(x, y, z_{k})"><g data-mml-node="mi" data-latex="P"><path data-c="1D443" d="M555 683L235 683C212 683 201 682 201 660C201 649 212 644 234 644C254 644 294 647 294 631C294 629 293 623 290 613L158 82C152 60 142 47 128 42C121 40 103 39 72 39C50 39 40 37 40 16C40 5 46 0 59 0L184 3L248 2C259 2 299 0 312 0C328 0 336 8 336 24C336 34 325 39 304 39C264 39 244 43 244 52C244 52 245 55 247 68L307 312L472 312C537 312 599 332 657 371C722 414 754 467 754 530C754 629 660 683 555 683M524 644C611 644 654 614 654 554C654 498 626 423 597 397C559 363 509 346 447 346L313 346L379 610C387 644 387 644 429 644Z"></path></g><g data-mml-node="mo" data-latex="(" transform="translate(754,0)"><path data-c="28" d="M318-248C327-248 332-243 332-234C332-231 330-227 327-223C275-183 233-117 202-26C175 53 161 131 161 208L161 292C161 369 175 447 202 526C233 617 275 683 327 723C330 726 332 730 332 734C332 743 327 748 318 748C317 748 314 747 311 745C251 699 201 631 160 540C121 453 101 371 101 292L101 208C101 129 121 47 160-40C201-131 251-199 311-245C314-247 317-248 318-248Z"></path></g><g data-mml-node="mi" data-latex="x" transform="translate(1143,0)"><path data-c="1D465" d="M527 373C527 419 482 442 432 442C389 442 355 419 329 373C308 419 273 442 222 442C173 442 133 419 101 374C74 335 60 306 60 287C60 278 65 273 75 273C84 273 90 278 92 287C111 345 153 413 220 413C253 413 269 392 269 351C269 330 251 252 216 118C199 51 169 18 126 18C112 18 99 21 88 26C114 36 127 54 127 80C127 106 114 119 87 119C54 119 29 91 29 58C29 12 76-11 125-11C167-11 201 12 228 58C247 12 283-11 335-11C383-11 423 12 455 57C482 96 496 125 496 144C496 153 491 158 481 158C472 158 467 153 464 144C447 87 402 18 337 18C304 18 287 38 287 79C287 92 292 120 303 165L337 300C356 375 387 413 431 413C445 413 458 410 469 405C442 396 429 378 429 351C429 325 443 312 470 312C502 312 527 341 527 373Z"></path></g><g data-mml-node="mo" data-latex="," transform="translate(1715,0)"><path data-c="2C" d="M139 106C107 106 86 82 86 50C86 20 109-5 139-5C153-5 165-1 174 8L175 0C175-63 154-117 112-160C105-168 101-174 101-178C101-188 105-193 114-193C123-193 135-181 152-158C186-110 203-57 203 0C203 53 185 106 139 106Z"></path></g><g data-mml-node="mi" data-latex="y" transform="translate(2159.7,0)"><path data-c="1D466" d="M163 442C118 442 83 417 58 367C39 328 29 301 29 286C29 277 34 272 45 272C59 272 60 278 64 293C87 372 119 412 160 412C173 412 180 403 180 385C180 369 175 346 164 317C126 214 107 145 107 108C107 32 154-13 231-13C264-13 295-1 323 23C288-109 233-175 158-175C124-175 101-164 89-142C129-140 149-121 149-85C149-60 136-47 109-47C72-47 50-78 50-115C50-170 100-205 158-205C273-205 367-99 392-1L486 377C489 388 490 396 490 401C490 421 479 431 458 431C442 431 429 423 420 408C414 387 409 369 406 354L342 97C332 61 279 16 234 16C196 16 177 41 177 92C177 134 194 198 227 284C240 319 247 343 247 357C247 406 212 442 163 442Z"></path></g><g data-mml-node="mo" data-latex="," transform="translate(2649.7,0)"><path data-c="2C" d="M139 106C107 106 86 82 86 50C86 20 109-5 139-5C153-5 165-1 174 8L175 0C175-63 154-117 112-160C105-168 101-174 101-178C101-188 105-193 114-193C123-193 135-181 152-158C186-110 203-57 203 0C203 53 185 106 139 106Z"></path></g><g data-mml-node="msub" data-latex="z_{k}" transform="translate(3094.3,0)"><g data-mml-node="mi" data-latex="z"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="TeXAtom" transform="translate(498,-150) scale(0.707)" data-latex="{k}" data-mjx-texclass="ORD"><g data-mml-node="mi" data-latex="k"><path data-c="1D458" d="M409 353C409 327 423 314 450 314C485 314 508 345 508 379C508 418 476 445 437 445C392 445 344 415 291 356C250 311 217 282 190 269L291 679C289 688 287 694 274 694C242 694 166 685 154 684C139 682 132 675 132 660C132 650 141 645 159 645C178 645 204 646 204 632L59 43C56 32 55 25 55 21C55 0 66-11 87-11C104-11 117-3 124 12C129 21 147 92 179 226C231 221 286 196 286 146C286 131 279 101 279 91C279 34 316-11 373-11C431-11 470 41 490 145C490 154 485 159 475 159C466 159 460 152 457 138C435 59 408 19 375 19C357 19 348 33 348 61C348 77 360 131 360 147C360 204 314 239 221 253C244 269 270 292 298 322C326 352 346 371 359 382C386 404 412 415 435 415C445 415 453 413 459 409C432 404 409 379 409 353Z"></path></g></g></g><g data-mml-node="mo" data-latex=")" transform="translate(4010.7,0)"><path data-c="29" d="M78-245C138-199 188-131 229-40C268 47 288 129 288 208L288 292C288 371 268 453 229 540C188 631 138 699 78 745C75 747 72 748 71 748C62 748 57 743 57 734C57 730 59 726 62 723C114 683 156 617 187 526C214 447 228 369 228 292L228 208C228 131 214 53 187-26C156-117 114-183 62-223C59-227 57-231 57-234C57-243 62-248 71-248C72-248 75-247 78-245Z"></path></g></g></g></svg></mjx-container> 来说，有：</p><p>  <mjx-container class="MathJax" jax="SVG" overflow="overflow" display="true"><svg style="vertical-align: -2.016ex;" xmlns="http://www.w3.org/2000/svg" width="19.422ex" height="5.245ex" role="img" focusable="false" viewBox="0 -1427.2 8584.7 2318.2"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="  \frac{x’}{x} = \frac{y’}{y} = \frac{zNear}{z_{k}}  "><g data-mml-node="mfrac" data-latex="\frac{x’}{x}"><g data-mml-node="msup" data-latex="x’" transform="translate(220,676)"><g data-mml-node="mi" data-latex="x"><path data-c="1D465" d="M527 373C527 419 482 442 432 442C389 442 355 419 329 373C308 419 273 442 222 442C173 442 133 419 101 374C74 335 60 306 60 287C60 278 65 273 75 273C84 273 90 278 92 287C111 345 153 413 220 413C253 413 269 392 269 351C269 330 251 252 216 118C199 51 169 18 126 18C112 18 99 21 88 26C114 36 127 54 127 80C127 106 114 119 87 119C54 119 29 91 29 58C29 12 76-11 125-11C167-11 201 12 228 58C247 12 283-11 335-11C383-11 423 12 455 57C482 96 496 125 496 144C496 153 491 158 481 158C472 158 467 153 464 144C447 87 402 18 337 18C304 18 287 38 287 79C287 92 292 120 303 165L337 300C356 375 387 413 431 413C445 413 458 410 469 405C442 396 429 378 429 351C429 325 443 312 470 312C502 312 527 341 527 373Z"></path></g><g data-mml-node="mo" transform="translate(605,363) scale(0.707)" data-latex="’"><path data-c="2032" d="M284 549C259 549 242 539 233 518L65 96L110 96L332 463C337 472 340 482 340 493C340 523 314 549 284 549Z"></path></g></g><g data-mml-node="mi" data-latex="x" transform="translate(405.4,-686)"><path data-c="1D465" d="M527 373C527 419 482 442 432 442C389 442 355 419 329 373C308 419 273 442 222 442C173 442 133 419 101 374C74 335 60 306 60 287C60 278 65 273 75 273C84 273 90 278 92 287C111 345 153 413 220 413C253 413 269 392 269 351C269 330 251 252 216 118C199 51 169 18 126 18C112 18 99 21 88 26C114 36 127 54 127 80C127 106 114 119 87 119C54 119 29 91 29 58C29 12 76-11 125-11C167-11 201 12 228 58C247 12 283-11 335-11C383-11 423 12 455 57C482 96 496 125 496 144C496 153 491 158 481 158C472 158 467 153 464 144C447 87 402 18 337 18C304 18 287 38 287 79C287 92 292 120 303 165L337 300C356 375 387 413 431 413C445 413 458 410 469 405C442 396 429 378 429 351C429 325 443 312 470 312C502 312 527 341 527 373Z"></path></g><rect width="1142.8" height="60" x="120" y="220"></rect></g><g data-mml-node="mo" data-latex="=" transform="translate(1660.6,0)"><path data-c="3D" d="M698 367L80 367C64 367 56 359 56 344C56 329 64 321 80 321L698 321C714 321 722 329 722 344C722 356 711 367 698 367M698 179L80 179C64 179 56 171 56 156C56 141 64 133 80 133L698 133C714 133 722 141 722 156C722 169 711 179 698 179Z"></path></g><g data-mml-node="mfrac" data-latex="\frac{y’}{y}" transform="translate(2716.3,0)"><g data-mml-node="msup" data-latex="y’" transform="translate(220,676)"><g data-mml-node="mi" data-latex="y"><path data-c="1D466" d="M163 442C118 442 83 417 58 367C39 328 29 301 29 286C29 277 34 272 45 272C59 272 60 278 64 293C87 372 119 412 160 412C173 412 180 403 180 385C180 369 175 346 164 317C126 214 107 145 107 108C107 32 154-13 231-13C264-13 295-1 323 23C288-109 233-175 158-175C124-175 101-164 89-142C129-140 149-121 149-85C149-60 136-47 109-47C72-47 50-78 50-115C50-170 100-205 158-205C273-205 367-99 392-1L486 377C489 388 490 396 490 401C490 421 479 431 458 431C442 431 429 423 420 408C414 387 409 369 406 354L342 97C332 61 279 16 234 16C196 16 177 41 177 92C177 134 194 198 227 284C240 319 247 343 247 357C247 406 212 442 163 442Z"></path></g><g data-mml-node="mo" transform="translate(523,363) scale(0.707)" data-latex="’"><path data-c="2032" d="M284 549C259 549 242 539 233 518L65 96L110 96L332 463C337 472 340 482 340 493C340 523 314 549 284 549Z"></path></g></g><g data-mml-node="mi" data-latex="y" transform="translate(405.4,-686)"><path data-c="1D466" d="M163 442C118 442 83 417 58 367C39 328 29 301 29 286C29 277 34 272 45 272C59 272 60 278 64 293C87 372 119 412 160 412C173 412 180 403 180 385C180 369 175 346 164 317C126 214 107 145 107 108C107 32 154-13 231-13C264-13 295-1 323 23C288-109 233-175 158-175C124-175 101-164 89-142C129-140 149-121 149-85C149-60 136-47 109-47C72-47 50-78 50-115C50-170 100-205 158-205C273-205 367-99 392-1L486 377C489 388 490 396 490 401C490 421 479 431 458 431C442 431 429 423 420 408C414 387 409 369 406 354L342 97C332 61 279 16 234 16C196 16 177 41 177 92C177 134 194 198 227 284C240 319 247 343 247 357C247 406 212 442 163 442Z"></path></g><rect width="1060.8" height="60" x="120" y="220"></rect></g><g data-mml-node="mo" data-latex="=" transform="translate(4294.9,0)"><path data-c="3D" d="M698 367L80 367C64 367 56 359 56 344C56 329 64 321 80 321L698 321C714 321 722 329 722 344C722 356 711 367 698 367M698 179L80 179C64 179 56 171 56 156C56 141 64 133 80 133L698 133C714 133 722 141 722 156C722 169 711 179 698 179Z"></path></g><g data-mml-node="mfrac" data-latex="\frac{zNear}{z_{k}}" transform="translate(5350.7,0)"><g data-mml-node="mrow" data-latex="zNear" transform="translate(220,676)"><g data-mml-node="mi" data-latex="z"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="mi" data-latex="N" transform="translate(467,0)"><path data-c="1D441" d="M864 683C845 683 783 680 764 680C745 680 682 683 663 683C648 683 641 675 641 659C641 650 648 645 663 644C705 644 726 631 726 605C726 599 725 592 724 585L616 157L401 662C393 681 391 683 366 683L233 683C209 683 200 681 200 659C200 649 211 644 232 644C274 644 295 643 296 640L163 110C154 71 131 49 95 42C69 39 39 43 39 15C39 5 45 0 56 0C74 0 136 3 155 3C174 3 238 0 257 0C272 0 279 8 279 24C279 33 271 38 255 39C214 40 194 53 194 78C194 83 195 90 197 100L326 611L576 21C582 7 590 0 599 0C608 0 614 8 618 24L757 574C770 625 798 643 860 644C874 645 881 653 881 669C878 678 877 683 864 683Z"></path></g><g data-mml-node="mi" data-latex="e" transform="translate(1348,0)"><path data-c="1D452" d="M124 129C124 153 129 186 139 227L188 227C253 227 303 235 339 250C372 264 394 284 405 309C412 326 415 342 415 355C415 410 363 442 307 442C268 442 229 432 190 412C113 372 46 281 46 171C46 69 105-11 204-11C257-11 304 2 345 27C379 48 404 69 420 90C427 99 430 106 430 109C430 120 425 126 414 126C409 126 404 122 398 114C365 70 324 42 277 30C246 22 223 18 206 18C149 18 124 72 124 129M375 355C375 289 311 256 182 256L147 256C166 322 194 366 232 387C262 404 287 413 307 413C343 413 375 391 375 355Z"></path></g><g data-mml-node="mi" data-latex="a" transform="translate(1814,0)"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(2343,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g></g><g data-mml-node="msub" data-latex="z_{k}" transform="translate(1158.8,-686)"><g data-mml-node="mi" data-latex="z"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="TeXAtom" transform="translate(498,-150) scale(0.707)" data-latex="{k}" data-mjx-texclass="ORD"><g data-mml-node="mi" data-latex="k"><path data-c="1D458" d="M409 353C409 327 423 314 450 314C485 314 508 345 508 379C508 418 476 445 437 445C392 445 344 415 291 356C250 311 217 282 190 269L291 679C289 688 287 694 274 694C242 694 166 685 154 684C139 682 132 675 132 660C132 650 141 645 159 645C178 645 204 646 204 632L59 43C56 32 55 25 55 21C55 0 66-11 87-11C104-11 117-3 124 12C129 21 147 92 179 226C231 221 286 196 286 146C286 131 279 101 279 91C279 34 316-11 373-11C431-11 470 41 490 145C490 154 485 159 475 159C466 159 460 152 457 138C435 59 408 19 375 19C357 19 348 33 348 61C348 77 360 131 360 147C360 204 314 239 221 253C244 269 270 292 298 322C326 352 346 371 359 382C386 404 412 415 435 415C445 415 453 413 459 409C432 404 409 379 409 353Z"></path></g></g></g><rect width="2994" height="60" x="120" y="220"></rect></g></g></g></svg></mjx-container></p></li><li><p>对于该平面，缩放变换矩阵为：</p><p>  <mjx-container class="MathJax" jax="SVG" overflow="overflow" display="true"><svg style="vertical-align: -6.071ex;" xmlns="http://www.w3.org/2000/svg" width="23.94ex" height="13.274ex" role="img" focusable="false" viewBox="0 -3183.5 10581.3 5867"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="  \begin{pmatrix}  \frac{zNear}{z_{k}} &amp; 0 &amp; 0 &amp; 0 \\  0 &amp; \frac{zNear}{z_{k}} &amp; 0 &amp; 0 \\  ? &amp; ? &amp; ? &amp; ? \\  0 &amp; 0 &amp; 0 &amp; 1  \end{pmatrix}  "><g data-mml-node="mrow" data-latex="\begin{pmatrix}  \frac{zNear}{z_{k}} &amp; 0 &amp; 0 &amp; 0 \\  0 &amp; \frac{zNear}{z_{k}} &amp; 0 &amp; 0 \\  ? &amp; ? &amp; ? &amp; ? \\  0 &amp; 0 &amp; 0 &amp; 1  \end{pmatrix}"><g data-mml-node="mo"><path data-c="239B" d="M813 1450C820 1455 823 1462 823 1470C823 1487 815 1495 798 1495C793 1495 788 1493 784 1490C697 1423 614 1324 536 1192C399 956 277 603 277 253L277 0L385 0L385 253C385 407 403 562 438 719C500 999 630 1313 813 1450Z" transform="translate(0,1688.5)"></path><path data-c="239D" d="M798 0C815 0 823 8 823 25C823 34 819 40 812 44C731 106 658 202 592 334C474 569 385 903 385 1242L385 1495L277 1495L277 1242C277 914 388 575 512 345C594 193 685 80 784 5C788 2 793 0 798 0Z" transform="translate(0,-2683.5)"></path><svg width="875" height="3017" y="-1258.5" x="0" viewBox="0 754.3 875 3017"><path data-c="239C" d="M277 0L385 0L385 498L277 498Z" transform="scale(1,9.087)"></path></svg></g><g data-mml-node="mtable" transform="translate(875,0)"><g data-mml-node="mtr" transform="translate(0,2306.6)"><g data-mml-node="mtd"><g data-mml-node="mfrac" data-latex="\frac{zNear}{z_{k}}"><g data-mml-node="mrow" transform="translate(220,394) scale(0.707)" data-latex="zNear"><g data-mml-node="mi" data-latex="z"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="mi" data-latex="N" transform="translate(467,0)"><path data-c="1D441" d="M864 683C845 683 783 680 764 680C745 680 682 683 663 683C648 683 641 675 641 659C641 650 648 645 663 644C705 644 726 631 726 605C726 599 725 592 724 585L616 157L401 662C393 681 391 683 366 683L233 683C209 683 200 681 200 659C200 649 211 644 232 644C274 644 295 643 296 640L163 110C154 71 131 49 95 42C69 39 39 43 39 15C39 5 45 0 56 0C74 0 136 3 155 3C174 3 238 0 257 0C272 0 279 8 279 24C279 33 271 38 255 39C214 40 194 53 194 78C194 83 195 90 197 100L326 611L576 21C582 7 590 0 599 0C608 0 614 8 618 24L757 574C770 625 798 643 860 644C874 645 881 653 881 669C878 678 877 683 864 683Z"></path></g><g data-mml-node="mi" data-latex="e" transform="translate(1348,0)"><path data-c="1D452" d="M124 129C124 153 129 186 139 227L188 227C253 227 303 235 339 250C372 264 394 284 405 309C412 326 415 342 415 355C415 410 363 442 307 442C268 442 229 432 190 412C113 372 46 281 46 171C46 69 105-11 204-11C257-11 304 2 345 27C379 48 404 69 420 90C427 99 430 106 430 109C430 120 425 126 414 126C409 126 404 122 398 114C365 70 324 42 277 30C246 22 223 18 206 18C149 18 124 72 124 129M375 355C375 289 311 256 182 256L147 256C166 322 194 366 232 387C262 404 287 413 307 413C343 413 375 391 375 355Z"></path></g><g data-mml-node="mi" data-latex="a" transform="translate(1814,0)"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(2343,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g></g><g data-mml-node="msub" transform="translate(883.8,-345) scale(0.707)" data-latex="z_{k}"><g data-mml-node="mi" data-latex="z"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="TeXAtom" transform="translate(498,-150) scale(0.707)" data-latex="{k}" data-mjx-texclass="ORD"><g data-mml-node="mi" data-latex="k"><path data-c="1D458" d="M409 353C409 327 423 314 450 314C485 314 508 345 508 379C508 418 476 445 437 445C392 445 344 415 291 356C250 311 217 282 190 269L291 679C289 688 287 694 274 694C242 694 166 685 154 684C139 682 132 675 132 660C132 650 141 645 159 645C178 645 204 646 204 632L59 43C56 32 55 25 55 21C55 0 66-11 87-11C104-11 117-3 124 12C129 21 147 92 179 226C231 221 286 196 286 146C286 131 279 101 279 91C279 34 316-11 373-11C431-11 470 41 490 145C490 154 485 159 475 159C466 159 460 152 457 138C435 59 408 19 375 19C357 19 348 33 348 61C348 77 360 131 360 147C360 204 314 239 221 253C244 269 270 292 298 322C326 352 346 371 359 382C386 404 412 415 435 415C445 415 453 413 459 409C432 404 409 379 409 353Z"></path></g></g></g><rect width="2175.7" height="60" x="120" y="220"></rect></g></g><g data-mml-node="mtd" transform="translate(4373.5,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(6831.3,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(8331.3,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g></g><g data-mml-node="mtr" transform="translate(0,573)"><g data-mml-node="mtd" transform="translate(957.8,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(3415.7,0)"><g data-mml-node="mfrac" data-latex="\frac{zNear}{z_{k}}"><g data-mml-node="mrow" transform="translate(220,394) scale(0.707)" data-latex="zNear"><g data-mml-node="mi" data-latex="z"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="mi" data-latex="N" transform="translate(467,0)"><path data-c="1D441" d="M864 683C845 683 783 680 764 680C745 680 682 683 663 683C648 683 641 675 641 659C641 650 648 645 663 644C705 644 726 631 726 605C726 599 725 592 724 585L616 157L401 662C393 681 391 683 366 683L233 683C209 683 200 681 200 659C200 649 211 644 232 644C274 644 295 643 296 640L163 110C154 71 131 49 95 42C69 39 39 43 39 15C39 5 45 0 56 0C74 0 136 3 155 3C174 3 238 0 257 0C272 0 279 8 279 24C279 33 271 38 255 39C214 40 194 53 194 78C194 83 195 90 197 100L326 611L576 21C582 7 590 0 599 0C608 0 614 8 618 24L757 574C770 625 798 643 860 644C874 645 881 653 881 669C878 678 877 683 864 683Z"></path></g><g data-mml-node="mi" data-latex="e" transform="translate(1348,0)"><path data-c="1D452" d="M124 129C124 153 129 186 139 227L188 227C253 227 303 235 339 250C372 264 394 284 405 309C412 326 415 342 415 355C415 410 363 442 307 442C268 442 229 432 190 412C113 372 46 281 46 171C46 69 105-11 204-11C257-11 304 2 345 27C379 48 404 69 420 90C427 99 430 106 430 109C430 120 425 126 414 126C409 126 404 122 398 114C365 70 324 42 277 30C246 22 223 18 206 18C149 18 124 72 124 129M375 355C375 289 311 256 182 256L147 256C166 322 194 366 232 387C262 404 287 413 307 413C343 413 375 391 375 355Z"></path></g><g data-mml-node="mi" data-latex="a" transform="translate(1814,0)"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(2343,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g></g><g data-mml-node="msub" transform="translate(883.8,-345) scale(0.707)" data-latex="z_{k}"><g data-mml-node="mi" data-latex="z"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="TeXAtom" transform="translate(498,-150) scale(0.707)" data-latex="{k}" data-mjx-texclass="ORD"><g data-mml-node="mi" data-latex="k"><path data-c="1D458" d="M409 353C409 327 423 314 450 314C485 314 508 345 508 379C508 418 476 445 437 445C392 445 344 415 291 356C250 311 217 282 190 269L291 679C289 688 287 694 274 694C242 694 166 685 154 684C139 682 132 675 132 660C132 650 141 645 159 645C178 645 204 646 204 632L59 43C56 32 55 25 55 21C55 0 66-11 87-11C104-11 117-3 124 12C129 21 147 92 179 226C231 221 286 196 286 146C286 131 279 101 279 91C279 34 316-11 373-11C431-11 470 41 490 145C490 154 485 159 475 159C466 159 460 152 457 138C435 59 408 19 375 19C357 19 348 33 348 61C348 77 360 131 360 147C360 204 314 239 221 253C244 269 270 292 298 322C326 352 346 371 359 382C386 404 412 415 435 415C445 415 453 413 459 409C432 404 409 379 409 353Z"></path></g></g></g><rect width="2175.7" height="60" x="120" y="220"></rect></g></g><g data-mml-node="mtd" transform="translate(6831.3,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(8331.3,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g></g><g data-mml-node="mtr" transform="translate(0,-1033.5)"><g data-mml-node="mtd" transform="translate(971.8,0)"><g data-mml-node="mo" data-latex="?"><path data-c="3F" d="M226 705C140 705 56 652 56 570C56 535 72 518 105 518C138 518 154 535 154 568C154 598 137 614 102 616C127 655 168 675 223 675C297 675 326 646 326 573C326 555 324 540 321 528C313 501 312 502 294 482C236 419 207 344 207 257L207 213C207 194 212 185 222 185C233 185 239 195 239 216L239 250C239 331 281 404 366 467C399 492 415 525 415 568C415 662 328 705 226 705M278 56C278 87 253 113 222 113C191 113 167 87 167 56C167 26 192 0 222 0C253 0 278 25 278 56Z"></path></g></g><g data-mml-node="mtd" transform="translate(4387.5,0)"><g data-mml-node="mo" data-latex="?"><path data-c="3F" d="M226 705C140 705 56 652 56 570C56 535 72 518 105 518C138 518 154 535 154 568C154 598 137 614 102 616C127 655 168 675 223 675C297 675 326 646 326 573C326 555 324 540 321 528C313 501 312 502 294 482C236 419 207 344 207 257L207 213C207 194 212 185 222 185C233 185 239 195 239 216L239 250C239 331 281 404 366 467C399 492 415 525 415 568C415 662 328 705 226 705M278 56C278 87 253 113 222 113C191 113 167 87 167 56C167 26 192 0 222 0C253 0 278 25 278 56Z"></path></g></g><g data-mml-node="mtd" transform="translate(6845.3,0)"><g data-mml-node="mo" data-latex="?"><path data-c="3F" d="M226 705C140 705 56 652 56 570C56 535 72 518 105 518C138 518 154 535 154 568C154 598 137 614 102 616C127 655 168 675 223 675C297 675 326 646 326 573C326 555 324 540 321 528C313 501 312 502 294 482C236 419 207 344 207 257L207 213C207 194 212 185 222 185C233 185 239 195 239 216L239 250C239 331 281 404 366 467C399 492 415 525 415 568C415 662 328 705 226 705M278 56C278 87 253 113 222 113C191 113 167 87 167 56C167 26 192 0 222 0C253 0 278 25 278 56Z"></path></g></g><g data-mml-node="mtd" transform="translate(8345.3,0)"><g data-mml-node="mo" data-latex="?"><path data-c="3F" d="M226 705C140 705 56 652 56 570C56 535 72 518 105 518C138 518 154 535 154 568C154 598 137 614 102 616C127 655 168 675 223 675C297 675 326 646 326 573C326 555 324 540 321 528C313 501 312 502 294 482C236 419 207 344 207 257L207 213C207 194 212 185 222 185C233 185 239 195 239 216L239 250C239 331 281 404 366 467C399 492 415 525 415 568C415 662 328 705 226 705M278 56C278 87 253 113 222 113C191 113 167 87 167 56C167 26 192 0 222 0C253 0 278 25 278 56Z"></path></g></g></g><g data-mml-node="mtr" transform="translate(0,-2433.5)"><g data-mml-node="mtd" transform="translate(957.8,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(4373.5,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(6831.3,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(8331.3,0)"><g data-mml-node="mn" data-latex="1"><path data-c="31" d="M269 666C228 624 168 603 89 603L89 564C141 564 184 572 217 588L217 82C217 64 213 52 204 47C195 42 170 39 130 39L95 39L95 0C120 2 174 3 257 3C340 3 394 2 419 0L419 39L384 39C343 39 318 42 310 47C302 52 297 64 297 82L297 636C297 660 295 666 269 666Z"></path></g></g></g></g><g data-mml-node="mo" transform="translate(9706.3,0)"><path data-c="239E" d="M490 0L598 0L598 253C598 581 487 920 363 1150C281 1301 190 1415 91 1490C87 1493 82 1495 77 1495C60 1495 52 1487 52 1470C52 1462 55 1455 62 1450C143 1389 216 1292 283 1160C402 924 490 593 490 253Z" transform="translate(0,1688.5)"></path><path data-c="23A0" d="M598 1242L598 1495L490 1495L490 1242C490 1088 472 933 437 776C375 494 246 184 63 44C56 40 52 34 52 25C52 8 60 0 77 0C82 0 87 2 91 5C178 71 261 170 339 303C477 539 598 892 598 1242Z" transform="translate(0,-2683.5)"></path><svg width="875" height="3017" y="-1258.5" x="0" viewBox="0 754.3 875 3017"><path data-c="239F" d="M490 0L598 0L598 498L490 498Z" transform="scale(1,9.087)"></path></svg></g></g></g></g></svg></mjx-container></p></li><li><p>由于我们希望得到的是一个对于整个可视区域通用的变换矩阵，而上面这个矩阵仅作用于平面 <mjx-container class="MathJax" jax="SVG" overflow="overflow"><svg style="vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="1.057ex" height="2.262ex" role="img" focusable="false" viewBox="0 -750 467 1000"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="z = z_{k}"><g data-mml-node="mi" data-latex="z"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g></g></g></svg><mjx-break size="4"> </mjx-break><svg style="vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="4.462ex" height="2.262ex" role="img" focusable="false" viewBox="0 -750 1972.2 1000"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="z = z_{k}"><g data-mml-node="mo" data-latex="="><path data-c="3D" d="M698 367L80 367C64 367 56 359 56 344C56 329 64 321 80 321L698 321C714 321 722 329 722 344C722 356 711 367 698 367M698 179L80 179C64 179 56 171 56 156C56 141 64 133 80 133L698 133C714 133 722 141 722 156C722 169 711 179 698 179Z"></path></g><g data-mml-node="msub" data-latex="z_{k}" transform="translate(1055.8,0)"><g data-mml-node="mi" data-latex="z"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="TeXAtom" transform="translate(498,-150) scale(0.707)" data-latex="{k}" data-mjx-texclass="ORD"><g data-mml-node="mi" data-latex="k"><path data-c="1D458" d="M409 353C409 327 423 314 450 314C485 314 508 345 508 379C508 418 476 445 437 445C392 445 344 415 291 356C250 311 217 282 190 269L291 679C289 688 287 694 274 694C242 694 166 685 154 684C139 682 132 675 132 660C132 650 141 645 159 645C178 645 204 646 204 632L59 43C56 32 55 25 55 21C55 0 66-11 87-11C104-11 117-3 124 12C129 21 147 92 179 226C231 221 286 196 286 146C286 131 279 101 279 91C279 34 316-11 373-11C431-11 470 41 490 145C490 154 485 159 475 159C466 159 460 152 457 138C435 59 408 19 375 19C357 19 348 33 348 61C348 77 360 131 360 147C360 204 314 239 221 253C244 269 270 292 298 322C326 352 346 371 359 382C386 404 412 415 435 415C445 415 453 413 459 409C432 404 409 379 409 353Z"></path></g></g></g></g></g></svg></mjx-container>。对此我们可以利用齐次坐标表示法的等比例缩放不变性，将变换关系转换为：</p><p>  <mjx-container class="MathJax" jax="SVG" overflow="overflow" display="true"><svg style="vertical-align: -5.603ex;" xmlns="http://www.w3.org/2000/svg" width="38.813ex" height="12.337ex" role="img" focusable="false" viewBox="0 -2976.5 17155.5 5453.1"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="  \begin{pmatrix}  x \\  y \\  z \\  1  \end{pmatrix} \to  \begin{pmatrix}  zNear \cdot \frac{x}{z} \\  zNear \cdot \frac{y}{z} \\  ? \\  1  \end{pmatrix} \sim  \begin{pmatrix}  zNear \cdot x \\  zNear \cdot y \\  ? \\  z  \end{pmatrix}  "><g data-mml-node="mrow" data-latex="{pmatrix}"><g data-mml-node="mo"><path data-c="239B" d="M813 1450C820 1455 823 1462 823 1470C823 1487 815 1495 798 1495C793 1495 788 1493 784 1490C697 1423 614 1324 536 1192C399 956 277 603 277 253L277 0L385 0L385 253C385 407 403 562 438 719C500 999 630 1313 813 1450Z" transform="translate(0,1355)"></path><path data-c="239D" d="M798 0C815 0 823 8 823 25C823 34 819 40 812 44C731 106 658 202 592 334C474 569 385 903 385 1242L385 1495L277 1495L277 1242C277 914 388 575 512 345C594 193 685 80 784 5C788 2 793 0 798 0Z" transform="translate(0,-2350)"></path><svg width="875" height="2350" y="-925" x="0" viewBox="0 587.5 875 2350"><path data-c="239C" d="M277 0L385 0L385 498L277 498Z" transform="scale(1,7.078)"></path></svg></g><g data-mml-node="mtable" transform="translate(875,0)"><g data-mml-node="mtr" transform="translate(0,2100)"><g data-mml-node="mtd"><g data-mml-node="mi" data-latex="x"><path data-c="1D465" d="M527 373C527 419 482 442 432 442C389 442 355 419 329 373C308 419 273 442 222 442C173 442 133 419 101 374C74 335 60 306 60 287C60 278 65 273 75 273C84 273 90 278 92 287C111 345 153 413 220 413C253 413 269 392 269 351C269 330 251 252 216 118C199 51 169 18 126 18C112 18 99 21 88 26C114 36 127 54 127 80C127 106 114 119 87 119C54 119 29 91 29 58C29 12 76-11 125-11C167-11 201 12 228 58C247 12 283-11 335-11C383-11 423 12 455 57C482 96 496 125 496 144C496 153 491 158 481 158C472 158 467 153 464 144C447 87 402 18 337 18C304 18 287 38 287 79C287 92 292 120 303 165L337 300C356 375 387 413 431 413C445 413 458 410 469 405C442 396 429 378 429 351C429 325 443 312 470 312C502 312 527 341 527 373Z"></path></g></g></g><g data-mml-node="mtr" transform="translate(0,700)"><g data-mml-node="mtd" transform="translate(41,0)"><g data-mml-node="mi" data-latex="y"><path data-c="1D466" d="M163 442C118 442 83 417 58 367C39 328 29 301 29 286C29 277 34 272 45 272C59 272 60 278 64 293C87 372 119 412 160 412C173 412 180 403 180 385C180 369 175 346 164 317C126 214 107 145 107 108C107 32 154-13 231-13C264-13 295-1 323 23C288-109 233-175 158-175C124-175 101-164 89-142C129-140 149-121 149-85C149-60 136-47 109-47C72-47 50-78 50-115C50-170 100-205 158-205C273-205 367-99 392-1L486 377C489 388 490 396 490 401C490 421 479 431 458 431C442 431 429 423 420 408C414 387 409 369 406 354L342 97C332 61 279 16 234 16C196 16 177 41 177 92C177 134 194 198 227 284C240 319 247 343 247 357C247 406 212 442 163 442Z"></path></g></g></g><g data-mml-node="mtr" transform="translate(0,-700)"><g data-mml-node="mtd" transform="translate(52.5,0)"><g data-mml-node="mi" data-latex="z"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g></g></g><g data-mml-node="mtr" transform="translate(0,-2100)"><g data-mml-node="mtd" transform="translate(36,0)"><g data-mml-node="mn" data-latex="1"><path data-c="31" d="M269 666C228 624 168 603 89 603L89 564C141 564 184 572 217 588L217 82C217 64 213 52 204 47C195 42 170 39 130 39L95 39L95 0C120 2 174 3 257 3C340 3 394 2 419 0L419 39L384 39C343 39 318 42 310 47C302 52 297 64 297 82L297 636C297 660 295 666 269 666Z"></path></g></g></g></g><g data-mml-node="mo" transform="translate(1447,0)"><path data-c="239E" d="M490 0L598 0L598 253C598 581 487 920 363 1150C281 1301 190 1415 91 1490C87 1493 82 1495 77 1495C60 1495 52 1487 52 1470C52 1462 55 1455 62 1450C143 1389 216 1292 283 1160C402 924 490 593 490 253Z" transform="translate(0,1355)"></path><path data-c="23A0" d="M598 1242L598 1495L490 1495L490 1242C490 1088 472 933 437 776C375 494 246 184 63 44C56 40 52 34 52 25C52 8 60 0 77 0C82 0 87 2 91 5C178 71 261 170 339 303C477 539 598 892 598 1242Z" transform="translate(0,-2350)"></path><svg width="875" height="2350" y="-925" x="0" viewBox="0 587.5 875 2350"><path data-c="239F" d="M490 0L598 0L598 498L490 498Z" transform="scale(1,7.078)"></path></svg></g></g><g data-mml-node="mo" data-latex="\to" transform="translate(2599.8,0)"><path data-c="2192" d="M932 234C939 237 943 243 943 250C943 257 939 263 932 266C884 282 839 316 797 368C769 403 750 444 741 491C738 504 730 510 717 510C701 510 693 502 693 485L694 483L694 482C711 395 755 326 828 274L82 274C66 274 58 266 58 250C58 234 66 226 82 226L828 226C755 174 711 105 694 18L694 17L693 15C693-2 701-10 717-10C730-10 738-4 741 9C750 56 769 97 797 132C839 184 884 218 932 234Z"></path></g><g data-mml-node="mrow" data-latex="{pmatrix}" transform="translate(3877.6,0)"><g data-mml-node="mo"><path data-c="239B" d="M813 1450C820 1455 823 1462 823 1470C823 1487 815 1495 798 1495C793 1495 788 1493 784 1490C697 1423 614 1324 536 1192C399 956 277 603 277 253L277 0L385 0L385 253C385 407 403 562 438 719C500 999 630 1313 813 1450Z" transform="translate(0,1481.5)"></path><path data-c="239D" d="M798 0C815 0 823 8 823 25C823 34 819 40 812 44C731 106 658 202 592 334C474 569 385 903 385 1242L385 1495L277 1495L277 1242C277 914 388 575 512 345C594 193 685 80 784 5C788 2 793 0 798 0Z" transform="translate(0,-2476.5)"></path><svg width="875" height="2603.1" y="-1051.5" x="0" viewBox="0 650.8 875 2603.1"><path data-c="239C" d="M277 0L385 0L385 498L277 498Z" transform="scale(1,7.841)"></path></svg></g><g data-mml-node="mtable" transform="translate(875,0)"><g data-mml-node="mtr" transform="translate(0,2226.5)"><g data-mml-node="mtd"><g data-mml-node="mi" data-latex="z"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="mi" data-latex="N" transform="translate(467,0)"><path data-c="1D441" d="M864 683C845 683 783 680 764 680C745 680 682 683 663 683C648 683 641 675 641 659C641 650 648 645 663 644C705 644 726 631 726 605C726 599 725 592 724 585L616 157L401 662C393 681 391 683 366 683L233 683C209 683 200 681 200 659C200 649 211 644 232 644C274 644 295 643 296 640L163 110C154 71 131 49 95 42C69 39 39 43 39 15C39 5 45 0 56 0C74 0 136 3 155 3C174 3 238 0 257 0C272 0 279 8 279 24C279 33 271 38 255 39C214 40 194 53 194 78C194 83 195 90 197 100L326 611L576 21C582 7 590 0 599 0C608 0 614 8 618 24L757 574C770 625 798 643 860 644C874 645 881 653 881 669C878 678 877 683 864 683Z"></path></g><g data-mml-node="mi" data-latex="e" transform="translate(1348,0)"><path data-c="1D452" d="M124 129C124 153 129 186 139 227L188 227C253 227 303 235 339 250C372 264 394 284 405 309C412 326 415 342 415 355C415 410 363 442 307 442C268 442 229 432 190 412C113 372 46 281 46 171C46 69 105-11 204-11C257-11 304 2 345 27C379 48 404 69 420 90C427 99 430 106 430 109C430 120 425 126 414 126C409 126 404 122 398 114C365 70 324 42 277 30C246 22 223 18 206 18C149 18 124 72 124 129M375 355C375 289 311 256 182 256L147 256C166 322 194 366 232 387C262 404 287 413 307 413C343 413 375 391 375 355Z"></path></g><g data-mml-node="mi" data-latex="a" transform="translate(1814,0)"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(2343,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g><g data-mml-node="mo" data-latex="\cdot" transform="translate(3016.2,0)"><path data-c="22C5" d="M192 250C192 279 168 303 139 303C110 303 86 279 86 250C86 221 110 197 139 197C168 197 192 221 192 250Z"></path></g><g data-mml-node="mfrac" data-latex="\frac{x}{z}" transform="translate(3516.4,0)"><g data-mml-node="mi" transform="translate(220,394) scale(0.707)" data-latex="x"><path data-c="1D465" d="M527 373C527 419 482 442 432 442C389 442 355 419 329 373C308 419 273 442 222 442C173 442 133 419 101 374C74 335 60 306 60 287C60 278 65 273 75 273C84 273 90 278 92 287C111 345 153 413 220 413C253 413 269 392 269 351C269 330 251 252 216 118C199 51 169 18 126 18C112 18 99 21 88 26C114 36 127 54 127 80C127 106 114 119 87 119C54 119 29 91 29 58C29 12 76-11 125-11C167-11 201 12 228 58C247 12 283-11 335-11C383-11 423 12 455 57C482 96 496 125 496 144C496 153 491 158 481 158C472 158 467 153 464 144C447 87 402 18 337 18C304 18 287 38 287 79C287 92 292 120 303 165L337 300C356 375 387 413 431 413C445 413 458 410 469 405C442 396 429 378 429 351C429 325 443 312 470 312C502 312 527 341 527 373Z"></path></g><g data-mml-node="mi" transform="translate(257.1,-345) scale(0.707)" data-latex="z"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><rect width="604.5" height="60" x="120" y="220"></rect></g></g></g><g data-mml-node="mtr" transform="translate(0,676.3)"><g data-mml-node="mtd" transform="translate(29,0)"><g data-mml-node="mi" data-latex="z"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="mi" data-latex="N" transform="translate(467,0)"><path data-c="1D441" d="M864 683C845 683 783 680 764 680C745 680 682 683 663 683C648 683 641 675 641 659C641 650 648 645 663 644C705 644 726 631 726 605C726 599 725 592 724 585L616 157L401 662C393 681 391 683 366 683L233 683C209 683 200 681 200 659C200 649 211 644 232 644C274 644 295 643 296 640L163 110C154 71 131 49 95 42C69 39 39 43 39 15C39 5 45 0 56 0C74 0 136 3 155 3C174 3 238 0 257 0C272 0 279 8 279 24C279 33 271 38 255 39C214 40 194 53 194 78C194 83 195 90 197 100L326 611L576 21C582 7 590 0 599 0C608 0 614 8 618 24L757 574C770 625 798 643 860 644C874 645 881 653 881 669C878 678 877 683 864 683Z"></path></g><g data-mml-node="mi" data-latex="e" transform="translate(1348,0)"><path data-c="1D452" d="M124 129C124 153 129 186 139 227L188 227C253 227 303 235 339 250C372 264 394 284 405 309C412 326 415 342 415 355C415 410 363 442 307 442C268 442 229 432 190 412C113 372 46 281 46 171C46 69 105-11 204-11C257-11 304 2 345 27C379 48 404 69 420 90C427 99 430 106 430 109C430 120 425 126 414 126C409 126 404 122 398 114C365 70 324 42 277 30C246 22 223 18 206 18C149 18 124 72 124 129M375 355C375 289 311 256 182 256L147 256C166 322 194 366 232 387C262 404 287 413 307 413C343 413 375 391 375 355Z"></path></g><g data-mml-node="mi" data-latex="a" transform="translate(1814,0)"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(2343,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g><g data-mml-node="mo" data-latex="\cdot" transform="translate(3016.2,0)"><path data-c="22C5" d="M192 250C192 279 168 303 139 303C110 303 86 279 86 250C86 221 110 197 139 197C168 197 192 221 192 250Z"></path></g><g data-mml-node="mfrac" data-latex="\frac{y}{z}" transform="translate(3516.4,0)"><g data-mml-node="mi" transform="translate(220,485) scale(0.707)" data-latex="y"><path data-c="1D466" d="M163 442C118 442 83 417 58 367C39 328 29 301 29 286C29 277 34 272 45 272C59 272 60 278 64 293C87 372 119 412 160 412C173 412 180 403 180 385C180 369 175 346 164 317C126 214 107 145 107 108C107 32 154-13 231-13C264-13 295-1 323 23C288-109 233-175 158-175C124-175 101-164 89-142C129-140 149-121 149-85C149-60 136-47 109-47C72-47 50-78 50-115C50-170 100-205 158-205C273-205 367-99 392-1L486 377C489 388 490 396 490 401C490 421 479 431 458 431C442 431 429 423 420 408C414 387 409 369 406 354L342 97C332 61 279 16 234 16C196 16 177 41 177 92C177 134 194 198 227 284C240 319 247 343 247 357C247 406 212 442 163 442Z"></path></g><g data-mml-node="mi" transform="translate(228.1,-345) scale(0.707)" data-latex="z"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><rect width="546.5" height="60" x="120" y="220"></rect></g></g></g><g data-mml-node="mtr" transform="translate(0,-826.5)"><g data-mml-node="mtd" transform="translate(1944.5,0)"><g data-mml-node="mo" data-latex="?"><path data-c="3F" d="M226 705C140 705 56 652 56 570C56 535 72 518 105 518C138 518 154 535 154 568C154 598 137 614 102 616C127 655 168 675 223 675C297 675 326 646 326 573C326 555 324 540 321 528C313 501 312 502 294 482C236 419 207 344 207 257L207 213C207 194 212 185 222 185C233 185 239 195 239 216L239 250C239 331 281 404 366 467C399 492 415 525 415 568C415 662 328 705 226 705M278 56C278 87 253 113 222 113C191 113 167 87 167 56C167 26 192 0 222 0C253 0 278 25 278 56Z"></path></g></g></g><g data-mml-node="mtr" transform="translate(0,-2226.5)"><g data-mml-node="mtd" transform="translate(1930.5,0)"><g data-mml-node="mn" data-latex="1"><path data-c="31" d="M269 666C228 624 168 603 89 603L89 564C141 564 184 572 217 588L217 82C217 64 213 52 204 47C195 42 170 39 130 39L95 39L95 0C120 2 174 3 257 3C340 3 394 2 419 0L419 39L384 39C343 39 318 42 310 47C302 52 297 64 297 82L297 636C297 660 295 666 269 666Z"></path></g></g></g></g><g data-mml-node="mo" transform="translate(5235.9,0)"><path data-c="239E" d="M490 0L598 0L598 253C598 581 487 920 363 1150C281 1301 190 1415 91 1490C87 1493 82 1495 77 1495C60 1495 52 1487 52 1470C52 1462 55 1455 62 1450C143 1389 216 1292 283 1160C402 924 490 593 490 253Z" transform="translate(0,1481.5)"></path><path data-c="23A0" d="M598 1242L598 1495L490 1495L490 1242C490 1088 472 933 437 776C375 494 246 184 63 44C56 40 52 34 52 25C52 8 60 0 77 0C82 0 87 2 91 5C178 71 261 170 339 303C477 539 598 892 598 1242Z" transform="translate(0,-2476.5)"></path><svg width="875" height="2603.1" y="-1051.5" x="0" viewBox="0 650.8 875 2603.1"><path data-c="239F" d="M490 0L598 0L598 498L490 498Z" transform="scale(1,7.841)"></path></svg></g></g><g data-mml-node="mo" data-latex="\sim" transform="translate(10266.2,0)"><path data-c="223C" d="M597 143C674 166 714 235 717 350C717 361 712 366 701 366C691 366 686 361 685 351C684 308 675 275 657 251C637 224 592 194 548 194C518 194 486 207 453 233C434 248 418 261 406 271C335 333 274 364 222 364C207 364 192 362 177 357C92 332 59 262 56 150C56 139 61 134 72 134C82 134 87 139 88 149C89 192 98 225 116 249C135 275 182 306 225 306C255 306 287 293 320 267C339 252 355 239 367 229C438 167 499 136 551 136C566 136 582 138 597 143Z"></path></g><g data-mml-node="mrow" data-latex="{pmatrix}" transform="translate(11317,0)"><g data-mml-node="mo"><path data-c="239B" d="M813 1450C820 1455 823 1462 823 1470C823 1487 815 1495 798 1495C793 1495 788 1493 784 1490C697 1423 614 1324 536 1192C399 956 277 603 277 253L277 0L385 0L385 253C385 407 403 562 438 719C500 999 630 1313 813 1450Z" transform="translate(0,1355)"></path><path data-c="239D" d="M798 0C815 0 823 8 823 25C823 34 819 40 812 44C731 106 658 202 592 334C474 569 385 903 385 1242L385 1495L277 1495L277 1242C277 914 388 575 512 345C594 193 685 80 784 5C788 2 793 0 798 0Z" transform="translate(0,-2350)"></path><svg width="875" height="2350" y="-925" x="0" viewBox="0 587.5 875 2350"><path data-c="239C" d="M277 0L385 0L385 498L277 498Z" transform="scale(1,7.078)"></path></svg></g><g data-mml-node="mtable" transform="translate(875,0)"><g data-mml-node="mtr" transform="translate(0,2100)"><g data-mml-node="mtd"><g data-mml-node="mi" data-latex="z"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="mi" data-latex="N" transform="translate(467,0)"><path data-c="1D441" d="M864 683C845 683 783 680 764 680C745 680 682 683 663 683C648 683 641 675 641 659C641 650 648 645 663 644C705 644 726 631 726 605C726 599 725 592 724 585L616 157L401 662C393 681 391 683 366 683L233 683C209 683 200 681 200 659C200 649 211 644 232 644C274 644 295 643 296 640L163 110C154 71 131 49 95 42C69 39 39 43 39 15C39 5 45 0 56 0C74 0 136 3 155 3C174 3 238 0 257 0C272 0 279 8 279 24C279 33 271 38 255 39C214 40 194 53 194 78C194 83 195 90 197 100L326 611L576 21C582 7 590 0 599 0C608 0 614 8 618 24L757 574C770 625 798 643 860 644C874 645 881 653 881 669C878 678 877 683 864 683Z"></path></g><g data-mml-node="mi" data-latex="e" transform="translate(1348,0)"><path data-c="1D452" d="M124 129C124 153 129 186 139 227L188 227C253 227 303 235 339 250C372 264 394 284 405 309C412 326 415 342 415 355C415 410 363 442 307 442C268 442 229 432 190 412C113 372 46 281 46 171C46 69 105-11 204-11C257-11 304 2 345 27C379 48 404 69 420 90C427 99 430 106 430 109C430 120 425 126 414 126C409 126 404 122 398 114C365 70 324 42 277 30C246 22 223 18 206 18C149 18 124 72 124 129M375 355C375 289 311 256 182 256L147 256C166 322 194 366 232 387C262 404 287 413 307 413C343 413 375 391 375 355Z"></path></g><g data-mml-node="mi" data-latex="a" transform="translate(1814,0)"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(2343,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g><g data-mml-node="mo" data-latex="\cdot" transform="translate(3016.2,0)"><path data-c="22C5" d="M192 250C192 279 168 303 139 303C110 303 86 279 86 250C86 221 110 197 139 197C168 197 192 221 192 250Z"></path></g><g data-mml-node="mi" data-latex="x" transform="translate(3516.4,0)"><path data-c="1D465" d="M527 373C527 419 482 442 432 442C389 442 355 419 329 373C308 419 273 442 222 442C173 442 133 419 101 374C74 335 60 306 60 287C60 278 65 273 75 273C84 273 90 278 92 287C111 345 153 413 220 413C253 413 269 392 269 351C269 330 251 252 216 118C199 51 169 18 126 18C112 18 99 21 88 26C114 36 127 54 127 80C127 106 114 119 87 119C54 119 29 91 29 58C29 12 76-11 125-11C167-11 201 12 228 58C247 12 283-11 335-11C383-11 423 12 455 57C482 96 496 125 496 144C496 153 491 158 481 158C472 158 467 153 464 144C447 87 402 18 337 18C304 18 287 38 287 79C287 92 292 120 303 165L337 300C356 375 387 413 431 413C445 413 458 410 469 405C442 396 429 378 429 351C429 325 443 312 470 312C502 312 527 341 527 373Z"></path></g></g></g><g data-mml-node="mtr" transform="translate(0,700)"><g data-mml-node="mtd" transform="translate(41,0)"><g data-mml-node="mi" data-latex="z"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="mi" data-latex="N" transform="translate(467,0)"><path data-c="1D441" d="M864 683C845 683 783 680 764 680C745 680 682 683 663 683C648 683 641 675 641 659C641 650 648 645 663 644C705 644 726 631 726 605C726 599 725 592 724 585L616 157L401 662C393 681 391 683 366 683L233 683C209 683 200 681 200 659C200 649 211 644 232 644C274 644 295 643 296 640L163 110C154 71 131 49 95 42C69 39 39 43 39 15C39 5 45 0 56 0C74 0 136 3 155 3C174 3 238 0 257 0C272 0 279 8 279 24C279 33 271 38 255 39C214 40 194 53 194 78C194 83 195 90 197 100L326 611L576 21C582 7 590 0 599 0C608 0 614 8 618 24L757 574C770 625 798 643 860 644C874 645 881 653 881 669C878 678 877 683 864 683Z"></path></g><g data-mml-node="mi" data-latex="e" transform="translate(1348,0)"><path data-c="1D452" d="M124 129C124 153 129 186 139 227L188 227C253 227 303 235 339 250C372 264 394 284 405 309C412 326 415 342 415 355C415 410 363 442 307 442C268 442 229 432 190 412C113 372 46 281 46 171C46 69 105-11 204-11C257-11 304 2 345 27C379 48 404 69 420 90C427 99 430 106 430 109C430 120 425 126 414 126C409 126 404 122 398 114C365 70 324 42 277 30C246 22 223 18 206 18C149 18 124 72 124 129M375 355C375 289 311 256 182 256L147 256C166 322 194 366 232 387C262 404 287 413 307 413C343 413 375 391 375 355Z"></path></g><g data-mml-node="mi" data-latex="a" transform="translate(1814,0)"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(2343,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g><g data-mml-node="mo" data-latex="\cdot" transform="translate(3016.2,0)"><path data-c="22C5" d="M192 250C192 279 168 303 139 303C110 303 86 279 86 250C86 221 110 197 139 197C168 197 192 221 192 250Z"></path></g><g data-mml-node="mi" data-latex="y" transform="translate(3516.4,0)"><path data-c="1D466" d="M163 442C118 442 83 417 58 367C39 328 29 301 29 286C29 277 34 272 45 272C59 272 60 278 64 293C87 372 119 412 160 412C173 412 180 403 180 385C180 369 175 346 164 317C126 214 107 145 107 108C107 32 154-13 231-13C264-13 295-1 323 23C288-109 233-175 158-175C124-175 101-164 89-142C129-140 149-121 149-85C149-60 136-47 109-47C72-47 50-78 50-115C50-170 100-205 158-205C273-205 367-99 392-1L486 377C489 388 490 396 490 401C490 421 479 431 458 431C442 431 429 423 420 408C414 387 409 369 406 354L342 97C332 61 279 16 234 16C196 16 177 41 177 92C177 134 194 198 227 284C240 319 247 343 247 357C247 406 212 442 163 442Z"></path></g></g></g><g data-mml-node="mtr" transform="translate(0,-700)"><g data-mml-node="mtd" transform="translate(1808.2,0)"><g data-mml-node="mo" data-latex="?"><path data-c="3F" d="M226 705C140 705 56 652 56 570C56 535 72 518 105 518C138 518 154 535 154 568C154 598 137 614 102 616C127 655 168 675 223 675C297 675 326 646 326 573C326 555 324 540 321 528C313 501 312 502 294 482C236 419 207 344 207 257L207 213C207 194 212 185 222 185C233 185 239 195 239 216L239 250C239 331 281 404 366 467C399 492 415 525 415 568C415 662 328 705 226 705M278 56C278 87 253 113 222 113C191 113 167 87 167 56C167 26 192 0 222 0C253 0 278 25 278 56Z"></path></g></g></g><g data-mml-node="mtr" transform="translate(0,-2100)"><g data-mml-node="mtd" transform="translate(1810.7,0)"><g data-mml-node="mi" data-latex="z"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g></g></g></g><g data-mml-node="mo" transform="translate(4963.4,0)"><path data-c="239E" d="M490 0L598 0L598 253C598 581 487 920 363 1150C281 1301 190 1415 91 1490C87 1493 82 1495 77 1495C60 1495 52 1487 52 1470C52 1462 55 1455 62 1450C143 1389 216 1292 283 1160C402 924 490 593 490 253Z" transform="translate(0,1355)"></path><path data-c="23A0" d="M598 1242L598 1495L490 1495L490 1242C490 1088 472 933 437 776C375 494 246 184 63 44C56 40 52 34 52 25C52 8 60 0 77 0C82 0 87 2 91 5C178 71 261 170 339 303C477 539 598 892 598 1242Z" transform="translate(0,-2350)"></path><svg width="875" height="2350" y="-925" x="0" viewBox="0 587.5 875 2350"><path data-c="239F" d="M490 0L598 0L598 498L490 498Z" transform="scale(1,7.078)"></path></svg></g></g></g></g></svg></mjx-container></p></li><li><p>对于这样的变换，其变换矩阵可以很容易的写出：</p><p>  <mjx-container class="MathJax" jax="SVG" overflow="overflow" display="true"><svg style="vertical-align: -5.317ex;" xmlns="http://www.w3.org/2000/svg" width="25.652ex" height="11.765ex" role="img" focusable="false" viewBox="0 -2850 11338 5200"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="  \begin{pmatrix}  zNear &amp; 0 &amp; 0 &amp; 0 \\  0 &amp; zNear &amp; 0 &amp; 0 \\  ? &amp; ? &amp; ? &amp; ? \\  0 &amp; 0 &amp; 1 &amp; 0  \end{pmatrix}  "><g data-mml-node="mrow" data-latex="\begin{pmatrix}  zNear &amp; 0 &amp; 0 &amp; 0 \\  0 &amp; zNear &amp; 0 &amp; 0 \\  ? &amp; ? &amp; ? &amp; ? \\  0 &amp; 0 &amp; 1 &amp; 0  \end{pmatrix}"><g data-mml-node="mo"><path data-c="239B" d="M813 1450C820 1455 823 1462 823 1470C823 1487 815 1495 798 1495C793 1495 788 1493 784 1490C697 1423 614 1324 536 1192C399 956 277 603 277 253L277 0L385 0L385 253C385 407 403 562 438 719C500 999 630 1313 813 1450Z" transform="translate(0,1355)"></path><path data-c="239D" d="M798 0C815 0 823 8 823 25C823 34 819 40 812 44C731 106 658 202 592 334C474 569 385 903 385 1242L385 1495L277 1495L277 1242C277 914 388 575 512 345C594 193 685 80 784 5C788 2 793 0 798 0Z" transform="translate(0,-2350)"></path><svg width="875" height="2350" y="-925" x="0" viewBox="0 587.5 875 2350"><path data-c="239C" d="M277 0L385 0L385 498L277 498Z" transform="scale(1,7.078)"></path></svg></g><g data-mml-node="mtable" transform="translate(875,0)"><g data-mml-node="mtr" transform="translate(0,2100)"><g data-mml-node="mtd"><g data-mml-node="mi" data-latex="z"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="mi" data-latex="N" transform="translate(467,0)"><path data-c="1D441" d="M864 683C845 683 783 680 764 680C745 680 682 683 663 683C648 683 641 675 641 659C641 650 648 645 663 644C705 644 726 631 726 605C726 599 725 592 724 585L616 157L401 662C393 681 391 683 366 683L233 683C209 683 200 681 200 659C200 649 211 644 232 644C274 644 295 643 296 640L163 110C154 71 131 49 95 42C69 39 39 43 39 15C39 5 45 0 56 0C74 0 136 3 155 3C174 3 238 0 257 0C272 0 279 8 279 24C279 33 271 38 255 39C214 40 194 53 194 78C194 83 195 90 197 100L326 611L576 21C582 7 590 0 599 0C608 0 614 8 618 24L757 574C770 625 798 643 860 644C874 645 881 653 881 669C878 678 877 683 864 683Z"></path></g><g data-mml-node="mi" data-latex="e" transform="translate(1348,0)"><path data-c="1D452" d="M124 129C124 153 129 186 139 227L188 227C253 227 303 235 339 250C372 264 394 284 405 309C412 326 415 342 415 355C415 410 363 442 307 442C268 442 229 432 190 412C113 372 46 281 46 171C46 69 105-11 204-11C257-11 304 2 345 27C379 48 404 69 420 90C427 99 430 106 430 109C430 120 425 126 414 126C409 126 404 122 398 114C365 70 324 42 277 30C246 22 223 18 206 18C149 18 124 72 124 129M375 355C375 289 311 256 182 256L147 256C166 322 194 366 232 387C262 404 287 413 307 413C343 413 375 391 375 355Z"></path></g><g data-mml-node="mi" data-latex="a" transform="translate(1814,0)"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(2343,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g></g><g data-mml-node="mtd" transform="translate(4941,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(7588,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(9088,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g></g><g data-mml-node="mtr" transform="translate(0,700)"><g data-mml-node="mtd" transform="translate(1147,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(3794,0)"><g data-mml-node="mi" data-latex="z"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="mi" data-latex="N" transform="translate(467,0)"><path data-c="1D441" d="M864 683C845 683 783 680 764 680C745 680 682 683 663 683C648 683 641 675 641 659C641 650 648 645 663 644C705 644 726 631 726 605C726 599 725 592 724 585L616 157L401 662C393 681 391 683 366 683L233 683C209 683 200 681 200 659C200 649 211 644 232 644C274 644 295 643 296 640L163 110C154 71 131 49 95 42C69 39 39 43 39 15C39 5 45 0 56 0C74 0 136 3 155 3C174 3 238 0 257 0C272 0 279 8 279 24C279 33 271 38 255 39C214 40 194 53 194 78C194 83 195 90 197 100L326 611L576 21C582 7 590 0 599 0C608 0 614 8 618 24L757 574C770 625 798 643 860 644C874 645 881 653 881 669C878 678 877 683 864 683Z"></path></g><g data-mml-node="mi" data-latex="e" transform="translate(1348,0)"><path data-c="1D452" d="M124 129C124 153 129 186 139 227L188 227C253 227 303 235 339 250C372 264 394 284 405 309C412 326 415 342 415 355C415 410 363 442 307 442C268 442 229 432 190 412C113 372 46 281 46 171C46 69 105-11 204-11C257-11 304 2 345 27C379 48 404 69 420 90C427 99 430 106 430 109C430 120 425 126 414 126C409 126 404 122 398 114C365 70 324 42 277 30C246 22 223 18 206 18C149 18 124 72 124 129M375 355C375 289 311 256 182 256L147 256C166 322 194 366 232 387C262 404 287 413 307 413C343 413 375 391 375 355Z"></path></g><g data-mml-node="mi" data-latex="a" transform="translate(1814,0)"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(2343,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g></g><g data-mml-node="mtd" transform="translate(7588,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(9088,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g></g><g data-mml-node="mtr" transform="translate(0,-700)"><g data-mml-node="mtd" transform="translate(1161,0)"><g data-mml-node="mo" data-latex="?"><path data-c="3F" d="M226 705C140 705 56 652 56 570C56 535 72 518 105 518C138 518 154 535 154 568C154 598 137 614 102 616C127 655 168 675 223 675C297 675 326 646 326 573C326 555 324 540 321 528C313 501 312 502 294 482C236 419 207 344 207 257L207 213C207 194 212 185 222 185C233 185 239 195 239 216L239 250C239 331 281 404 366 467C399 492 415 525 415 568C415 662 328 705 226 705M278 56C278 87 253 113 222 113C191 113 167 87 167 56C167 26 192 0 222 0C253 0 278 25 278 56Z"></path></g></g><g data-mml-node="mtd" transform="translate(4955,0)"><g data-mml-node="mo" data-latex="?"><path data-c="3F" d="M226 705C140 705 56 652 56 570C56 535 72 518 105 518C138 518 154 535 154 568C154 598 137 614 102 616C127 655 168 675 223 675C297 675 326 646 326 573C326 555 324 540 321 528C313 501 312 502 294 482C236 419 207 344 207 257L207 213C207 194 212 185 222 185C233 185 239 195 239 216L239 250C239 331 281 404 366 467C399 492 415 525 415 568C415 662 328 705 226 705M278 56C278 87 253 113 222 113C191 113 167 87 167 56C167 26 192 0 222 0C253 0 278 25 278 56Z"></path></g></g><g data-mml-node="mtd" transform="translate(7602,0)"><g data-mml-node="mo" data-latex="?"><path data-c="3F" d="M226 705C140 705 56 652 56 570C56 535 72 518 105 518C138 518 154 535 154 568C154 598 137 614 102 616C127 655 168 675 223 675C297 675 326 646 326 573C326 555 324 540 321 528C313 501 312 502 294 482C236 419 207 344 207 257L207 213C207 194 212 185 222 185C233 185 239 195 239 216L239 250C239 331 281 404 366 467C399 492 415 525 415 568C415 662 328 705 226 705M278 56C278 87 253 113 222 113C191 113 167 87 167 56C167 26 192 0 222 0C253 0 278 25 278 56Z"></path></g></g><g data-mml-node="mtd" transform="translate(9102,0)"><g data-mml-node="mo" data-latex="?"><path data-c="3F" d="M226 705C140 705 56 652 56 570C56 535 72 518 105 518C138 518 154 535 154 568C154 598 137 614 102 616C127 655 168 675 223 675C297 675 326 646 326 573C326 555 324 540 321 528C313 501 312 502 294 482C236 419 207 344 207 257L207 213C207 194 212 185 222 185C233 185 239 195 239 216L239 250C239 331 281 404 366 467C399 492 415 525 415 568C415 662 328 705 226 705M278 56C278 87 253 113 222 113C191 113 167 87 167 56C167 26 192 0 222 0C253 0 278 25 278 56Z"></path></g></g></g><g data-mml-node="mtr" transform="translate(0,-2100)"><g data-mml-node="mtd" transform="translate(1147,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(4941,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(7588,0)"><g data-mml-node="mn" data-latex="1"><path data-c="31" d="M269 666C228 624 168 603 89 603L89 564C141 564 184 572 217 588L217 82C217 64 213 52 204 47C195 42 170 39 130 39L95 39L95 0C120 2 174 3 257 3C340 3 394 2 419 0L419 39L384 39C343 39 318 42 310 47C302 52 297 64 297 82L297 636C297 660 295 666 269 666Z"></path></g></g><g data-mml-node="mtd" transform="translate(9088,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g></g></g><g data-mml-node="mo" transform="translate(10463,0)"><path data-c="239E" d="M490 0L598 0L598 253C598 581 487 920 363 1150C281 1301 190 1415 91 1490C87 1493 82 1495 77 1495C60 1495 52 1487 52 1470C52 1462 55 1455 62 1450C143 1389 216 1292 283 1160C402 924 490 593 490 253Z" transform="translate(0,1355)"></path><path data-c="23A0" d="M598 1242L598 1495L490 1495L490 1242C490 1088 472 933 437 776C375 494 246 184 63 44C56 40 52 34 52 25C52 8 60 0 77 0C82 0 87 2 91 5C178 71 261 170 339 303C477 539 598 892 598 1242Z" transform="translate(0,-2350)"></path><svg width="875" height="2350" y="-925" x="0" viewBox="0 587.5 875 2350"><path data-c="239F" d="M490 0L598 0L598 498L490 498Z" transform="scale(1,7.078)"></path></svg></g></g></g></g></svg></mjx-container></p></li><li><p>对于该矩阵第三行的推导，我们同样可以使用先前推导旋转变换矩阵那样，选择两个特殊平面：</p><p>  <mjx-container class="MathJax" jax="SVG" overflow="overflow" display="true"><svg style="vertical-align: -5.412ex;" xmlns="http://www.w3.org/2000/svg" width="40.295ex" height="11.955ex" role="img" focusable="false" viewBox="0 -2892 17810.6 5283.9"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="  \begin{pmatrix}  x \\  y \\  zNear \\  1  \end{pmatrix} \to  \begin{pmatrix}  x \\  y \\  zNear \\  1  \end{pmatrix} \sim  \begin{pmatrix}  x \cdot zNear \\  y \cdot zNear\\  zNear^{2} \\  zNear  \end{pmatrix}  "><g data-mml-node="mrow" data-latex="{pmatrix}"><g data-mml-node="mo"><path data-c="239B" d="M813 1450C820 1455 823 1462 823 1470C823 1487 815 1495 798 1495C793 1495 788 1493 784 1490C697 1423 614 1324 536 1192C399 956 277 603 277 253L277 0L385 0L385 253C385 407 403 562 438 719C500 999 630 1313 813 1450Z" transform="translate(0,1355)"></path><path data-c="239D" d="M798 0C815 0 823 8 823 25C823 34 819 40 812 44C731 106 658 202 592 334C474 569 385 903 385 1242L385 1495L277 1495L277 1242C277 914 388 575 512 345C594 193 685 80 784 5C788 2 793 0 798 0Z" transform="translate(0,-2350)"></path><svg width="875" height="2350" y="-925" x="0" viewBox="0 587.5 875 2350"><path data-c="239C" d="M277 0L385 0L385 498L277 498Z" transform="scale(1,7.078)"></path></svg></g><g data-mml-node="mtable" transform="translate(875,0)"><g data-mml-node="mtr" transform="translate(0,2100)"><g data-mml-node="mtd" transform="translate(1111,0)"><g data-mml-node="mi" data-latex="x"><path data-c="1D465" d="M527 373C527 419 482 442 432 442C389 442 355 419 329 373C308 419 273 442 222 442C173 442 133 419 101 374C74 335 60 306 60 287C60 278 65 273 75 273C84 273 90 278 92 287C111 345 153 413 220 413C253 413 269 392 269 351C269 330 251 252 216 118C199 51 169 18 126 18C112 18 99 21 88 26C114 36 127 54 127 80C127 106 114 119 87 119C54 119 29 91 29 58C29 12 76-11 125-11C167-11 201 12 228 58C247 12 283-11 335-11C383-11 423 12 455 57C482 96 496 125 496 144C496 153 491 158 481 158C472 158 467 153 464 144C447 87 402 18 337 18C304 18 287 38 287 79C287 92 292 120 303 165L337 300C356 375 387 413 431 413C445 413 458 410 469 405C442 396 429 378 429 351C429 325 443 312 470 312C502 312 527 341 527 373Z"></path></g></g></g><g data-mml-node="mtr" transform="translate(0,700)"><g data-mml-node="mtd" transform="translate(1152,0)"><g data-mml-node="mi" data-latex="y"><path data-c="1D466" d="M163 442C118 442 83 417 58 367C39 328 29 301 29 286C29 277 34 272 45 272C59 272 60 278 64 293C87 372 119 412 160 412C173 412 180 403 180 385C180 369 175 346 164 317C126 214 107 145 107 108C107 32 154-13 231-13C264-13 295-1 323 23C288-109 233-175 158-175C124-175 101-164 89-142C129-140 149-121 149-85C149-60 136-47 109-47C72-47 50-78 50-115C50-170 100-205 158-205C273-205 367-99 392-1L486 377C489 388 490 396 490 401C490 421 479 431 458 431C442 431 429 423 420 408C414 387 409 369 406 354L342 97C332 61 279 16 234 16C196 16 177 41 177 92C177 134 194 198 227 284C240 319 247 343 247 357C247 406 212 442 163 442Z"></path></g></g></g><g data-mml-node="mtr" transform="translate(0,-700)"><g data-mml-node="mtd"><g data-mml-node="mi" data-latex="z"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="mi" data-latex="N" transform="translate(467,0)"><path data-c="1D441" d="M864 683C845 683 783 680 764 680C745 680 682 683 663 683C648 683 641 675 641 659C641 650 648 645 663 644C705 644 726 631 726 605C726 599 725 592 724 585L616 157L401 662C393 681 391 683 366 683L233 683C209 683 200 681 200 659C200 649 211 644 232 644C274 644 295 643 296 640L163 110C154 71 131 49 95 42C69 39 39 43 39 15C39 5 45 0 56 0C74 0 136 3 155 3C174 3 238 0 257 0C272 0 279 8 279 24C279 33 271 38 255 39C214 40 194 53 194 78C194 83 195 90 197 100L326 611L576 21C582 7 590 0 599 0C608 0 614 8 618 24L757 574C770 625 798 643 860 644C874 645 881 653 881 669C878 678 877 683 864 683Z"></path></g><g data-mml-node="mi" data-latex="e" transform="translate(1348,0)"><path data-c="1D452" d="M124 129C124 153 129 186 139 227L188 227C253 227 303 235 339 250C372 264 394 284 405 309C412 326 415 342 415 355C415 410 363 442 307 442C268 442 229 432 190 412C113 372 46 281 46 171C46 69 105-11 204-11C257-11 304 2 345 27C379 48 404 69 420 90C427 99 430 106 430 109C430 120 425 126 414 126C409 126 404 122 398 114C365 70 324 42 277 30C246 22 223 18 206 18C149 18 124 72 124 129M375 355C375 289 311 256 182 256L147 256C166 322 194 366 232 387C262 404 287 413 307 413C343 413 375 391 375 355Z"></path></g><g data-mml-node="mi" data-latex="a" transform="translate(1814,0)"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(2343,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g></g></g><g data-mml-node="mtr" transform="translate(0,-2100)"><g data-mml-node="mtd" transform="translate(1147,0)"><g data-mml-node="mn" data-latex="1"><path data-c="31" d="M269 666C228 624 168 603 89 603L89 564C141 564 184 572 217 588L217 82C217 64 213 52 204 47C195 42 170 39 130 39L95 39L95 0C120 2 174 3 257 3C340 3 394 2 419 0L419 39L384 39C343 39 318 42 310 47C302 52 297 64 297 82L297 636C297 660 295 666 269 666Z"></path></g></g></g></g><g data-mml-node="mo" transform="translate(3669,0)"><path data-c="239E" d="M490 0L598 0L598 253C598 581 487 920 363 1150C281 1301 190 1415 91 1490C87 1493 82 1495 77 1495C60 1495 52 1487 52 1470C52 1462 55 1455 62 1450C143 1389 216 1292 283 1160C402 924 490 593 490 253Z" transform="translate(0,1355)"></path><path data-c="23A0" d="M598 1242L598 1495L490 1495L490 1242C490 1088 472 933 437 776C375 494 246 184 63 44C56 40 52 34 52 25C52 8 60 0 77 0C82 0 87 2 91 5C178 71 261 170 339 303C477 539 598 892 598 1242Z" transform="translate(0,-2350)"></path><svg width="875" height="2350" y="-925" x="0" viewBox="0 587.5 875 2350"><path data-c="239F" d="M490 0L598 0L598 498L490 498Z" transform="scale(1,7.078)"></path></svg></g></g><g data-mml-node="mo" data-latex="\to" transform="translate(4821.8,0)"><path data-c="2192" d="M932 234C939 237 943 243 943 250C943 257 939 263 932 266C884 282 839 316 797 368C769 403 750 444 741 491C738 504 730 510 717 510C701 510 693 502 693 485L694 483L694 482C711 395 755 326 828 274L82 274C66 274 58 266 58 250C58 234 66 226 82 226L828 226C755 174 711 105 694 18L694 17L693 15C693-2 701-10 717-10C730-10 738-4 741 9C750 56 769 97 797 132C839 184 884 218 932 234Z"></path></g><g data-mml-node="mrow" data-latex="{pmatrix}" transform="translate(6099.6,0)"><g data-mml-node="mo"><path data-c="239B" d="M813 1450C820 1455 823 1462 823 1470C823 1487 815 1495 798 1495C793 1495 788 1493 784 1490C697 1423 614 1324 536 1192C399 956 277 603 277 253L277 0L385 0L385 253C385 407 403 562 438 719C500 999 630 1313 813 1450Z" transform="translate(0,1355)"></path><path data-c="239D" d="M798 0C815 0 823 8 823 25C823 34 819 40 812 44C731 106 658 202 592 334C474 569 385 903 385 1242L385 1495L277 1495L277 1242C277 914 388 575 512 345C594 193 685 80 784 5C788 2 793 0 798 0Z" transform="translate(0,-2350)"></path><svg width="875" height="2350" y="-925" x="0" viewBox="0 587.5 875 2350"><path data-c="239C" d="M277 0L385 0L385 498L277 498Z" transform="scale(1,7.078)"></path></svg></g><g data-mml-node="mtable" transform="translate(875,0)"><g data-mml-node="mtr" transform="translate(0,2100)"><g data-mml-node="mtd" transform="translate(1111,0)"><g data-mml-node="mi" data-latex="x"><path data-c="1D465" d="M527 373C527 419 482 442 432 442C389 442 355 419 329 373C308 419 273 442 222 442C173 442 133 419 101 374C74 335 60 306 60 287C60 278 65 273 75 273C84 273 90 278 92 287C111 345 153 413 220 413C253 413 269 392 269 351C269 330 251 252 216 118C199 51 169 18 126 18C112 18 99 21 88 26C114 36 127 54 127 80C127 106 114 119 87 119C54 119 29 91 29 58C29 12 76-11 125-11C167-11 201 12 228 58C247 12 283-11 335-11C383-11 423 12 455 57C482 96 496 125 496 144C496 153 491 158 481 158C472 158 467 153 464 144C447 87 402 18 337 18C304 18 287 38 287 79C287 92 292 120 303 165L337 300C356 375 387 413 431 413C445 413 458 410 469 405C442 396 429 378 429 351C429 325 443 312 470 312C502 312 527 341 527 373Z"></path></g></g></g><g data-mml-node="mtr" transform="translate(0,700)"><g data-mml-node="mtd" transform="translate(1152,0)"><g data-mml-node="mi" data-latex="y"><path data-c="1D466" d="M163 442C118 442 83 417 58 367C39 328 29 301 29 286C29 277 34 272 45 272C59 272 60 278 64 293C87 372 119 412 160 412C173 412 180 403 180 385C180 369 175 346 164 317C126 214 107 145 107 108C107 32 154-13 231-13C264-13 295-1 323 23C288-109 233-175 158-175C124-175 101-164 89-142C129-140 149-121 149-85C149-60 136-47 109-47C72-47 50-78 50-115C50-170 100-205 158-205C273-205 367-99 392-1L486 377C489 388 490 396 490 401C490 421 479 431 458 431C442 431 429 423 420 408C414 387 409 369 406 354L342 97C332 61 279 16 234 16C196 16 177 41 177 92C177 134 194 198 227 284C240 319 247 343 247 357C247 406 212 442 163 442Z"></path></g></g></g><g data-mml-node="mtr" transform="translate(0,-700)"><g data-mml-node="mtd"><g data-mml-node="mi" data-latex="z"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="mi" data-latex="N" transform="translate(467,0)"><path data-c="1D441" d="M864 683C845 683 783 680 764 680C745 680 682 683 663 683C648 683 641 675 641 659C641 650 648 645 663 644C705 644 726 631 726 605C726 599 725 592 724 585L616 157L401 662C393 681 391 683 366 683L233 683C209 683 200 681 200 659C200 649 211 644 232 644C274 644 295 643 296 640L163 110C154 71 131 49 95 42C69 39 39 43 39 15C39 5 45 0 56 0C74 0 136 3 155 3C174 3 238 0 257 0C272 0 279 8 279 24C279 33 271 38 255 39C214 40 194 53 194 78C194 83 195 90 197 100L326 611L576 21C582 7 590 0 599 0C608 0 614 8 618 24L757 574C770 625 798 643 860 644C874 645 881 653 881 669C878 678 877 683 864 683Z"></path></g><g data-mml-node="mi" data-latex="e" transform="translate(1348,0)"><path data-c="1D452" d="M124 129C124 153 129 186 139 227L188 227C253 227 303 235 339 250C372 264 394 284 405 309C412 326 415 342 415 355C415 410 363 442 307 442C268 442 229 432 190 412C113 372 46 281 46 171C46 69 105-11 204-11C257-11 304 2 345 27C379 48 404 69 420 90C427 99 430 106 430 109C430 120 425 126 414 126C409 126 404 122 398 114C365 70 324 42 277 30C246 22 223 18 206 18C149 18 124 72 124 129M375 355C375 289 311 256 182 256L147 256C166 322 194 366 232 387C262 404 287 413 307 413C343 413 375 391 375 355Z"></path></g><g data-mml-node="mi" data-latex="a" transform="translate(1814,0)"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(2343,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g></g></g><g data-mml-node="mtr" transform="translate(0,-2100)"><g data-mml-node="mtd" transform="translate(1147,0)"><g data-mml-node="mn" data-latex="1"><path data-c="31" d="M269 666C228 624 168 603 89 603L89 564C141 564 184 572 217 588L217 82C217 64 213 52 204 47C195 42 170 39 130 39L95 39L95 0C120 2 174 3 257 3C340 3 394 2 419 0L419 39L384 39C343 39 318 42 310 47C302 52 297 64 297 82L297 636C297 660 295 666 269 666Z"></path></g></g></g></g><g data-mml-node="mo" transform="translate(3669,0)"><path data-c="239E" d="M490 0L598 0L598 253C598 581 487 920 363 1150C281 1301 190 1415 91 1490C87 1493 82 1495 77 1495C60 1495 52 1487 52 1470C52 1462 55 1455 62 1450C143 1389 216 1292 283 1160C402 924 490 593 490 253Z" transform="translate(0,1355)"></path><path data-c="23A0" d="M598 1242L598 1495L490 1495L490 1242C490 1088 472 933 437 776C375 494 246 184 63 44C56 40 52 34 52 25C52 8 60 0 77 0C82 0 87 2 91 5C178 71 261 170 339 303C477 539 598 892 598 1242Z" transform="translate(0,-2350)"></path><svg width="875" height="2350" y="-925" x="0" viewBox="0 587.5 875 2350"><path data-c="239F" d="M490 0L598 0L598 498L490 498Z" transform="scale(1,7.078)"></path></svg></g></g><g data-mml-node="mo" data-latex="\sim" transform="translate(10921.3,0)"><path data-c="223C" d="M597 143C674 166 714 235 717 350C717 361 712 366 701 366C691 366 686 361 685 351C684 308 675 275 657 251C637 224 592 194 548 194C518 194 486 207 453 233C434 248 418 261 406 271C335 333 274 364 222 364C207 364 192 362 177 357C92 332 59 262 56 150C56 139 61 134 72 134C82 134 87 139 88 149C89 192 98 225 116 249C135 275 182 306 225 306C255 306 287 293 320 267C339 252 355 239 367 229C438 167 499 136 551 136C566 136 582 138 597 143Z"></path></g><g data-mml-node="mrow" data-latex="{pmatrix}" transform="translate(11972.1,0)"><g data-mml-node="mo"><path data-c="239B" d="M813 1450C820 1455 823 1462 823 1470C823 1487 815 1495 798 1495C793 1495 788 1493 784 1490C697 1423 614 1324 536 1192C399 956 277 603 277 253L277 0L385 0L385 253C385 407 403 562 438 719C500 999 630 1313 813 1450Z" transform="translate(0,1397)"></path><path data-c="239D" d="M798 0C815 0 823 8 823 25C823 34 819 40 812 44C731 106 658 202 592 334C474 569 385 903 385 1242L385 1495L277 1495L277 1242C277 914 388 575 512 345C594 193 685 80 784 5C788 2 793 0 798 0Z" transform="translate(0,-2392)"></path><svg width="875" height="2433.9" y="-967" x="0" viewBox="0 608.5 875 2433.9"><path data-c="239C" d="M277 0L385 0L385 498L277 498Z" transform="scale(1,7.331)"></path></svg></g><g data-mml-node="mtable" transform="translate(875,0)"><g data-mml-node="mtr" transform="translate(0,2142)"><g data-mml-node="mtd"><g data-mml-node="mi" data-latex="x"><path data-c="1D465" d="M527 373C527 419 482 442 432 442C389 442 355 419 329 373C308 419 273 442 222 442C173 442 133 419 101 374C74 335 60 306 60 287C60 278 65 273 75 273C84 273 90 278 92 287C111 345 153 413 220 413C253 413 269 392 269 351C269 330 251 252 216 118C199 51 169 18 126 18C112 18 99 21 88 26C114 36 127 54 127 80C127 106 114 119 87 119C54 119 29 91 29 58C29 12 76-11 125-11C167-11 201 12 228 58C247 12 283-11 335-11C383-11 423 12 455 57C482 96 496 125 496 144C496 153 491 158 481 158C472 158 467 153 464 144C447 87 402 18 337 18C304 18 287 38 287 79C287 92 292 120 303 165L337 300C356 375 387 413 431 413C445 413 458 410 469 405C442 396 429 378 429 351C429 325 443 312 470 312C502 312 527 341 527 373Z"></path></g><g data-mml-node="mo" data-latex="\cdot" transform="translate(794.2,0)"><path data-c="22C5" d="M192 250C192 279 168 303 139 303C110 303 86 279 86 250C86 221 110 197 139 197C168 197 192 221 192 250Z"></path></g><g data-mml-node="mi" data-latex="z" transform="translate(1294.4,0)"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="mi" data-latex="N" transform="translate(1761.4,0)"><path data-c="1D441" d="M864 683C845 683 783 680 764 680C745 680 682 683 663 683C648 683 641 675 641 659C641 650 648 645 663 644C705 644 726 631 726 605C726 599 725 592 724 585L616 157L401 662C393 681 391 683 366 683L233 683C209 683 200 681 200 659C200 649 211 644 232 644C274 644 295 643 296 640L163 110C154 71 131 49 95 42C69 39 39 43 39 15C39 5 45 0 56 0C74 0 136 3 155 3C174 3 238 0 257 0C272 0 279 8 279 24C279 33 271 38 255 39C214 40 194 53 194 78C194 83 195 90 197 100L326 611L576 21C582 7 590 0 599 0C608 0 614 8 618 24L757 574C770 625 798 643 860 644C874 645 881 653 881 669C878 678 877 683 864 683Z"></path></g><g data-mml-node="mi" data-latex="e" transform="translate(2642.4,0)"><path data-c="1D452" d="M124 129C124 153 129 186 139 227L188 227C253 227 303 235 339 250C372 264 394 284 405 309C412 326 415 342 415 355C415 410 363 442 307 442C268 442 229 432 190 412C113 372 46 281 46 171C46 69 105-11 204-11C257-11 304 2 345 27C379 48 404 69 420 90C427 99 430 106 430 109C430 120 425 126 414 126C409 126 404 122 398 114C365 70 324 42 277 30C246 22 223 18 206 18C149 18 124 72 124 129M375 355C375 289 311 256 182 256L147 256C166 322 194 366 232 387C262 404 287 413 307 413C343 413 375 391 375 355Z"></path></g><g data-mml-node="mi" data-latex="a" transform="translate(3108.4,0)"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(3637.4,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g></g></g><g data-mml-node="mtr" transform="translate(0,742)"><g data-mml-node="mtd" transform="translate(41,0)"><g data-mml-node="mi" data-latex="y"><path data-c="1D466" d="M163 442C118 442 83 417 58 367C39 328 29 301 29 286C29 277 34 272 45 272C59 272 60 278 64 293C87 372 119 412 160 412C173 412 180 403 180 385C180 369 175 346 164 317C126 214 107 145 107 108C107 32 154-13 231-13C264-13 295-1 323 23C288-109 233-175 158-175C124-175 101-164 89-142C129-140 149-121 149-85C149-60 136-47 109-47C72-47 50-78 50-115C50-170 100-205 158-205C273-205 367-99 392-1L486 377C489 388 490 396 490 401C490 421 479 431 458 431C442 431 429 423 420 408C414 387 409 369 406 354L342 97C332 61 279 16 234 16C196 16 177 41 177 92C177 134 194 198 227 284C240 319 247 343 247 357C247 406 212 442 163 442Z"></path></g><g data-mml-node="mo" data-latex="\cdot" transform="translate(712.2,0)"><path data-c="22C5" d="M192 250C192 279 168 303 139 303C110 303 86 279 86 250C86 221 110 197 139 197C168 197 192 221 192 250Z"></path></g><g data-mml-node="mi" data-latex="z" transform="translate(1212.4,0)"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="mi" data-latex="N" transform="translate(1679.4,0)"><path data-c="1D441" d="M864 683C845 683 783 680 764 680C745 680 682 683 663 683C648 683 641 675 641 659C641 650 648 645 663 644C705 644 726 631 726 605C726 599 725 592 724 585L616 157L401 662C393 681 391 683 366 683L233 683C209 683 200 681 200 659C200 649 211 644 232 644C274 644 295 643 296 640L163 110C154 71 131 49 95 42C69 39 39 43 39 15C39 5 45 0 56 0C74 0 136 3 155 3C174 3 238 0 257 0C272 0 279 8 279 24C279 33 271 38 255 39C214 40 194 53 194 78C194 83 195 90 197 100L326 611L576 21C582 7 590 0 599 0C608 0 614 8 618 24L757 574C770 625 798 643 860 644C874 645 881 653 881 669C878 678 877 683 864 683Z"></path></g><g data-mml-node="mi" data-latex="e" transform="translate(2560.4,0)"><path data-c="1D452" d="M124 129C124 153 129 186 139 227L188 227C253 227 303 235 339 250C372 264 394 284 405 309C412 326 415 342 415 355C415 410 363 442 307 442C268 442 229 432 190 412C113 372 46 281 46 171C46 69 105-11 204-11C257-11 304 2 345 27C379 48 404 69 420 90C427 99 430 106 430 109C430 120 425 126 414 126C409 126 404 122 398 114C365 70 324 42 277 30C246 22 223 18 206 18C149 18 124 72 124 129M375 355C375 289 311 256 182 256L147 256C166 322 194 366 232 387C262 404 287 413 307 413C343 413 375 391 375 355Z"></path></g><g data-mml-node="mi" data-latex="a" transform="translate(3026.4,0)"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(3555.4,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g></g></g><g data-mml-node="mtr" transform="translate(0,-742)"><g data-mml-node="mtd" transform="translate(428.9,0)"><g data-mml-node="mi" data-latex="z"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="mi" data-latex="N" transform="translate(467,0)"><path data-c="1D441" d="M864 683C845 683 783 680 764 680C745 680 682 683 663 683C648 683 641 675 641 659C641 650 648 645 663 644C705 644 726 631 726 605C726 599 725 592 724 585L616 157L401 662C393 681 391 683 366 683L233 683C209 683 200 681 200 659C200 649 211 644 232 644C274 644 295 643 296 640L163 110C154 71 131 49 95 42C69 39 39 43 39 15C39 5 45 0 56 0C74 0 136 3 155 3C174 3 238 0 257 0C272 0 279 8 279 24C279 33 271 38 255 39C214 40 194 53 194 78C194 83 195 90 197 100L326 611L576 21C582 7 590 0 599 0C608 0 614 8 618 24L757 574C770 625 798 643 860 644C874 645 881 653 881 669C878 678 877 683 864 683Z"></path></g><g data-mml-node="mi" data-latex="e" transform="translate(1348,0)"><path data-c="1D452" d="M124 129C124 153 129 186 139 227L188 227C253 227 303 235 339 250C372 264 394 284 405 309C412 326 415 342 415 355C415 410 363 442 307 442C268 442 229 432 190 412C113 372 46 281 46 171C46 69 105-11 204-11C257-11 304 2 345 27C379 48 404 69 420 90C427 99 430 106 430 109C430 120 425 126 414 126C409 126 404 122 398 114C365 70 324 42 277 30C246 22 223 18 206 18C149 18 124 72 124 129M375 355C375 289 311 256 182 256L147 256C166 322 194 366 232 387C262 404 287 413 307 413C343 413 375 391 375 355Z"></path></g><g data-mml-node="mi" data-latex="a" transform="translate(1814,0)"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g><g data-mml-node="msup" data-latex="r^{2}" transform="translate(2343,0)"><g data-mml-node="mi" data-latex="r"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g><g data-mml-node="TeXAtom" transform="translate(484,363) scale(0.707)" data-latex="{2}" data-mjx-texclass="ORD"><g data-mml-node="mn" data-latex="2"><path data-c="32" d="M237 666C186 666 143 648 106 612C69 576 50 534 50 483C50 449 75 424 106 424C136 424 161 450 161 480C161 513 137 536 105 536C102 536 100 536 98 535C117 584 161 627 224 627C306 627 352 556 352 470C352 403 318 331 250 255L62 43C49 28 50 29 50 0L421 0L450 180L417 180C409 129 402 100 396 91C391 86 361 84 306 84L139 84L236 179C304 243 390 312 419 365C439 400 449 435 449 470C449 588 357 666 237 666Z"></path></g></g></g></g></g><g data-mml-node="mtr" transform="translate(0,-2142)"><g data-mml-node="mtd" transform="translate(647.2,0)"><g data-mml-node="mi" data-latex="z"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="mi" data-latex="N" transform="translate(467,0)"><path data-c="1D441" d="M864 683C845 683 783 680 764 680C745 680 682 683 663 683C648 683 641 675 641 659C641 650 648 645 663 644C705 644 726 631 726 605C726 599 725 592 724 585L616 157L401 662C393 681 391 683 366 683L233 683C209 683 200 681 200 659C200 649 211 644 232 644C274 644 295 643 296 640L163 110C154 71 131 49 95 42C69 39 39 43 39 15C39 5 45 0 56 0C74 0 136 3 155 3C174 3 238 0 257 0C272 0 279 8 279 24C279 33 271 38 255 39C214 40 194 53 194 78C194 83 195 90 197 100L326 611L576 21C582 7 590 0 599 0C608 0 614 8 618 24L757 574C770 625 798 643 860 644C874 645 881 653 881 669C878 678 877 683 864 683Z"></path></g><g data-mml-node="mi" data-latex="e" transform="translate(1348,0)"><path data-c="1D452" d="M124 129C124 153 129 186 139 227L188 227C253 227 303 235 339 250C372 264 394 284 405 309C412 326 415 342 415 355C415 410 363 442 307 442C268 442 229 432 190 412C113 372 46 281 46 171C46 69 105-11 204-11C257-11 304 2 345 27C379 48 404 69 420 90C427 99 430 106 430 109C430 120 425 126 414 126C409 126 404 122 398 114C365 70 324 42 277 30C246 22 223 18 206 18C149 18 124 72 124 129M375 355C375 289 311 256 182 256L147 256C166 322 194 366 232 387C262 404 287 413 307 413C343 413 375 391 375 355Z"></path></g><g data-mml-node="mi" data-latex="a" transform="translate(1814,0)"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(2343,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g></g></g></g><g data-mml-node="mo" transform="translate(4963.4,0)"><path data-c="239E" d="M490 0L598 0L598 253C598 581 487 920 363 1150C281 1301 190 1415 91 1490C87 1493 82 1495 77 1495C60 1495 52 1487 52 1470C52 1462 55 1455 62 1450C143 1389 216 1292 283 1160C402 924 490 593 490 253Z" transform="translate(0,1397)"></path><path data-c="23A0" d="M598 1242L598 1495L490 1495L490 1242C490 1088 472 933 437 776C375 494 246 184 63 44C56 40 52 34 52 25C52 8 60 0 77 0C82 0 87 2 91 5C178 71 261 170 339 303C477 539 598 892 598 1242Z" transform="translate(0,-2392)"></path><svg width="875" height="2433.9" y="-967" x="0" viewBox="0 608.5 875 2433.9"><path data-c="239F" d="M490 0L598 0L598 498L490 498Z" transform="scale(1,7.331)"></path></svg></g></g></g></g></svg></mjx-container></p><p>  和</p><p>  <mjx-container class="MathJax" jax="SVG" overflow="overflow" display="true"><svg style="vertical-align: -5.836ex;" xmlns="http://www.w3.org/2000/svg" width="41.02ex" height="12.804ex" role="img" focusable="false" viewBox="0 -3079.7 18130.7 5659.5"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="  \begin{pmatrix}  x \\  y \\  zFar \\  1  \end{pmatrix} \to  \begin{pmatrix}  x \cdot \frac{zNear}{zFar} \\  y \cdot \frac{zNear}{zFar} \\  zFar \\  1  \end{pmatrix} \sim  \begin{pmatrix}  x \cdot zNear \\  y \cdot zNear \\  zFar^{2} \\  zFar  \end{pmatrix}  "><g data-mml-node="mrow" data-latex="{pmatrix}"><g data-mml-node="mo"><path data-c="239B" d="M813 1450C820 1455 823 1462 823 1470C823 1487 815 1495 798 1495C793 1495 788 1493 784 1490C697 1423 614 1324 536 1192C399 956 277 603 277 253L277 0L385 0L385 253C385 407 403 562 438 719C500 999 630 1313 813 1450Z" transform="translate(0,1355)"></path><path data-c="239D" d="M798 0C815 0 823 8 823 25C823 34 819 40 812 44C731 106 658 202 592 334C474 569 385 903 385 1242L385 1495L277 1495L277 1242C277 914 388 575 512 345C594 193 685 80 784 5C788 2 793 0 798 0Z" transform="translate(0,-2350)"></path><svg width="875" height="2350" y="-925" x="0" viewBox="0 587.5 875 2350"><path data-c="239C" d="M277 0L385 0L385 498L277 498Z" transform="scale(1,7.078)"></path></svg></g><g data-mml-node="mtable" transform="translate(875,0)"><g data-mml-node="mtr" transform="translate(0,2100)"><g data-mml-node="mtd" transform="translate(813,0)"><g data-mml-node="mi" data-latex="x"><path data-c="1D465" d="M527 373C527 419 482 442 432 442C389 442 355 419 329 373C308 419 273 442 222 442C173 442 133 419 101 374C74 335 60 306 60 287C60 278 65 273 75 273C84 273 90 278 92 287C111 345 153 413 220 413C253 413 269 392 269 351C269 330 251 252 216 118C199 51 169 18 126 18C112 18 99 21 88 26C114 36 127 54 127 80C127 106 114 119 87 119C54 119 29 91 29 58C29 12 76-11 125-11C167-11 201 12 228 58C247 12 283-11 335-11C383-11 423 12 455 57C482 96 496 125 496 144C496 153 491 158 481 158C472 158 467 153 464 144C447 87 402 18 337 18C304 18 287 38 287 79C287 92 292 120 303 165L337 300C356 375 387 413 431 413C445 413 458 410 469 405C442 396 429 378 429 351C429 325 443 312 470 312C502 312 527 341 527 373Z"></path></g></g></g><g data-mml-node="mtr" transform="translate(0,700)"><g data-mml-node="mtd" transform="translate(854,0)"><g data-mml-node="mi" data-latex="y"><path data-c="1D466" d="M163 442C118 442 83 417 58 367C39 328 29 301 29 286C29 277 34 272 45 272C59 272 60 278 64 293C87 372 119 412 160 412C173 412 180 403 180 385C180 369 175 346 164 317C126 214 107 145 107 108C107 32 154-13 231-13C264-13 295-1 323 23C288-109 233-175 158-175C124-175 101-164 89-142C129-140 149-121 149-85C149-60 136-47 109-47C72-47 50-78 50-115C50-170 100-205 158-205C273-205 367-99 392-1L486 377C489 388 490 396 490 401C490 421 479 431 458 431C442 431 429 423 420 408C414 387 409 369 406 354L342 97C332 61 279 16 234 16C196 16 177 41 177 92C177 134 194 198 227 284C240 319 247 343 247 357C247 406 212 442 163 442Z"></path></g></g></g><g data-mml-node="mtr" transform="translate(0,-700)"><g data-mml-node="mtd"><g data-mml-node="mi" data-latex="z"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="mi" data-latex="F" transform="translate(467,0)"><path data-c="1D439" d="M199 656C199 646 210 641 231 641C271 641 291 637 291 628C291 625 289 618 286 605L156 82C150 60 140 47 126 42C119 40 101 39 70 39C48 39 38 37 38 16C38 5 44 0 57 0L187 3L335 0C351 0 359 8 359 23C359 40 348 39 322 39C278 39 253 41 247 46C244 47 243 51 243 56L307 321L400 321C446 321 478 319 478 281C478 268 476 252 471 233C470 230 469 226 468 222C468 211 473 206 484 206C489 207 496 214 503 229L557 444C559 452 560 458 560 461C557 470 551 475 544 475C536 475 530 467 526 452C516 414 502 390 486 378C470 366 442 360 402 360L317 360L379 606C387 640 387 641 429 641L559 641C656 641 700 626 700 537C700 517 699 499 697 484C696 473 695 467 695 466C695 455 700 450 710 450C720 450 726 459 728 478L748 649C751 677 744 680 717 680L233 680C210 680 199 679 199 656Z"></path></g><g data-mml-node="mi" data-latex="a" transform="translate(1218,0)"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(1747,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g></g></g><g data-mml-node="mtr" transform="translate(0,-2100)"><g data-mml-node="mtd" transform="translate(849,0)"><g data-mml-node="mn" data-latex="1"><path data-c="31" d="M269 666C228 624 168 603 89 603L89 564C141 564 184 572 217 588L217 82C217 64 213 52 204 47C195 42 170 39 130 39L95 39L95 0C120 2 174 3 257 3C340 3 394 2 419 0L419 39L384 39C343 39 318 42 310 47C302 52 297 64 297 82L297 636C297 660 295 666 269 666Z"></path></g></g></g></g><g data-mml-node="mo" transform="translate(3073,0)"><path data-c="239E" d="M490 0L598 0L598 253C598 581 487 920 363 1150C281 1301 190 1415 91 1490C87 1493 82 1495 77 1495C60 1495 52 1487 52 1470C52 1462 55 1455 62 1450C143 1389 216 1292 283 1160C402 924 490 593 490 253Z" transform="translate(0,1355)"></path><path data-c="23A0" d="M598 1242L598 1495L490 1495L490 1242C490 1088 472 933 437 776C375 494 246 184 63 44C56 40 52 34 52 25C52 8 60 0 77 0C82 0 87 2 91 5C178 71 261 170 339 303C477 539 598 892 598 1242Z" transform="translate(0,-2350)"></path><svg width="875" height="2350" y="-925" x="0" viewBox="0 587.5 875 2350"><path data-c="239F" d="M490 0L598 0L598 498L490 498Z" transform="scale(1,7.078)"></path></svg></g></g><g data-mml-node="mo" data-latex="\to" transform="translate(4225.8,0)"><path data-c="2192" d="M932 234C939 237 943 243 943 250C943 257 939 263 932 266C884 282 839 316 797 368C769 403 750 444 741 491C738 504 730 510 717 510C701 510 693 502 693 485L694 483L694 482C711 395 755 326 828 274L82 274C66 274 58 266 58 250C58 234 66 226 82 226L828 226C755 174 711 105 694 18L694 17L693 15C693-2 701-10 717-10C730-10 738-4 741 9C750 56 769 97 797 132C839 184 884 218 932 234Z"></path></g><g data-mml-node="mrow" data-latex="{pmatrix}" transform="translate(5503.6,0)"><g data-mml-node="mo"><path data-c="239B" d="M813 1450C820 1455 823 1462 823 1470C823 1487 815 1495 798 1495C793 1495 788 1493 784 1490C697 1423 614 1324 536 1192C399 956 277 603 277 253L277 0L385 0L385 253C385 407 403 562 438 719C500 999 630 1313 813 1450Z" transform="translate(0,1584.7)"></path><path data-c="239D" d="M798 0C815 0 823 8 823 25C823 34 819 40 812 44C731 106 658 202 592 334C474 569 385 903 385 1242L385 1495L277 1495L277 1242C277 914 388 575 512 345C594 193 685 80 784 5C788 2 793 0 798 0Z" transform="translate(0,-2579.7)"></path><svg width="875" height="2809.5" y="-1154.7" x="0" viewBox="0 702.4 875 2809.5"><path data-c="239C" d="M277 0L385 0L385 498L277 498Z" transform="scale(1,8.462)"></path></svg></g><g data-mml-node="mtable" transform="translate(875,0)"><g data-mml-node="mtr" transform="translate(0,2202.8)"><g data-mml-node="mtd"><g data-mml-node="mi" data-latex="x"><path data-c="1D465" d="M527 373C527 419 482 442 432 442C389 442 355 419 329 373C308 419 273 442 222 442C173 442 133 419 101 374C74 335 60 306 60 287C60 278 65 273 75 273C84 273 90 278 92 287C111 345 153 413 220 413C253 413 269 392 269 351C269 330 251 252 216 118C199 51 169 18 126 18C112 18 99 21 88 26C114 36 127 54 127 80C127 106 114 119 87 119C54 119 29 91 29 58C29 12 76-11 125-11C167-11 201 12 228 58C247 12 283-11 335-11C383-11 423 12 455 57C482 96 496 125 496 144C496 153 491 158 481 158C472 158 467 153 464 144C447 87 402 18 337 18C304 18 287 38 287 79C287 92 292 120 303 165L337 300C356 375 387 413 431 413C445 413 458 410 469 405C442 396 429 378 429 351C429 325 443 312 470 312C502 312 527 341 527 373Z"></path></g><g data-mml-node="mo" data-latex="\cdot" transform="translate(794.2,0)"><path data-c="22C5" d="M192 250C192 279 168 303 139 303C110 303 86 279 86 250C86 221 110 197 139 197C168 197 192 221 192 250Z"></path></g><g data-mml-node="mfrac" data-latex="\frac{zNear}{zFar}" transform="translate(1294.4,0)"><g data-mml-node="mrow" transform="translate(220,394) scale(0.707)" data-latex="zNear"><g data-mml-node="mi" data-latex="z"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="mi" data-latex="N" transform="translate(467,0)"><path data-c="1D441" d="M864 683C845 683 783 680 764 680C745 680 682 683 663 683C648 683 641 675 641 659C641 650 648 645 663 644C705 644 726 631 726 605C726 599 725 592 724 585L616 157L401 662C393 681 391 683 366 683L233 683C209 683 200 681 200 659C200 649 211 644 232 644C274 644 295 643 296 640L163 110C154 71 131 49 95 42C69 39 39 43 39 15C39 5 45 0 56 0C74 0 136 3 155 3C174 3 238 0 257 0C272 0 279 8 279 24C279 33 271 38 255 39C214 40 194 53 194 78C194 83 195 90 197 100L326 611L576 21C582 7 590 0 599 0C608 0 614 8 618 24L757 574C770 625 798 643 860 644C874 645 881 653 881 669C878 678 877 683 864 683Z"></path></g><g data-mml-node="mi" data-latex="e" transform="translate(1348,0)"><path data-c="1D452" d="M124 129C124 153 129 186 139 227L188 227C253 227 303 235 339 250C372 264 394 284 405 309C412 326 415 342 415 355C415 410 363 442 307 442C268 442 229 432 190 412C113 372 46 281 46 171C46 69 105-11 204-11C257-11 304 2 345 27C379 48 404 69 420 90C427 99 430 106 430 109C430 120 425 126 414 126C409 126 404 122 398 114C365 70 324 42 277 30C246 22 223 18 206 18C149 18 124 72 124 129M375 355C375 289 311 256 182 256L147 256C166 322 194 366 232 387C262 404 287 413 307 413C343 413 375 391 375 355Z"></path></g><g data-mml-node="mi" data-latex="a" transform="translate(1814,0)"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(2343,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g></g><g data-mml-node="mrow" transform="translate(430.7,-345) scale(0.707)" data-latex="zFar"><g data-mml-node="mi" data-latex="z"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="mi" data-latex="F" transform="translate(467,0)"><path data-c="1D439" d="M199 656C199 646 210 641 231 641C271 641 291 637 291 628C291 625 289 618 286 605L156 82C150 60 140 47 126 42C119 40 101 39 70 39C48 39 38 37 38 16C38 5 44 0 57 0L187 3L335 0C351 0 359 8 359 23C359 40 348 39 322 39C278 39 253 41 247 46C244 47 243 51 243 56L307 321L400 321C446 321 478 319 478 281C478 268 476 252 471 233C470 230 469 226 468 222C468 211 473 206 484 206C489 207 496 214 503 229L557 444C559 452 560 458 560 461C557 470 551 475 544 475C536 475 530 467 526 452C516 414 502 390 486 378C470 366 442 360 402 360L317 360L379 606C387 640 387 641 429 641L559 641C656 641 700 626 700 537C700 517 699 499 697 484C696 473 695 467 695 466C695 455 700 450 710 450C720 450 726 459 728 478L748 649C751 677 744 680 717 680L233 680C210 680 199 679 199 656Z"></path></g><g data-mml-node="mi" data-latex="a" transform="translate(1218,0)"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(1747,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g></g><rect width="2175.7" height="60" x="120" y="220"></rect></g></g></g><g data-mml-node="mtr" transform="translate(0,573)"><g data-mml-node="mtd" transform="translate(41,0)"><g data-mml-node="mi" data-latex="y"><path data-c="1D466" d="M163 442C118 442 83 417 58 367C39 328 29 301 29 286C29 277 34 272 45 272C59 272 60 278 64 293C87 372 119 412 160 412C173 412 180 403 180 385C180 369 175 346 164 317C126 214 107 145 107 108C107 32 154-13 231-13C264-13 295-1 323 23C288-109 233-175 158-175C124-175 101-164 89-142C129-140 149-121 149-85C149-60 136-47 109-47C72-47 50-78 50-115C50-170 100-205 158-205C273-205 367-99 392-1L486 377C489 388 490 396 490 401C490 421 479 431 458 431C442 431 429 423 420 408C414 387 409 369 406 354L342 97C332 61 279 16 234 16C196 16 177 41 177 92C177 134 194 198 227 284C240 319 247 343 247 357C247 406 212 442 163 442Z"></path></g><g data-mml-node="mo" data-latex="\cdot" transform="translate(712.2,0)"><path data-c="22C5" d="M192 250C192 279 168 303 139 303C110 303 86 279 86 250C86 221 110 197 139 197C168 197 192 221 192 250Z"></path></g><g data-mml-node="mfrac" data-latex="\frac{zNear}{zFar}" transform="translate(1212.4,0)"><g data-mml-node="mrow" transform="translate(220,394) scale(0.707)" data-latex="zNear"><g data-mml-node="mi" data-latex="z"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="mi" data-latex="N" transform="translate(467,0)"><path data-c="1D441" d="M864 683C845 683 783 680 764 680C745 680 682 683 663 683C648 683 641 675 641 659C641 650 648 645 663 644C705 644 726 631 726 605C726 599 725 592 724 585L616 157L401 662C393 681 391 683 366 683L233 683C209 683 200 681 200 659C200 649 211 644 232 644C274 644 295 643 296 640L163 110C154 71 131 49 95 42C69 39 39 43 39 15C39 5 45 0 56 0C74 0 136 3 155 3C174 3 238 0 257 0C272 0 279 8 279 24C279 33 271 38 255 39C214 40 194 53 194 78C194 83 195 90 197 100L326 611L576 21C582 7 590 0 599 0C608 0 614 8 618 24L757 574C770 625 798 643 860 644C874 645 881 653 881 669C878 678 877 683 864 683Z"></path></g><g data-mml-node="mi" data-latex="e" transform="translate(1348,0)"><path data-c="1D452" d="M124 129C124 153 129 186 139 227L188 227C253 227 303 235 339 250C372 264 394 284 405 309C412 326 415 342 415 355C415 410 363 442 307 442C268 442 229 432 190 412C113 372 46 281 46 171C46 69 105-11 204-11C257-11 304 2 345 27C379 48 404 69 420 90C427 99 430 106 430 109C430 120 425 126 414 126C409 126 404 122 398 114C365 70 324 42 277 30C246 22 223 18 206 18C149 18 124 72 124 129M375 355C375 289 311 256 182 256L147 256C166 322 194 366 232 387C262 404 287 413 307 413C343 413 375 391 375 355Z"></path></g><g data-mml-node="mi" data-latex="a" transform="translate(1814,0)"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(2343,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g></g><g data-mml-node="mrow" transform="translate(430.7,-345) scale(0.707)" data-latex="zFar"><g data-mml-node="mi" data-latex="z"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="mi" data-latex="F" transform="translate(467,0)"><path data-c="1D439" d="M199 656C199 646 210 641 231 641C271 641 291 637 291 628C291 625 289 618 286 605L156 82C150 60 140 47 126 42C119 40 101 39 70 39C48 39 38 37 38 16C38 5 44 0 57 0L187 3L335 0C351 0 359 8 359 23C359 40 348 39 322 39C278 39 253 41 247 46C244 47 243 51 243 56L307 321L400 321C446 321 478 319 478 281C478 268 476 252 471 233C470 230 469 226 468 222C468 211 473 206 484 206C489 207 496 214 503 229L557 444C559 452 560 458 560 461C557 470 551 475 544 475C536 475 530 467 526 452C516 414 502 390 486 378C470 366 442 360 402 360L317 360L379 606C387 640 387 641 429 641L559 641C656 641 700 626 700 537C700 517 699 499 697 484C696 473 695 467 695 466C695 455 700 450 710 450C720 450 726 459 728 478L748 649C751 677 744 680 717 680L233 680C210 680 199 679 199 656Z"></path></g><g data-mml-node="mi" data-latex="a" transform="translate(1218,0)"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(1747,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g></g><rect width="2175.7" height="60" x="120" y="220"></rect></g></g></g><g data-mml-node="mtr" transform="translate(0,-929.7)"><g data-mml-node="mtd" transform="translate(756.1,0)"><g data-mml-node="mi" data-latex="z"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="mi" data-latex="F" transform="translate(467,0)"><path data-c="1D439" d="M199 656C199 646 210 641 231 641C271 641 291 637 291 628C291 625 289 618 286 605L156 82C150 60 140 47 126 42C119 40 101 39 70 39C48 39 38 37 38 16C38 5 44 0 57 0L187 3L335 0C351 0 359 8 359 23C359 40 348 39 322 39C278 39 253 41 247 46C244 47 243 51 243 56L307 321L400 321C446 321 478 319 478 281C478 268 476 252 471 233C470 230 469 226 468 222C468 211 473 206 484 206C489 207 496 214 503 229L557 444C559 452 560 458 560 461C557 470 551 475 544 475C536 475 530 467 526 452C516 414 502 390 486 378C470 366 442 360 402 360L317 360L379 606C387 640 387 641 429 641L559 641C656 641 700 626 700 537C700 517 699 499 697 484C696 473 695 467 695 466C695 455 700 450 710 450C720 450 726 459 728 478L748 649C751 677 744 680 717 680L233 680C210 680 199 679 199 656Z"></path></g><g data-mml-node="mi" data-latex="a" transform="translate(1218,0)"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(1747,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g></g></g><g data-mml-node="mtr" transform="translate(0,-2329.7)"><g data-mml-node="mtd" transform="translate(1605.1,0)"><g data-mml-node="mn" data-latex="1"><path data-c="31" d="M269 666C228 624 168 603 89 603L89 564C141 564 184 572 217 588L217 82C217 64 213 52 204 47C195 42 170 39 130 39L95 39L95 0C120 2 174 3 257 3C340 3 394 2 419 0L419 39L384 39C343 39 318 42 310 47C302 52 297 64 297 82L297 636C297 660 295 666 269 666Z"></path></g></g></g></g><g data-mml-node="mo" transform="translate(4585.1,0)"><path data-c="239E" d="M490 0L598 0L598 253C598 581 487 920 363 1150C281 1301 190 1415 91 1490C87 1493 82 1495 77 1495C60 1495 52 1487 52 1470C52 1462 55 1455 62 1450C143 1389 216 1292 283 1160C402 924 490 593 490 253Z" transform="translate(0,1584.7)"></path><path data-c="23A0" d="M598 1242L598 1495L490 1495L490 1242C490 1088 472 933 437 776C375 494 246 184 63 44C56 40 52 34 52 25C52 8 60 0 77 0C82 0 87 2 91 5C178 71 261 170 339 303C477 539 598 892 598 1242Z" transform="translate(0,-2579.7)"></path><svg width="875" height="2809.5" y="-1154.7" x="0" viewBox="0 702.4 875 2809.5"><path data-c="239F" d="M490 0L598 0L598 498L490 498Z" transform="scale(1,8.462)"></path></svg></g></g><g data-mml-node="mo" data-latex="\sim" transform="translate(11241.4,0)"><path data-c="223C" d="M597 143C674 166 714 235 717 350C717 361 712 366 701 366C691 366 686 361 685 351C684 308 675 275 657 251C637 224 592 194 548 194C518 194 486 207 453 233C434 248 418 261 406 271C335 333 274 364 222 364C207 364 192 362 177 357C92 332 59 262 56 150C56 139 61 134 72 134C82 134 87 139 88 149C89 192 98 225 116 249C135 275 182 306 225 306C255 306 287 293 320 267C339 252 355 239 367 229C438 167 499 136 551 136C566 136 582 138 597 143Z"></path></g><g data-mml-node="mrow" data-latex="{pmatrix}" transform="translate(12292.2,0)"><g data-mml-node="mo"><path data-c="239B" d="M813 1450C820 1455 823 1462 823 1470C823 1487 815 1495 798 1495C793 1495 788 1493 784 1490C697 1423 614 1324 536 1192C399 956 277 603 277 253L277 0L385 0L385 253C385 407 403 562 438 719C500 999 630 1313 813 1450Z" transform="translate(0,1397)"></path><path data-c="239D" d="M798 0C815 0 823 8 823 25C823 34 819 40 812 44C731 106 658 202 592 334C474 569 385 903 385 1242L385 1495L277 1495L277 1242C277 914 388 575 512 345C594 193 685 80 784 5C788 2 793 0 798 0Z" transform="translate(0,-2392)"></path><svg width="875" height="2433.9" y="-967" x="0" viewBox="0 608.5 875 2433.9"><path data-c="239C" d="M277 0L385 0L385 498L277 498Z" transform="scale(1,7.331)"></path></svg></g><g data-mml-node="mtable" transform="translate(875,0)"><g data-mml-node="mtr" transform="translate(0,2142)"><g data-mml-node="mtd"><g data-mml-node="mi" data-latex="x"><path data-c="1D465" d="M527 373C527 419 482 442 432 442C389 442 355 419 329 373C308 419 273 442 222 442C173 442 133 419 101 374C74 335 60 306 60 287C60 278 65 273 75 273C84 273 90 278 92 287C111 345 153 413 220 413C253 413 269 392 269 351C269 330 251 252 216 118C199 51 169 18 126 18C112 18 99 21 88 26C114 36 127 54 127 80C127 106 114 119 87 119C54 119 29 91 29 58C29 12 76-11 125-11C167-11 201 12 228 58C247 12 283-11 335-11C383-11 423 12 455 57C482 96 496 125 496 144C496 153 491 158 481 158C472 158 467 153 464 144C447 87 402 18 337 18C304 18 287 38 287 79C287 92 292 120 303 165L337 300C356 375 387 413 431 413C445 413 458 410 469 405C442 396 429 378 429 351C429 325 443 312 470 312C502 312 527 341 527 373Z"></path></g><g data-mml-node="mo" data-latex="\cdot" transform="translate(794.2,0)"><path data-c="22C5" d="M192 250C192 279 168 303 139 303C110 303 86 279 86 250C86 221 110 197 139 197C168 197 192 221 192 250Z"></path></g><g data-mml-node="mi" data-latex="z" transform="translate(1294.4,0)"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="mi" data-latex="N" transform="translate(1761.4,0)"><path data-c="1D441" d="M864 683C845 683 783 680 764 680C745 680 682 683 663 683C648 683 641 675 641 659C641 650 648 645 663 644C705 644 726 631 726 605C726 599 725 592 724 585L616 157L401 662C393 681 391 683 366 683L233 683C209 683 200 681 200 659C200 649 211 644 232 644C274 644 295 643 296 640L163 110C154 71 131 49 95 42C69 39 39 43 39 15C39 5 45 0 56 0C74 0 136 3 155 3C174 3 238 0 257 0C272 0 279 8 279 24C279 33 271 38 255 39C214 40 194 53 194 78C194 83 195 90 197 100L326 611L576 21C582 7 590 0 599 0C608 0 614 8 618 24L757 574C770 625 798 643 860 644C874 645 881 653 881 669C878 678 877 683 864 683Z"></path></g><g data-mml-node="mi" data-latex="e" transform="translate(2642.4,0)"><path data-c="1D452" d="M124 129C124 153 129 186 139 227L188 227C253 227 303 235 339 250C372 264 394 284 405 309C412 326 415 342 415 355C415 410 363 442 307 442C268 442 229 432 190 412C113 372 46 281 46 171C46 69 105-11 204-11C257-11 304 2 345 27C379 48 404 69 420 90C427 99 430 106 430 109C430 120 425 126 414 126C409 126 404 122 398 114C365 70 324 42 277 30C246 22 223 18 206 18C149 18 124 72 124 129M375 355C375 289 311 256 182 256L147 256C166 322 194 366 232 387C262 404 287 413 307 413C343 413 375 391 375 355Z"></path></g><g data-mml-node="mi" data-latex="a" transform="translate(3108.4,0)"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(3637.4,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g></g></g><g data-mml-node="mtr" transform="translate(0,742)"><g data-mml-node="mtd" transform="translate(41,0)"><g data-mml-node="mi" data-latex="y"><path data-c="1D466" d="M163 442C118 442 83 417 58 367C39 328 29 301 29 286C29 277 34 272 45 272C59 272 60 278 64 293C87 372 119 412 160 412C173 412 180 403 180 385C180 369 175 346 164 317C126 214 107 145 107 108C107 32 154-13 231-13C264-13 295-1 323 23C288-109 233-175 158-175C124-175 101-164 89-142C129-140 149-121 149-85C149-60 136-47 109-47C72-47 50-78 50-115C50-170 100-205 158-205C273-205 367-99 392-1L486 377C489 388 490 396 490 401C490 421 479 431 458 431C442 431 429 423 420 408C414 387 409 369 406 354L342 97C332 61 279 16 234 16C196 16 177 41 177 92C177 134 194 198 227 284C240 319 247 343 247 357C247 406 212 442 163 442Z"></path></g><g data-mml-node="mo" data-latex="\cdot" transform="translate(712.2,0)"><path data-c="22C5" d="M192 250C192 279 168 303 139 303C110 303 86 279 86 250C86 221 110 197 139 197C168 197 192 221 192 250Z"></path></g><g data-mml-node="mi" data-latex="z" transform="translate(1212.4,0)"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="mi" data-latex="N" transform="translate(1679.4,0)"><path data-c="1D441" d="M864 683C845 683 783 680 764 680C745 680 682 683 663 683C648 683 641 675 641 659C641 650 648 645 663 644C705 644 726 631 726 605C726 599 725 592 724 585L616 157L401 662C393 681 391 683 366 683L233 683C209 683 200 681 200 659C200 649 211 644 232 644C274 644 295 643 296 640L163 110C154 71 131 49 95 42C69 39 39 43 39 15C39 5 45 0 56 0C74 0 136 3 155 3C174 3 238 0 257 0C272 0 279 8 279 24C279 33 271 38 255 39C214 40 194 53 194 78C194 83 195 90 197 100L326 611L576 21C582 7 590 0 599 0C608 0 614 8 618 24L757 574C770 625 798 643 860 644C874 645 881 653 881 669C878 678 877 683 864 683Z"></path></g><g data-mml-node="mi" data-latex="e" transform="translate(2560.4,0)"><path data-c="1D452" d="M124 129C124 153 129 186 139 227L188 227C253 227 303 235 339 250C372 264 394 284 405 309C412 326 415 342 415 355C415 410 363 442 307 442C268 442 229 432 190 412C113 372 46 281 46 171C46 69 105-11 204-11C257-11 304 2 345 27C379 48 404 69 420 90C427 99 430 106 430 109C430 120 425 126 414 126C409 126 404 122 398 114C365 70 324 42 277 30C246 22 223 18 206 18C149 18 124 72 124 129M375 355C375 289 311 256 182 256L147 256C166 322 194 366 232 387C262 404 287 413 307 413C343 413 375 391 375 355Z"></path></g><g data-mml-node="mi" data-latex="a" transform="translate(3026.4,0)"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(3555.4,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g></g></g><g data-mml-node="mtr" transform="translate(0,-742)"><g data-mml-node="mtd" transform="translate(726.9,0)"><g data-mml-node="mi" data-latex="z"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="mi" data-latex="F" transform="translate(467,0)"><path data-c="1D439" d="M199 656C199 646 210 641 231 641C271 641 291 637 291 628C291 625 289 618 286 605L156 82C150 60 140 47 126 42C119 40 101 39 70 39C48 39 38 37 38 16C38 5 44 0 57 0L187 3L335 0C351 0 359 8 359 23C359 40 348 39 322 39C278 39 253 41 247 46C244 47 243 51 243 56L307 321L400 321C446 321 478 319 478 281C478 268 476 252 471 233C470 230 469 226 468 222C468 211 473 206 484 206C489 207 496 214 503 229L557 444C559 452 560 458 560 461C557 470 551 475 544 475C536 475 530 467 526 452C516 414 502 390 486 378C470 366 442 360 402 360L317 360L379 606C387 640 387 641 429 641L559 641C656 641 700 626 700 537C700 517 699 499 697 484C696 473 695 467 695 466C695 455 700 450 710 450C720 450 726 459 728 478L748 649C751 677 744 680 717 680L233 680C210 680 199 679 199 656Z"></path></g><g data-mml-node="mi" data-latex="a" transform="translate(1218,0)"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g><g data-mml-node="msup" data-latex="r^{2}" transform="translate(1747,0)"><g data-mml-node="mi" data-latex="r"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g><g data-mml-node="TeXAtom" transform="translate(484,363) scale(0.707)" data-latex="{2}" data-mjx-texclass="ORD"><g data-mml-node="mn" data-latex="2"><path data-c="32" d="M237 666C186 666 143 648 106 612C69 576 50 534 50 483C50 449 75 424 106 424C136 424 161 450 161 480C161 513 137 536 105 536C102 536 100 536 98 535C117 584 161 627 224 627C306 627 352 556 352 470C352 403 318 331 250 255L62 43C49 28 50 29 50 0L421 0L450 180L417 180C409 129 402 100 396 91C391 86 361 84 306 84L139 84L236 179C304 243 390 312 419 365C439 400 449 435 449 470C449 588 357 666 237 666Z"></path></g></g></g></g></g><g data-mml-node="mtr" transform="translate(0,-2142)"><g data-mml-node="mtd" transform="translate(945.2,0)"><g data-mml-node="mi" data-latex="z"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="mi" data-latex="F" transform="translate(467,0)"><path data-c="1D439" d="M199 656C199 646 210 641 231 641C271 641 291 637 291 628C291 625 289 618 286 605L156 82C150 60 140 47 126 42C119 40 101 39 70 39C48 39 38 37 38 16C38 5 44 0 57 0L187 3L335 0C351 0 359 8 359 23C359 40 348 39 322 39C278 39 253 41 247 46C244 47 243 51 243 56L307 321L400 321C446 321 478 319 478 281C478 268 476 252 471 233C470 230 469 226 468 222C468 211 473 206 484 206C489 207 496 214 503 229L557 444C559 452 560 458 560 461C557 470 551 475 544 475C536 475 530 467 526 452C516 414 502 390 486 378C470 366 442 360 402 360L317 360L379 606C387 640 387 641 429 641L559 641C656 641 700 626 700 537C700 517 699 499 697 484C696 473 695 467 695 466C695 455 700 450 710 450C720 450 726 459 728 478L748 649C751 677 744 680 717 680L233 680C210 680 199 679 199 656Z"></path></g><g data-mml-node="mi" data-latex="a" transform="translate(1218,0)"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(1747,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g></g></g></g><g data-mml-node="mo" transform="translate(4963.4,0)"><path data-c="239E" d="M490 0L598 0L598 253C598 581 487 920 363 1150C281 1301 190 1415 91 1490C87 1493 82 1495 77 1495C60 1495 52 1487 52 1470C52 1462 55 1455 62 1450C143 1389 216 1292 283 1160C402 924 490 593 490 253Z" transform="translate(0,1397)"></path><path data-c="23A0" d="M598 1242L598 1495L490 1495L490 1242C490 1088 472 933 437 776C375 494 246 184 63 44C56 40 52 34 52 25C52 8 60 0 77 0C82 0 87 2 91 5C178 71 261 170 339 303C477 539 598 892 598 1242Z" transform="translate(0,-2392)"></path><svg width="875" height="2433.9" y="-967" x="0" viewBox="0 608.5 875 2433.9"><path data-c="239F" d="M490 0L598 0L598 498L490 498Z" transform="scale(1,7.331)"></path></svg></g></g></g></g></svg></mjx-container></p></li><li><p>注意到变换后结果的第三分量与 <mjx-container class="MathJax" jax="SVG" overflow="overflow"><svg style="vertical-align: -0.464ex;" xmlns="http://www.w3.org/2000/svg" width="3.409ex" height="1.464ex" role="img" focusable="false" viewBox="0 -442 1506.7 647"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="x, y"><g data-mml-node="mi" data-latex="x"><path data-c="1D465" d="M527 373C527 419 482 442 432 442C389 442 355 419 329 373C308 419 273 442 222 442C173 442 133 419 101 374C74 335 60 306 60 287C60 278 65 273 75 273C84 273 90 278 92 287C111 345 153 413 220 413C253 413 269 392 269 351C269 330 251 252 216 118C199 51 169 18 126 18C112 18 99 21 88 26C114 36 127 54 127 80C127 106 114 119 87 119C54 119 29 91 29 58C29 12 76-11 125-11C167-11 201 12 228 58C247 12 283-11 335-11C383-11 423 12 455 57C482 96 496 125 496 144C496 153 491 158 481 158C472 158 467 153 464 144C447 87 402 18 337 18C304 18 287 38 287 79C287 92 292 120 303 165L337 300C356 375 387 413 431 413C445 413 458 410 469 405C442 396 429 378 429 351C429 325 443 312 470 312C502 312 527 341 527 373Z"></path></g><g data-mml-node="mo" data-latex="," transform="translate(572,0)"><path data-c="2C" d="M139 106C107 106 86 82 86 50C86 20 109-5 139-5C153-5 165-1 174 8L175 0C175-63 154-117 112-160C105-168 101-174 101-178C101-188 105-193 114-193C123-193 135-181 152-158C186-110 203-57 203 0C203 53 185 106 139 106Z"></path></g><g data-mml-node="mi" data-latex="y" transform="translate(1016.7,0)"><path data-c="1D466" d="M163 442C118 442 83 417 58 367C39 328 29 301 29 286C29 277 34 272 45 272C59 272 60 278 64 293C87 372 119 412 160 412C173 412 180 403 180 385C180 369 175 346 164 317C126 214 107 145 107 108C107 32 154-13 231-13C264-13 295-1 323 23C288-109 233-175 158-175C124-175 101-164 89-142C129-140 149-121 149-85C149-60 136-47 109-47C72-47 50-78 50-115C50-170 100-205 158-205C273-205 367-99 392-1L486 377C489 388 490 396 490 401C490 421 479 431 458 431C442 431 429 423 420 408C414 387 409 369 406 354L342 97C332 61 279 16 234 16C196 16 177 41 177 92C177 134 194 198 227 284C240 319 247 343 247 357C247 406 212 442 163 442Z"></path></g></g></g></svg></mjx-container> 无关，由此可以判断变换矩阵的第三行前两项均为 <mjx-container class="MathJax" jax="SVG" overflow="overflow"><svg style="vertical-align: -0.05ex;" xmlns="http://www.w3.org/2000/svg" width="1.131ex" height="1.557ex" role="img" focusable="false" viewBox="0 -666 500 688"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="0"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g></g></svg></mjx-container>。设剩余两项分别为 <mjx-container class="MathJax" jax="SVG" overflow="overflow"><svg style="vertical-align: -0.437ex;" xmlns="http://www.w3.org/2000/svg" width="4.42ex" height="2.057ex" role="img" focusable="false" viewBox="0 -716 1953.7 909"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="A, B"><g data-mml-node="mi" data-latex="A"><path data-c="1D434" d="M137 3C155 3 217 0 236 0C251 0 258 8 258 23C258 32 252 38 239 39C210 40 196 50 196 69C196 78 205 98 224 128C251 173 270 206 283 228L526 228C526 221 527 207 530 185C537 112 541 72 541 67C541 48 519 39 474 39C455 39 446 31 446 15C446 5 452 0 464 0C488 0 564 3 588 3C608 3 679 0 699 0C714 0 721 8 721 24C721 34 712 39 694 39C666 39 649 41 644 44C639 47 635 56 634 71L574 689C571 708 572 716 551 716C539 716 529 710 522 697L178 120C148 70 108 43 59 39C43 38 35 30 35 15C35 5 41 0 52 0C68 0 121 3 137 3M492 577L522 267L307 267Z"></path></g><g data-mml-node="mo" data-latex="," transform="translate(750,0)"><path data-c="2C" d="M139 106C107 106 86 82 86 50C86 20 109-5 139-5C153-5 165-1 174 8L175 0C175-63 154-117 112-160C105-168 101-174 101-178C101-188 105-193 114-193C123-193 135-181 152-158C186-110 203-57 203 0C203 53 185 106 139 106Z"></path></g><g data-mml-node="mi" data-latex="B" transform="translate(1194.7,0)"><path data-c="1D435" d="M756 543C756 634 666 683 568 683L236 683C213 683 203 682 203 659C203 643 223 644 235 644C265 643 283 641 288 640C293 639 295 636 295 631C295 629 294 623 291 613L159 82C154 60 144 47 129 42C122 40 104 39 73 39C52 39 42 31 42 15C42 5 52 0 73 0L426 0C491 0 551 20 608 59C671 102 703 155 703 217C703 296 638 344 567 358C655 379 756 446 756 543M554 644C623 644 658 612 658 547C658 496 638 454 596 420C554 386 507 370 456 370L317 370L377 610C385 644 385 644 427 644M582 299C596 276 603 253 603 228C603 176 583 131 542 94C501 57 455 39 402 39L267 39C257 39 250 39 246 40C240 40 237 42 237 45C237 46 237 49 238 53C269 180 293 276 309 340L493 340C536 340 565 326 582 299Z"></path></g></g></g></svg></mjx-container>，有：</p><p>  <mjx-container class="MathJax" jax="SVG" overflow="overflow" display="true"><svg style="vertical-align: -11.425ex;" xmlns="http://www.w3.org/2000/svg" width="42.42ex" height="23.982ex" role="img" focusable="false" viewBox="0 -5550 18749.8 10600"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="  \begin{cases}  \begin{pmatrix}  0 &amp; 0 &amp; A &amp; B \\  0 &amp; 0 &amp; 1 &amp; 0  \end{pmatrix}  \begin{pmatrix}  x \\  y \\  zNear \\  1  \end{pmatrix} =  \begin{pmatrix}  zNear^{2} \\  zNear  \end{pmatrix} \\  \begin{pmatrix}  0 &amp; 0 &amp; A &amp; B \\  0 &amp; 0 &amp; 1 &amp; 0  \end{pmatrix}  \begin{pmatrix}  x \\  y \\  zFar \\  1  \end{pmatrix} =  \begin{pmatrix}  zFar^{2} \\  zFar  \end{pmatrix}  \end{cases}  "><g data-mml-node="mrow" data-latex="\begin{cases}  \begin{pmatrix}  0 &amp; 0 &amp; A &amp; B \\  0 &amp; 0 &amp; 1 &amp; 0  \end{pmatrix}  \begin{pmatrix}  x \\  y \\  zNear \\  1  \end{pmatrix} =  \begin{pmatrix}  zNear^{2} \\  zNear  \end{pmatrix} \\  \begin{pmatrix}  0 &amp; 0 &amp; A &amp; B \\  0 &amp; 0 &amp; 1 &amp; 0  \end{pmatrix}  \begin{pmatrix}  x \\  y \\  zFar \\  1  \end{pmatrix} =  \begin{pmatrix}  zFar^{2} \\  zFar  \end{pmatrix}  \end{cases}"><g data-mml-node="mo"><path data-c="23A7" d="M733 693C746 698 752 707 752 720C752 740 742 750 723 750C720 750 717 749 713 748C632 719 561 671 500 604C431 530 397 454 397 375L397 0L505 0L505 375C505 440 527 504 572 566C617 628 671 670 733 693Z" transform="translate(0,4800)"></path><path data-c="23A9" d="M723 0C742 0 752 10 752 30C752 43 746 52 733 57C671 80 617 122 572 184C527 246 505 310 505 375L505 750L397 750L397 375C397 296 431 220 500 146C561 79 632 31 713 2C717 1 720 0 723 0Z" transform="translate(0,-5050)"></path><path data-c="23A8" d="M250 750C368 814 505 959 505 1123L505 1500L397 1500L397 1123C397 1052 376 984 333 917C288 848 234 801 169 778C156 773 150 764 150 750C150 736 156 727 169 722C234 699 288 652 333 583C376 516 397 448 397 377L397 0L505 0L505 377C505 541 368 686 250 750Z" transform="translate(0,-500)"></path><svg width="902" height="3870" y="1000" x="0" viewBox="0 967.5 902 3870"><path data-c="7B" d="M397 0L505 0L505 748L397 748Z" transform="scale(1,7.761)"></path></svg><svg width="902" height="3870" y="-4370" x="0" viewBox="0 967.5 902 3870"><path data-c="7B" d="M397 0L505 0L505 748L397 748Z" transform="scale(1,7.761)"></path></svg></g><g data-mml-node="mtable" transform="translate(902,0)"><g data-mml-node="mtr" transform="translate(0,2700)"><g data-mml-node="mtd"><g data-mml-node="mrow" data-latex="{pmatrix}"><g data-mml-node="mo"><path data-c="28" d="M660-946C675-946 682-939 682-924C682-917 679-911 674-907C606-856 545-777 490-670C393-480 320-209 320 65L320 435C320 560 335 686 364 813C416 1043 523 1293 674 1407C679 1411 682 1417 682 1424C682 1439 675 1446 660 1446C656 1446 652 1444 647 1441C574 1386 505 1304 440 1195C327 1005 226 718 226 435L226 65C226-202 320-477 422-664C490-787 565-880 647-941C652-944 656-946 660-946Z"></path></g><g data-mml-node="mtable" transform="translate(736,0)"><g data-mml-node="mtr" transform="translate(0,700)"><g data-mml-node="mtd"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(1500,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(3000,0)"><g data-mml-node="mi" data-latex="A"><path data-c="1D434" d="M137 3C155 3 217 0 236 0C251 0 258 8 258 23C258 32 252 38 239 39C210 40 196 50 196 69C196 78 205 98 224 128C251 173 270 206 283 228L526 228C526 221 527 207 530 185C537 112 541 72 541 67C541 48 519 39 474 39C455 39 446 31 446 15C446 5 452 0 464 0C488 0 564 3 588 3C608 3 679 0 699 0C714 0 721 8 721 24C721 34 712 39 694 39C666 39 649 41 644 44C639 47 635 56 634 71L574 689C571 708 572 716 551 716C539 716 529 710 522 697L178 120C148 70 108 43 59 39C43 38 35 30 35 15C35 5 41 0 52 0C68 0 121 3 137 3M492 577L522 267L307 267Z"></path></g></g><g data-mml-node="mtd" transform="translate(4750,0)"><g data-mml-node="mi" data-latex="B"><path data-c="1D435" d="M756 543C756 634 666 683 568 683L236 683C213 683 203 682 203 659C203 643 223 644 235 644C265 643 283 641 288 640C293 639 295 636 295 631C295 629 294 623 291 613L159 82C154 60 144 47 129 42C122 40 104 39 73 39C52 39 42 31 42 15C42 5 52 0 73 0L426 0C491 0 551 20 608 59C671 102 703 155 703 217C703 296 638 344 567 358C655 379 756 446 756 543M554 644C623 644 658 612 658 547C658 496 638 454 596 420C554 386 507 370 456 370L317 370L377 610C385 644 385 644 427 644M582 299C596 276 603 253 603 228C603 176 583 131 542 94C501 57 455 39 402 39L267 39C257 39 250 39 246 40C240 40 237 42 237 45C237 46 237 49 238 53C269 180 293 276 309 340L493 340C536 340 565 326 582 299Z"></path></g></g></g><g data-mml-node="mtr" transform="translate(0,-700)"><g data-mml-node="mtd"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(1500,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(3125,0)"><g data-mml-node="mn" data-latex="1"><path data-c="31" d="M269 666C228 624 168 603 89 603L89 564C141 564 184 572 217 588L217 82C217 64 213 52 204 47C195 42 170 39 130 39L95 39L95 0C120 2 174 3 257 3C340 3 394 2 419 0L419 39L384 39C343 39 318 42 310 47C302 52 297 64 297 82L297 636C297 660 295 666 269 666Z"></path></g></g><g data-mml-node="mtd" transform="translate(4879.5,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g></g></g><g data-mml-node="mo" transform="translate(6245,0)"><path data-c="29" d="M89-941C162-886 231-804 296-695C409-506 510-218 510 65L510 435C510 702 416 977 314 1164C246 1287 171 1380 89 1441C84 1444 80 1446 76 1446C61 1446 54 1439 54 1424C54 1417 57 1411 62 1407C130 1356 191 1277 246 1170C343 980 416 709 416 435L416 65C416-60 401-186 372-313C320-543 213-793 62-907C57-911 54-917 54-924C54-939 61-946 76-946C80-946 84-944 89-941Z"></path></g></g><g data-mml-node="mrow" data-latex="{pmatrix}" transform="translate(7147.7,0)"><g data-mml-node="mo"><path data-c="239B" d="M813 1450C820 1455 823 1462 823 1470C823 1487 815 1495 798 1495C793 1495 788 1493 784 1490C697 1423 614 1324 536 1192C399 956 277 603 277 253L277 0L385 0L385 253C385 407 403 562 438 719C500 999 630 1313 813 1450Z" transform="translate(0,1355)"></path><path data-c="239D" d="M798 0C815 0 823 8 823 25C823 34 819 40 812 44C731 106 658 202 592 334C474 569 385 903 385 1242L385 1495L277 1495L277 1242C277 914 388 575 512 345C594 193 685 80 784 5C788 2 793 0 798 0Z" transform="translate(0,-2350)"></path><svg width="875" height="2350" y="-925" x="0" viewBox="0 587.5 875 2350"><path data-c="239C" d="M277 0L385 0L385 498L277 498Z" transform="scale(1,7.078)"></path></svg></g><g data-mml-node="mtable" transform="translate(875,0)"><g data-mml-node="mtr" transform="translate(0,2100)"><g data-mml-node="mtd" transform="translate(1111,0)"><g data-mml-node="mi" data-latex="x"><path data-c="1D465" d="M527 373C527 419 482 442 432 442C389 442 355 419 329 373C308 419 273 442 222 442C173 442 133 419 101 374C74 335 60 306 60 287C60 278 65 273 75 273C84 273 90 278 92 287C111 345 153 413 220 413C253 413 269 392 269 351C269 330 251 252 216 118C199 51 169 18 126 18C112 18 99 21 88 26C114 36 127 54 127 80C127 106 114 119 87 119C54 119 29 91 29 58C29 12 76-11 125-11C167-11 201 12 228 58C247 12 283-11 335-11C383-11 423 12 455 57C482 96 496 125 496 144C496 153 491 158 481 158C472 158 467 153 464 144C447 87 402 18 337 18C304 18 287 38 287 79C287 92 292 120 303 165L337 300C356 375 387 413 431 413C445 413 458 410 469 405C442 396 429 378 429 351C429 325 443 312 470 312C502 312 527 341 527 373Z"></path></g></g></g><g data-mml-node="mtr" transform="translate(0,700)"><g data-mml-node="mtd" transform="translate(1152,0)"><g data-mml-node="mi" data-latex="y"><path data-c="1D466" d="M163 442C118 442 83 417 58 367C39 328 29 301 29 286C29 277 34 272 45 272C59 272 60 278 64 293C87 372 119 412 160 412C173 412 180 403 180 385C180 369 175 346 164 317C126 214 107 145 107 108C107 32 154-13 231-13C264-13 295-1 323 23C288-109 233-175 158-175C124-175 101-164 89-142C129-140 149-121 149-85C149-60 136-47 109-47C72-47 50-78 50-115C50-170 100-205 158-205C273-205 367-99 392-1L486 377C489 388 490 396 490 401C490 421 479 431 458 431C442 431 429 423 420 408C414 387 409 369 406 354L342 97C332 61 279 16 234 16C196 16 177 41 177 92C177 134 194 198 227 284C240 319 247 343 247 357C247 406 212 442 163 442Z"></path></g></g></g><g data-mml-node="mtr" transform="translate(0,-700)"><g data-mml-node="mtd"><g data-mml-node="mi" data-latex="z"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="mi" data-latex="N" transform="translate(467,0)"><path data-c="1D441" d="M864 683C845 683 783 680 764 680C745 680 682 683 663 683C648 683 641 675 641 659C641 650 648 645 663 644C705 644 726 631 726 605C726 599 725 592 724 585L616 157L401 662C393 681 391 683 366 683L233 683C209 683 200 681 200 659C200 649 211 644 232 644C274 644 295 643 296 640L163 110C154 71 131 49 95 42C69 39 39 43 39 15C39 5 45 0 56 0C74 0 136 3 155 3C174 3 238 0 257 0C272 0 279 8 279 24C279 33 271 38 255 39C214 40 194 53 194 78C194 83 195 90 197 100L326 611L576 21C582 7 590 0 599 0C608 0 614 8 618 24L757 574C770 625 798 643 860 644C874 645 881 653 881 669C878 678 877 683 864 683Z"></path></g><g data-mml-node="mi" data-latex="e" transform="translate(1348,0)"><path data-c="1D452" d="M124 129C124 153 129 186 139 227L188 227C253 227 303 235 339 250C372 264 394 284 405 309C412 326 415 342 415 355C415 410 363 442 307 442C268 442 229 432 190 412C113 372 46 281 46 171C46 69 105-11 204-11C257-11 304 2 345 27C379 48 404 69 420 90C427 99 430 106 430 109C430 120 425 126 414 126C409 126 404 122 398 114C365 70 324 42 277 30C246 22 223 18 206 18C149 18 124 72 124 129M375 355C375 289 311 256 182 256L147 256C166 322 194 366 232 387C262 404 287 413 307 413C343 413 375 391 375 355Z"></path></g><g data-mml-node="mi" data-latex="a" transform="translate(1814,0)"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(2343,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g></g></g><g data-mml-node="mtr" transform="translate(0,-2100)"><g data-mml-node="mtd" transform="translate(1147,0)"><g data-mml-node="mn" data-latex="1"><path data-c="31" d="M269 666C228 624 168 603 89 603L89 564C141 564 184 572 217 588L217 82C217 64 213 52 204 47C195 42 170 39 130 39L95 39L95 0C120 2 174 3 257 3C340 3 394 2 419 0L419 39L384 39C343 39 318 42 310 47C302 52 297 64 297 82L297 636C297 660 295 666 269 666Z"></path></g></g></g></g><g data-mml-node="mo" transform="translate(3669,0)"><path data-c="239E" d="M490 0L598 0L598 253C598 581 487 920 363 1150C281 1301 190 1415 91 1490C87 1493 82 1495 77 1495C60 1495 52 1487 52 1470C52 1462 55 1455 62 1450C143 1389 216 1292 283 1160C402 924 490 593 490 253Z" transform="translate(0,1355)"></path><path data-c="23A0" d="M598 1242L598 1495L490 1495L490 1242C490 1088 472 933 437 776C375 494 246 184 63 44C56 40 52 34 52 25C52 8 60 0 77 0C82 0 87 2 91 5C178 71 261 170 339 303C477 539 598 892 598 1242Z" transform="translate(0,-2350)"></path><svg width="875" height="2350" y="-925" x="0" viewBox="0 587.5 875 2350"><path data-c="239F" d="M490 0L598 0L598 498L490 498Z" transform="scale(1,7.078)"></path></svg></g></g><g data-mml-node="mo" data-latex="=" transform="translate(11969.4,0)"><path data-c="3D" d="M698 367L80 367C64 367 56 359 56 344C56 329 64 321 80 321L698 321C714 321 722 329 722 344C722 356 711 367 698 367M698 179L80 179C64 179 56 171 56 156C56 141 64 133 80 133L698 133C714 133 722 141 722 156C722 169 711 179 698 179Z"></path></g><g data-mml-node="mrow" data-latex="{pmatrix}" transform="translate(13025.2,0)"><g data-mml-node="mo"><path data-c="28" d="M660-946C675-946 682-939 682-924C682-917 679-911 674-907C606-856 545-777 490-670C393-480 320-209 320 65L320 435C320 560 335 686 364 813C416 1043 523 1293 674 1407C679 1411 682 1417 682 1424C682 1439 675 1446 660 1446C656 1446 652 1444 647 1441C574 1386 505 1304 440 1195C327 1005 226 718 226 435L226 65C226-202 320-477 422-664C490-787 565-880 647-941C652-944 656-946 660-946Z"></path></g><g data-mml-node="mtable" transform="translate(736,0)"><g data-mml-node="mtr" transform="translate(0,658)"><g data-mml-node="mtd"><g data-mml-node="mi" data-latex="z"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="mi" data-latex="N" transform="translate(467,0)"><path data-c="1D441" d="M864 683C845 683 783 680 764 680C745 680 682 683 663 683C648 683 641 675 641 659C641 650 648 645 663 644C705 644 726 631 726 605C726 599 725 592 724 585L616 157L401 662C393 681 391 683 366 683L233 683C209 683 200 681 200 659C200 649 211 644 232 644C274 644 295 643 296 640L163 110C154 71 131 49 95 42C69 39 39 43 39 15C39 5 45 0 56 0C74 0 136 3 155 3C174 3 238 0 257 0C272 0 279 8 279 24C279 33 271 38 255 39C214 40 194 53 194 78C194 83 195 90 197 100L326 611L576 21C582 7 590 0 599 0C608 0 614 8 618 24L757 574C770 625 798 643 860 644C874 645 881 653 881 669C878 678 877 683 864 683Z"></path></g><g data-mml-node="mi" data-latex="e" transform="translate(1348,0)"><path data-c="1D452" d="M124 129C124 153 129 186 139 227L188 227C253 227 303 235 339 250C372 264 394 284 405 309C412 326 415 342 415 355C415 410 363 442 307 442C268 442 229 432 190 412C113 372 46 281 46 171C46 69 105-11 204-11C257-11 304 2 345 27C379 48 404 69 420 90C427 99 430 106 430 109C430 120 425 126 414 126C409 126 404 122 398 114C365 70 324 42 277 30C246 22 223 18 206 18C149 18 124 72 124 129M375 355C375 289 311 256 182 256L147 256C166 322 194 366 232 387C262 404 287 413 307 413C343 413 375 391 375 355Z"></path></g><g data-mml-node="mi" data-latex="a" transform="translate(1814,0)"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g><g data-mml-node="msup" data-latex="r^{2}" transform="translate(2343,0)"><g data-mml-node="mi" data-latex="r"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g><g data-mml-node="TeXAtom" transform="translate(484,363) scale(0.707)" data-latex="{2}" data-mjx-texclass="ORD"><g data-mml-node="mn" data-latex="2"><path data-c="32" d="M237 666C186 666 143 648 106 612C69 576 50 534 50 483C50 449 75 424 106 424C136 424 161 450 161 480C161 513 137 536 105 536C102 536 100 536 98 535C117 584 161 627 224 627C306 627 352 556 352 470C352 403 318 331 250 255L62 43C49 28 50 29 50 0L421 0L450 180L417 180C409 129 402 100 396 91C391 86 361 84 306 84L139 84L236 179C304 243 390 312 419 365C439 400 449 435 449 470C449 588 357 666 237 666Z"></path></g></g></g></g></g><g data-mml-node="mtr" transform="translate(0,-742)"><g data-mml-node="mtd" transform="translate(218.3,0)"><g data-mml-node="mi" data-latex="z"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="mi" data-latex="N" transform="translate(467,0)"><path data-c="1D441" d="M864 683C845 683 783 680 764 680C745 680 682 683 663 683C648 683 641 675 641 659C641 650 648 645 663 644C705 644 726 631 726 605C726 599 725 592 724 585L616 157L401 662C393 681 391 683 366 683L233 683C209 683 200 681 200 659C200 649 211 644 232 644C274 644 295 643 296 640L163 110C154 71 131 49 95 42C69 39 39 43 39 15C39 5 45 0 56 0C74 0 136 3 155 3C174 3 238 0 257 0C272 0 279 8 279 24C279 33 271 38 255 39C214 40 194 53 194 78C194 83 195 90 197 100L326 611L576 21C582 7 590 0 599 0C608 0 614 8 618 24L757 574C770 625 798 643 860 644C874 645 881 653 881 669C878 678 877 683 864 683Z"></path></g><g data-mml-node="mi" data-latex="e" transform="translate(1348,0)"><path data-c="1D452" d="M124 129C124 153 129 186 139 227L188 227C253 227 303 235 339 250C372 264 394 284 405 309C412 326 415 342 415 355C415 410 363 442 307 442C268 442 229 432 190 412C113 372 46 281 46 171C46 69 105-11 204-11C257-11 304 2 345 27C379 48 404 69 420 90C427 99 430 106 430 109C430 120 425 126 414 126C409 126 404 122 398 114C365 70 324 42 277 30C246 22 223 18 206 18C149 18 124 72 124 129M375 355C375 289 311 256 182 256L147 256C166 322 194 366 232 387C262 404 287 413 307 413C343 413 375 391 375 355Z"></path></g><g data-mml-node="mi" data-latex="a" transform="translate(1814,0)"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(2343,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g></g></g></g><g data-mml-node="mo" transform="translate(3966.6,0)"><path data-c="29" d="M89-941C162-886 231-804 296-695C409-506 510-218 510 65L510 435C510 702 416 977 314 1164C246 1287 171 1380 89 1441C84 1444 80 1446 76 1446C61 1446 54 1439 54 1424C54 1417 57 1411 62 1407C130 1356 191 1277 246 1170C343 980 416 709 416 435L416 65C416-60 401-186 372-313C320-543 213-793 62-907C57-911 54-917 54-924C54-939 61-946 76-946C80-946 84-944 89-941Z"></path></g></g></g></g><g data-mml-node="mtr" transform="translate(0,-2700)"><g data-mml-node="mtd"><g data-mml-node="mrow" data-latex="{pmatrix}"><g data-mml-node="mo"><path data-c="28" d="M660-946C675-946 682-939 682-924C682-917 679-911 674-907C606-856 545-777 490-670C393-480 320-209 320 65L320 435C320 560 335 686 364 813C416 1043 523 1293 674 1407C679 1411 682 1417 682 1424C682 1439 675 1446 660 1446C656 1446 652 1444 647 1441C574 1386 505 1304 440 1195C327 1005 226 718 226 435L226 65C226-202 320-477 422-664C490-787 565-880 647-941C652-944 656-946 660-946Z"></path></g><g data-mml-node="mtable" transform="translate(736,0)"><g data-mml-node="mtr" transform="translate(0,700)"><g data-mml-node="mtd"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(1500,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(3000,0)"><g data-mml-node="mi" data-latex="A"><path data-c="1D434" d="M137 3C155 3 217 0 236 0C251 0 258 8 258 23C258 32 252 38 239 39C210 40 196 50 196 69C196 78 205 98 224 128C251 173 270 206 283 228L526 228C526 221 527 207 530 185C537 112 541 72 541 67C541 48 519 39 474 39C455 39 446 31 446 15C446 5 452 0 464 0C488 0 564 3 588 3C608 3 679 0 699 0C714 0 721 8 721 24C721 34 712 39 694 39C666 39 649 41 644 44C639 47 635 56 634 71L574 689C571 708 572 716 551 716C539 716 529 710 522 697L178 120C148 70 108 43 59 39C43 38 35 30 35 15C35 5 41 0 52 0C68 0 121 3 137 3M492 577L522 267L307 267Z"></path></g></g><g data-mml-node="mtd" transform="translate(4750,0)"><g data-mml-node="mi" data-latex="B"><path data-c="1D435" d="M756 543C756 634 666 683 568 683L236 683C213 683 203 682 203 659C203 643 223 644 235 644C265 643 283 641 288 640C293 639 295 636 295 631C295 629 294 623 291 613L159 82C154 60 144 47 129 42C122 40 104 39 73 39C52 39 42 31 42 15C42 5 52 0 73 0L426 0C491 0 551 20 608 59C671 102 703 155 703 217C703 296 638 344 567 358C655 379 756 446 756 543M554 644C623 644 658 612 658 547C658 496 638 454 596 420C554 386 507 370 456 370L317 370L377 610C385 644 385 644 427 644M582 299C596 276 603 253 603 228C603 176 583 131 542 94C501 57 455 39 402 39L267 39C257 39 250 39 246 40C240 40 237 42 237 45C237 46 237 49 238 53C269 180 293 276 309 340L493 340C536 340 565 326 582 299Z"></path></g></g></g><g data-mml-node="mtr" transform="translate(0,-700)"><g data-mml-node="mtd"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(1500,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(3125,0)"><g data-mml-node="mn" data-latex="1"><path data-c="31" d="M269 666C228 624 168 603 89 603L89 564C141 564 184 572 217 588L217 82C217 64 213 52 204 47C195 42 170 39 130 39L95 39L95 0C120 2 174 3 257 3C340 3 394 2 419 0L419 39L384 39C343 39 318 42 310 47C302 52 297 64 297 82L297 636C297 660 295 666 269 666Z"></path></g></g><g data-mml-node="mtd" transform="translate(4879.5,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g></g></g><g data-mml-node="mo" transform="translate(6245,0)"><path data-c="29" d="M89-941C162-886 231-804 296-695C409-506 510-218 510 65L510 435C510 702 416 977 314 1164C246 1287 171 1380 89 1441C84 1444 80 1446 76 1446C61 1446 54 1439 54 1424C54 1417 57 1411 62 1407C130 1356 191 1277 246 1170C343 980 416 709 416 435L416 65C416-60 401-186 372-313C320-543 213-793 62-907C57-911 54-917 54-924C54-939 61-946 76-946C80-946 84-944 89-941Z"></path></g></g><g data-mml-node="mrow" data-latex="{pmatrix}" transform="translate(7147.7,0)"><g data-mml-node="mo"><path data-c="239B" d="M813 1450C820 1455 823 1462 823 1470C823 1487 815 1495 798 1495C793 1495 788 1493 784 1490C697 1423 614 1324 536 1192C399 956 277 603 277 253L277 0L385 0L385 253C385 407 403 562 438 719C500 999 630 1313 813 1450Z" transform="translate(0,1355)"></path><path data-c="239D" d="M798 0C815 0 823 8 823 25C823 34 819 40 812 44C731 106 658 202 592 334C474 569 385 903 385 1242L385 1495L277 1495L277 1242C277 914 388 575 512 345C594 193 685 80 784 5C788 2 793 0 798 0Z" transform="translate(0,-2350)"></path><svg width="875" height="2350" y="-925" x="0" viewBox="0 587.5 875 2350"><path data-c="239C" d="M277 0L385 0L385 498L277 498Z" transform="scale(1,7.078)"></path></svg></g><g data-mml-node="mtable" transform="translate(875,0)"><g data-mml-node="mtr" transform="translate(0,2100)"><g data-mml-node="mtd" transform="translate(813,0)"><g data-mml-node="mi" data-latex="x"><path data-c="1D465" d="M527 373C527 419 482 442 432 442C389 442 355 419 329 373C308 419 273 442 222 442C173 442 133 419 101 374C74 335 60 306 60 287C60 278 65 273 75 273C84 273 90 278 92 287C111 345 153 413 220 413C253 413 269 392 269 351C269 330 251 252 216 118C199 51 169 18 126 18C112 18 99 21 88 26C114 36 127 54 127 80C127 106 114 119 87 119C54 119 29 91 29 58C29 12 76-11 125-11C167-11 201 12 228 58C247 12 283-11 335-11C383-11 423 12 455 57C482 96 496 125 496 144C496 153 491 158 481 158C472 158 467 153 464 144C447 87 402 18 337 18C304 18 287 38 287 79C287 92 292 120 303 165L337 300C356 375 387 413 431 413C445 413 458 410 469 405C442 396 429 378 429 351C429 325 443 312 470 312C502 312 527 341 527 373Z"></path></g></g></g><g data-mml-node="mtr" transform="translate(0,700)"><g data-mml-node="mtd" transform="translate(854,0)"><g data-mml-node="mi" data-latex="y"><path data-c="1D466" d="M163 442C118 442 83 417 58 367C39 328 29 301 29 286C29 277 34 272 45 272C59 272 60 278 64 293C87 372 119 412 160 412C173 412 180 403 180 385C180 369 175 346 164 317C126 214 107 145 107 108C107 32 154-13 231-13C264-13 295-1 323 23C288-109 233-175 158-175C124-175 101-164 89-142C129-140 149-121 149-85C149-60 136-47 109-47C72-47 50-78 50-115C50-170 100-205 158-205C273-205 367-99 392-1L486 377C489 388 490 396 490 401C490 421 479 431 458 431C442 431 429 423 420 408C414 387 409 369 406 354L342 97C332 61 279 16 234 16C196 16 177 41 177 92C177 134 194 198 227 284C240 319 247 343 247 357C247 406 212 442 163 442Z"></path></g></g></g><g data-mml-node="mtr" transform="translate(0,-700)"><g data-mml-node="mtd"><g data-mml-node="mi" data-latex="z"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="mi" data-latex="F" transform="translate(467,0)"><path data-c="1D439" d="M199 656C199 646 210 641 231 641C271 641 291 637 291 628C291 625 289 618 286 605L156 82C150 60 140 47 126 42C119 40 101 39 70 39C48 39 38 37 38 16C38 5 44 0 57 0L187 3L335 0C351 0 359 8 359 23C359 40 348 39 322 39C278 39 253 41 247 46C244 47 243 51 243 56L307 321L400 321C446 321 478 319 478 281C478 268 476 252 471 233C470 230 469 226 468 222C468 211 473 206 484 206C489 207 496 214 503 229L557 444C559 452 560 458 560 461C557 470 551 475 544 475C536 475 530 467 526 452C516 414 502 390 486 378C470 366 442 360 402 360L317 360L379 606C387 640 387 641 429 641L559 641C656 641 700 626 700 537C700 517 699 499 697 484C696 473 695 467 695 466C695 455 700 450 710 450C720 450 726 459 728 478L748 649C751 677 744 680 717 680L233 680C210 680 199 679 199 656Z"></path></g><g data-mml-node="mi" data-latex="a" transform="translate(1218,0)"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(1747,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g></g></g><g data-mml-node="mtr" transform="translate(0,-2100)"><g data-mml-node="mtd" transform="translate(849,0)"><g data-mml-node="mn" data-latex="1"><path data-c="31" d="M269 666C228 624 168 603 89 603L89 564C141 564 184 572 217 588L217 82C217 64 213 52 204 47C195 42 170 39 130 39L95 39L95 0C120 2 174 3 257 3C340 3 394 2 419 0L419 39L384 39C343 39 318 42 310 47C302 52 297 64 297 82L297 636C297 660 295 666 269 666Z"></path></g></g></g></g><g data-mml-node="mo" transform="translate(3073,0)"><path data-c="239E" d="M490 0L598 0L598 253C598 581 487 920 363 1150C281 1301 190 1415 91 1490C87 1493 82 1495 77 1495C60 1495 52 1487 52 1470C52 1462 55 1455 62 1450C143 1389 216 1292 283 1160C402 924 490 593 490 253Z" transform="translate(0,1355)"></path><path data-c="23A0" d="M598 1242L598 1495L490 1495L490 1242C490 1088 472 933 437 776C375 494 246 184 63 44C56 40 52 34 52 25C52 8 60 0 77 0C82 0 87 2 91 5C178 71 261 170 339 303C477 539 598 892 598 1242Z" transform="translate(0,-2350)"></path><svg width="875" height="2350" y="-925" x="0" viewBox="0 587.5 875 2350"><path data-c="239F" d="M490 0L598 0L598 498L490 498Z" transform="scale(1,7.078)"></path></svg></g></g><g data-mml-node="mo" data-latex="=" transform="translate(11373.4,0)"><path data-c="3D" d="M698 367L80 367C64 367 56 359 56 344C56 329 64 321 80 321L698 321C714 321 722 329 722 344C722 356 711 367 698 367M698 179L80 179C64 179 56 171 56 156C56 141 64 133 80 133L698 133C714 133 722 141 722 156C722 169 711 179 698 179Z"></path></g><g data-mml-node="mrow" data-latex="{pmatrix}" transform="translate(12429.2,0)"><g data-mml-node="mo"><path data-c="28" d="M660-946C675-946 682-939 682-924C682-917 679-911 674-907C606-856 545-777 490-670C393-480 320-209 320 65L320 435C320 560 335 686 364 813C416 1043 523 1293 674 1407C679 1411 682 1417 682 1424C682 1439 675 1446 660 1446C656 1446 652 1444 647 1441C574 1386 505 1304 440 1195C327 1005 226 718 226 435L226 65C226-202 320-477 422-664C490-787 565-880 647-941C652-944 656-946 660-946Z"></path></g><g data-mml-node="mtable" transform="translate(736,0)"><g data-mml-node="mtr" transform="translate(0,658)"><g data-mml-node="mtd"><g data-mml-node="mi" data-latex="z"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="mi" data-latex="F" transform="translate(467,0)"><path data-c="1D439" d="M199 656C199 646 210 641 231 641C271 641 291 637 291 628C291 625 289 618 286 605L156 82C150 60 140 47 126 42C119 40 101 39 70 39C48 39 38 37 38 16C38 5 44 0 57 0L187 3L335 0C351 0 359 8 359 23C359 40 348 39 322 39C278 39 253 41 247 46C244 47 243 51 243 56L307 321L400 321C446 321 478 319 478 281C478 268 476 252 471 233C470 230 469 226 468 222C468 211 473 206 484 206C489 207 496 214 503 229L557 444C559 452 560 458 560 461C557 470 551 475 544 475C536 475 530 467 526 452C516 414 502 390 486 378C470 366 442 360 402 360L317 360L379 606C387 640 387 641 429 641L559 641C656 641 700 626 700 537C700 517 699 499 697 484C696 473 695 467 695 466C695 455 700 450 710 450C720 450 726 459 728 478L748 649C751 677 744 680 717 680L233 680C210 680 199 679 199 656Z"></path></g><g data-mml-node="mi" data-latex="a" transform="translate(1218,0)"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g><g data-mml-node="msup" data-latex="r^{2}" transform="translate(1747,0)"><g data-mml-node="mi" data-latex="r"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g><g data-mml-node="TeXAtom" transform="translate(484,363) scale(0.707)" data-latex="{2}" data-mjx-texclass="ORD"><g data-mml-node="mn" data-latex="2"><path data-c="32" d="M237 666C186 666 143 648 106 612C69 576 50 534 50 483C50 449 75 424 106 424C136 424 161 450 161 480C161 513 137 536 105 536C102 536 100 536 98 535C117 584 161 627 224 627C306 627 352 556 352 470C352 403 318 331 250 255L62 43C49 28 50 29 50 0L421 0L450 180L417 180C409 129 402 100 396 91C391 86 361 84 306 84L139 84L236 179C304 243 390 312 419 365C439 400 449 435 449 470C449 588 357 666 237 666Z"></path></g></g></g></g></g><g data-mml-node="mtr" transform="translate(0,-742)"><g data-mml-node="mtd" transform="translate(218.3,0)"><g data-mml-node="mi" data-latex="z"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="mi" data-latex="F" transform="translate(467,0)"><path data-c="1D439" d="M199 656C199 646 210 641 231 641C271 641 291 637 291 628C291 625 289 618 286 605L156 82C150 60 140 47 126 42C119 40 101 39 70 39C48 39 38 37 38 16C38 5 44 0 57 0L187 3L335 0C351 0 359 8 359 23C359 40 348 39 322 39C278 39 253 41 247 46C244 47 243 51 243 56L307 321L400 321C446 321 478 319 478 281C478 268 476 252 471 233C470 230 469 226 468 222C468 211 473 206 484 206C489 207 496 214 503 229L557 444C559 452 560 458 560 461C557 470 551 475 544 475C536 475 530 467 526 452C516 414 502 390 486 378C470 366 442 360 402 360L317 360L379 606C387 640 387 641 429 641L559 641C656 641 700 626 700 537C700 517 699 499 697 484C696 473 695 467 695 466C695 455 700 450 710 450C720 450 726 459 728 478L748 649C751 677 744 680 717 680L233 680C210 680 199 679 199 656Z"></path></g><g data-mml-node="mi" data-latex="a" transform="translate(1218,0)"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(1747,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g></g></g></g><g data-mml-node="mo" transform="translate(3370.6,0)"><path data-c="29" d="M89-941C162-886 231-804 296-695C409-506 510-218 510 65L510 435C510 702 416 977 314 1164C246 1287 171 1380 89 1441C84 1444 80 1446 76 1446C61 1446 54 1439 54 1424C54 1417 57 1411 62 1407C130 1356 191 1277 246 1170C343 980 416 709 416 435L416 65C416-60 401-186 372-313C320-543 213-793 62-907C57-911 54-917 54-924C54-939 61-946 76-946C80-946 84-944 89-941Z"></path></g></g></g></g></g><g data-mml-node="mo" transform="translate(18629.8,0) translate(0 250)"></g></g></g></g></svg></mjx-container></p></li><li><p>得到方程组及其唯一解：</p><p>  <mjx-container class="MathJax" jax="SVG" overflow="overflow" display="true"><svg style="vertical-align: -2.149ex;" xmlns="http://www.w3.org/2000/svg" width="53.535ex" height="5.43ex" role="img" focusable="false" viewBox="0 -1450 23662.6 2400"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="  \begin{cases}  A \cdot zNear + B = zNear^{2} \\  A \cdot zFar + B = zFar^{2}  \end{cases} \implies  \begin{cases}  A = zNear + zFar \\  B = -zNear \cdot zFar  \end{cases}  "><g data-mml-node="mrow" data-latex="{cases}"><g data-mml-node="mo"><path data-c="7B" d="M197 250C300 300 425 413 425 549L425 1147C425 1201 446 1253 489 1303C529 1350 576 1382 629 1399C642 1403 648 1411 648 1424C648 1441 639 1450 622 1450C619 1450 617 1450 615 1449C543 1426 479 1389 423 1338C358 1277 325 1214 325 1147L325 549C325 490 305 434 265 381C225 328 177 292 121 275C108 271 102 263 102 250C102 237 108 229 121 225C177 208 225 172 265 119C305 66 325 10 325-49L325-647C325-714 358-777 423-838C479-889 543-926 615-949C617-950 619-950 622-950C639-950 648-941 648-924C648-911 642-903 629-899C576-882 529-850 489-803C446-753 425-701 425-647L425-49C425 87 300 200 197 250Z"></path></g><g data-mml-node="mtable" transform="translate(750,0)"><g data-mml-node="mtr" transform="translate(0,600)"><g data-mml-node="mtd"><g data-mml-node="mi" data-latex="A"><path data-c="1D434" d="M137 3C155 3 217 0 236 0C251 0 258 8 258 23C258 32 252 38 239 39C210 40 196 50 196 69C196 78 205 98 224 128C251 173 270 206 283 228L526 228C526 221 527 207 530 185C537 112 541 72 541 67C541 48 519 39 474 39C455 39 446 31 446 15C446 5 452 0 464 0C488 0 564 3 588 3C608 3 679 0 699 0C714 0 721 8 721 24C721 34 712 39 694 39C666 39 649 41 644 44C639 47 635 56 634 71L574 689C571 708 572 716 551 716C539 716 529 710 522 697L178 120C148 70 108 43 59 39C43 38 35 30 35 15C35 5 41 0 52 0C68 0 121 3 137 3M492 577L522 267L307 267Z"></path></g><g data-mml-node="mo" data-latex="\cdot" transform="translate(972.2,0)"><path data-c="22C5" d="M192 250C192 279 168 303 139 303C110 303 86 279 86 250C86 221 110 197 139 197C168 197 192 221 192 250Z"></path></g><g data-mml-node="mi" data-latex="z" transform="translate(1472.4,0)"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="mi" data-latex="N" transform="translate(1939.4,0)"><path data-c="1D441" d="M864 683C845 683 783 680 764 680C745 680 682 683 663 683C648 683 641 675 641 659C641 650 648 645 663 644C705 644 726 631 726 605C726 599 725 592 724 585L616 157L401 662C393 681 391 683 366 683L233 683C209 683 200 681 200 659C200 649 211 644 232 644C274 644 295 643 296 640L163 110C154 71 131 49 95 42C69 39 39 43 39 15C39 5 45 0 56 0C74 0 136 3 155 3C174 3 238 0 257 0C272 0 279 8 279 24C279 33 271 38 255 39C214 40 194 53 194 78C194 83 195 90 197 100L326 611L576 21C582 7 590 0 599 0C608 0 614 8 618 24L757 574C770 625 798 643 860 644C874 645 881 653 881 669C878 678 877 683 864 683Z"></path></g><g data-mml-node="mi" data-latex="e" transform="translate(2820.4,0)"><path data-c="1D452" d="M124 129C124 153 129 186 139 227L188 227C253 227 303 235 339 250C372 264 394 284 405 309C412 326 415 342 415 355C415 410 363 442 307 442C268 442 229 432 190 412C113 372 46 281 46 171C46 69 105-11 204-11C257-11 304 2 345 27C379 48 404 69 420 90C427 99 430 106 430 109C430 120 425 126 414 126C409 126 404 122 398 114C365 70 324 42 277 30C246 22 223 18 206 18C149 18 124 72 124 129M375 355C375 289 311 256 182 256L147 256C166 322 194 366 232 387C262 404 287 413 307 413C343 413 375 391 375 355Z"></path></g><g data-mml-node="mi" data-latex="a" transform="translate(3286.4,0)"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(3815.4,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g><g data-mml-node="mo" data-latex="+" transform="translate(4488.7,0)"><path data-c="2B" d="M698 274L413 274L413 559C413 575 405 583 389 583C373 583 365 575 365 559L365 274L80 274C64 274 56 266 56 250C56 234 64 226 80 226L365 226L365-59C365-75 373-83 389-83C405-83 413-75 413-59L413 226L698 226C714 226 722 234 722 250C722 263 711 274 698 274Z"></path></g><g data-mml-node="mi" data-latex="B" transform="translate(5488.9,0)"><path data-c="1D435" d="M756 543C756 634 666 683 568 683L236 683C213 683 203 682 203 659C203 643 223 644 235 644C265 643 283 641 288 640C293 639 295 636 295 631C295 629 294 623 291 613L159 82C154 60 144 47 129 42C122 40 104 39 73 39C52 39 42 31 42 15C42 5 52 0 73 0L426 0C491 0 551 20 608 59C671 102 703 155 703 217C703 296 638 344 567 358C655 379 756 446 756 543M554 644C623 644 658 612 658 547C658 496 638 454 596 420C554 386 507 370 456 370L317 370L377 610C385 644 385 644 427 644M582 299C596 276 603 253 603 228C603 176 583 131 542 94C501 57 455 39 402 39L267 39C257 39 250 39 246 40C240 40 237 42 237 45C237 46 237 49 238 53C269 180 293 276 309 340L493 340C536 340 565 326 582 299Z"></path></g><g data-mml-node="mo" data-latex="=" transform="translate(6525.7,0)"><path data-c="3D" d="M698 367L80 367C64 367 56 359 56 344C56 329 64 321 80 321L698 321C714 321 722 329 722 344C722 356 711 367 698 367M698 179L80 179C64 179 56 171 56 156C56 141 64 133 80 133L698 133C714 133 722 141 722 156C722 169 711 179 698 179Z"></path></g><g data-mml-node="mi" data-latex="z" transform="translate(7581.4,0)"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="mi" data-latex="N" transform="translate(8048.4,0)"><path data-c="1D441" d="M864 683C845 683 783 680 764 680C745 680 682 683 663 683C648 683 641 675 641 659C641 650 648 645 663 644C705 644 726 631 726 605C726 599 725 592 724 585L616 157L401 662C393 681 391 683 366 683L233 683C209 683 200 681 200 659C200 649 211 644 232 644C274 644 295 643 296 640L163 110C154 71 131 49 95 42C69 39 39 43 39 15C39 5 45 0 56 0C74 0 136 3 155 3C174 3 238 0 257 0C272 0 279 8 279 24C279 33 271 38 255 39C214 40 194 53 194 78C194 83 195 90 197 100L326 611L576 21C582 7 590 0 599 0C608 0 614 8 618 24L757 574C770 625 798 643 860 644C874 645 881 653 881 669C878 678 877 683 864 683Z"></path></g><g data-mml-node="mi" data-latex="e" transform="translate(8929.4,0)"><path data-c="1D452" d="M124 129C124 153 129 186 139 227L188 227C253 227 303 235 339 250C372 264 394 284 405 309C412 326 415 342 415 355C415 410 363 442 307 442C268 442 229 432 190 412C113 372 46 281 46 171C46 69 105-11 204-11C257-11 304 2 345 27C379 48 404 69 420 90C427 99 430 106 430 109C430 120 425 126 414 126C409 126 404 122 398 114C365 70 324 42 277 30C246 22 223 18 206 18C149 18 124 72 124 129M375 355C375 289 311 256 182 256L147 256C166 322 194 366 232 387C262 404 287 413 307 413C343 413 375 391 375 355Z"></path></g><g data-mml-node="mi" data-latex="a" transform="translate(9395.4,0)"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g><g data-mml-node="msup" data-latex="r^{2}" transform="translate(9924.4,0)"><g data-mml-node="mi" data-latex="r"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g><g data-mml-node="TeXAtom" transform="translate(484,363) scale(0.707)" data-latex="{2}" data-mjx-texclass="ORD"><g data-mml-node="mn" data-latex="2"><path data-c="32" d="M237 666C186 666 143 648 106 612C69 576 50 534 50 483C50 449 75 424 106 424C136 424 161 450 161 480C161 513 137 536 105 536C102 536 100 536 98 535C117 584 161 627 224 627C306 627 352 556 352 470C352 403 318 331 250 255L62 43C49 28 50 29 50 0L421 0L450 180L417 180C409 129 402 100 396 91C391 86 361 84 306 84L139 84L236 179C304 243 390 312 419 365C439 400 449 435 449 470C449 588 357 666 237 666Z"></path></g></g></g></g></g><g data-mml-node="mtr" transform="translate(0,-683.9)"><g data-mml-node="mtd"><g data-mml-node="mi" data-latex="A"><path data-c="1D434" d="M137 3C155 3 217 0 236 0C251 0 258 8 258 23C258 32 252 38 239 39C210 40 196 50 196 69C196 78 205 98 224 128C251 173 270 206 283 228L526 228C526 221 527 207 530 185C537 112 541 72 541 67C541 48 519 39 474 39C455 39 446 31 446 15C446 5 452 0 464 0C488 0 564 3 588 3C608 3 679 0 699 0C714 0 721 8 721 24C721 34 712 39 694 39C666 39 649 41 644 44C639 47 635 56 634 71L574 689C571 708 572 716 551 716C539 716 529 710 522 697L178 120C148 70 108 43 59 39C43 38 35 30 35 15C35 5 41 0 52 0C68 0 121 3 137 3M492 577L522 267L307 267Z"></path></g><g data-mml-node="mo" data-latex="\cdot" transform="translate(972.2,0)"><path data-c="22C5" d="M192 250C192 279 168 303 139 303C110 303 86 279 86 250C86 221 110 197 139 197C168 197 192 221 192 250Z"></path></g><g data-mml-node="mi" data-latex="z" transform="translate(1472.4,0)"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="mi" data-latex="F" transform="translate(1939.4,0)"><path data-c="1D439" d="M199 656C199 646 210 641 231 641C271 641 291 637 291 628C291 625 289 618 286 605L156 82C150 60 140 47 126 42C119 40 101 39 70 39C48 39 38 37 38 16C38 5 44 0 57 0L187 3L335 0C351 0 359 8 359 23C359 40 348 39 322 39C278 39 253 41 247 46C244 47 243 51 243 56L307 321L400 321C446 321 478 319 478 281C478 268 476 252 471 233C470 230 469 226 468 222C468 211 473 206 484 206C489 207 496 214 503 229L557 444C559 452 560 458 560 461C557 470 551 475 544 475C536 475 530 467 526 452C516 414 502 390 486 378C470 366 442 360 402 360L317 360L379 606C387 640 387 641 429 641L559 641C656 641 700 626 700 537C700 517 699 499 697 484C696 473 695 467 695 466C695 455 700 450 710 450C720 450 726 459 728 478L748 649C751 677 744 680 717 680L233 680C210 680 199 679 199 656Z"></path></g><g data-mml-node="mi" data-latex="a" transform="translate(2690.4,0)"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(3219.4,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g><g data-mml-node="mo" data-latex="+" transform="translate(3892.7,0)"><path data-c="2B" d="M698 274L413 274L413 559C413 575 405 583 389 583C373 583 365 575 365 559L365 274L80 274C64 274 56 266 56 250C56 234 64 226 80 226L365 226L365-59C365-75 373-83 389-83C405-83 413-75 413-59L413 226L698 226C714 226 722 234 722 250C722 263 711 274 698 274Z"></path></g><g data-mml-node="mi" data-latex="B" transform="translate(4892.9,0)"><path data-c="1D435" d="M756 543C756 634 666 683 568 683L236 683C213 683 203 682 203 659C203 643 223 644 235 644C265 643 283 641 288 640C293 639 295 636 295 631C295 629 294 623 291 613L159 82C154 60 144 47 129 42C122 40 104 39 73 39C52 39 42 31 42 15C42 5 52 0 73 0L426 0C491 0 551 20 608 59C671 102 703 155 703 217C703 296 638 344 567 358C655 379 756 446 756 543M554 644C623 644 658 612 658 547C658 496 638 454 596 420C554 386 507 370 456 370L317 370L377 610C385 644 385 644 427 644M582 299C596 276 603 253 603 228C603 176 583 131 542 94C501 57 455 39 402 39L267 39C257 39 250 39 246 40C240 40 237 42 237 45C237 46 237 49 238 53C269 180 293 276 309 340L493 340C536 340 565 326 582 299Z"></path></g><g data-mml-node="mo" data-latex="=" transform="translate(5929.7,0)"><path data-c="3D" d="M698 367L80 367C64 367 56 359 56 344C56 329 64 321 80 321L698 321C714 321 722 329 722 344C722 356 711 367 698 367M698 179L80 179C64 179 56 171 56 156C56 141 64 133 80 133L698 133C714 133 722 141 722 156C722 169 711 179 698 179Z"></path></g><g data-mml-node="mi" data-latex="z" transform="translate(6985.4,0)"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="mi" data-latex="F" transform="translate(7452.4,0)"><path data-c="1D439" d="M199 656C199 646 210 641 231 641C271 641 291 637 291 628C291 625 289 618 286 605L156 82C150 60 140 47 126 42C119 40 101 39 70 39C48 39 38 37 38 16C38 5 44 0 57 0L187 3L335 0C351 0 359 8 359 23C359 40 348 39 322 39C278 39 253 41 247 46C244 47 243 51 243 56L307 321L400 321C446 321 478 319 478 281C478 268 476 252 471 233C470 230 469 226 468 222C468 211 473 206 484 206C489 207 496 214 503 229L557 444C559 452 560 458 560 461C557 470 551 475 544 475C536 475 530 467 526 452C516 414 502 390 486 378C470 366 442 360 402 360L317 360L379 606C387 640 387 641 429 641L559 641C656 641 700 626 700 537C700 517 699 499 697 484C696 473 695 467 695 466C695 455 700 450 710 450C720 450 726 459 728 478L748 649C751 677 744 680 717 680L233 680C210 680 199 679 199 656Z"></path></g><g data-mml-node="mi" data-latex="a" transform="translate(8203.4,0)"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g><g data-mml-node="msup" data-latex="r^{2}" transform="translate(8732.4,0)"><g data-mml-node="mi" data-latex="r"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g><g data-mml-node="TeXAtom" transform="translate(484,363) scale(0.707)" data-latex="{2}" data-mjx-texclass="ORD"><g data-mml-node="mn" data-latex="2"><path data-c="32" d="M237 666C186 666 143 648 106 612C69 576 50 534 50 483C50 449 75 424 106 424C136 424 161 450 161 480C161 513 137 536 105 536C102 536 100 536 98 535C117 584 161 627 224 627C306 627 352 556 352 470C352 403 318 331 250 255L62 43C49 28 50 29 50 0L421 0L450 180L417 180C409 129 402 100 396 91C391 86 361 84 306 84L139 84L236 179C304 243 390 312 419 365C439 400 449 435 449 470C449 588 357 666 237 666Z"></path></g></g></g></g></g></g><g data-mml-node="mo" transform="translate(11562,0) translate(0 250)"></g></g><g data-mml-node="mspace" data-latex="\;" transform="translate(11682,0)"></g><g data-mml-node="mo" data-latex="\Longrightarrow" transform="translate(12237.8,0)"><path data-c="27F9" d="M1389 233C1397 237 1401 243 1401 250C1401 257 1397 263 1389 267C1327 283 1265 318 1204 371C1159 410 1124 455 1097 507C1093 516 1086 520 1076 520C1060 520 1052 512 1052 496C1052 494 1053 491 1054 486C1077 442 1105 403 1137 369L80 369C64 369 56 361 56 346C56 330 64 322 80 322L1189 322C1227 292 1268 268 1311 250C1268 232 1227 208 1189 178L80 178C64 178 56 170 56 154C56 139 64 131 80 131L1137 131C1105 97 1077 58 1054 14C1053 9 1052 6 1052 4C1052-12 1060-20 1076-20C1086-20 1093-16 1097-7C1124 45 1159 90 1204 129C1265 182 1327 217 1389 233Z"></path></g><g data-mml-node="mspace" data-latex="\;" transform="translate(13694.8,0)"></g><g data-mml-node="mrow" data-latex="{cases}" transform="translate(14250.6,0)"><g data-mml-node="mo"><path data-c="7B" d="M196 250C291 293 401 389 401 511L401 1035C401 1084 421 1131 460 1174C497 1215 541 1241 590 1253C602 1256 608 1264 608 1276C608 1292 600 1300 584 1300C581 1300 579 1300 578 1299C511 1286 447 1252 387 1195C334 1144 307 1091 307 1035L307 511C307 458 288 408 251 362C214 316 169 286 118 273C106 270 100 262 100 250C100 238 106 230 118 227C169 214 214 184 251 138C288 92 307 42 307-11L307-535C307-591 334-644 387-695C447-752 511-786 578-799C579-800 581-800 584-800C600-800 608-792 608-776C608-764 602-756 590-753C541-741 497-715 460-674C421-631 401-584 401-535L401-11C401 111 291 207 196 250Z"></path></g><g data-mml-node="mtable" transform="translate(707,0)"><g data-mml-node="mtr" transform="translate(0,600)"><g data-mml-node="mtd"><g data-mml-node="mi" data-latex="A"><path data-c="1D434" d="M137 3C155 3 217 0 236 0C251 0 258 8 258 23C258 32 252 38 239 39C210 40 196 50 196 69C196 78 205 98 224 128C251 173 270 206 283 228L526 228C526 221 527 207 530 185C537 112 541 72 541 67C541 48 519 39 474 39C455 39 446 31 446 15C446 5 452 0 464 0C488 0 564 3 588 3C608 3 679 0 699 0C714 0 721 8 721 24C721 34 712 39 694 39C666 39 649 41 644 44C639 47 635 56 634 71L574 689C571 708 572 716 551 716C539 716 529 710 522 697L178 120C148 70 108 43 59 39C43 38 35 30 35 15C35 5 41 0 52 0C68 0 121 3 137 3M492 577L522 267L307 267Z"></path></g><g data-mml-node="mo" data-latex="=" transform="translate(1027.8,0)"><path data-c="3D" d="M698 367L80 367C64 367 56 359 56 344C56 329 64 321 80 321L698 321C714 321 722 329 722 344C722 356 711 367 698 367M698 179L80 179C64 179 56 171 56 156C56 141 64 133 80 133L698 133C714 133 722 141 722 156C722 169 711 179 698 179Z"></path></g><g data-mml-node="mi" data-latex="z" transform="translate(2083.6,0)"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="mi" data-latex="N" transform="translate(2550.6,0)"><path data-c="1D441" d="M864 683C845 683 783 680 764 680C745 680 682 683 663 683C648 683 641 675 641 659C641 650 648 645 663 644C705 644 726 631 726 605C726 599 725 592 724 585L616 157L401 662C393 681 391 683 366 683L233 683C209 683 200 681 200 659C200 649 211 644 232 644C274 644 295 643 296 640L163 110C154 71 131 49 95 42C69 39 39 43 39 15C39 5 45 0 56 0C74 0 136 3 155 3C174 3 238 0 257 0C272 0 279 8 279 24C279 33 271 38 255 39C214 40 194 53 194 78C194 83 195 90 197 100L326 611L576 21C582 7 590 0 599 0C608 0 614 8 618 24L757 574C770 625 798 643 860 644C874 645 881 653 881 669C878 678 877 683 864 683Z"></path></g><g data-mml-node="mi" data-latex="e" transform="translate(3431.6,0)"><path data-c="1D452" d="M124 129C124 153 129 186 139 227L188 227C253 227 303 235 339 250C372 264 394 284 405 309C412 326 415 342 415 355C415 410 363 442 307 442C268 442 229 432 190 412C113 372 46 281 46 171C46 69 105-11 204-11C257-11 304 2 345 27C379 48 404 69 420 90C427 99 430 106 430 109C430 120 425 126 414 126C409 126 404 122 398 114C365 70 324 42 277 30C246 22 223 18 206 18C149 18 124 72 124 129M375 355C375 289 311 256 182 256L147 256C166 322 194 366 232 387C262 404 287 413 307 413C343 413 375 391 375 355Z"></path></g><g data-mml-node="mi" data-latex="a" transform="translate(3897.6,0)"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(4426.6,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g><g data-mml-node="mo" data-latex="+" transform="translate(5099.8,0)"><path data-c="2B" d="M698 274L413 274L413 559C413 575 405 583 389 583C373 583 365 575 365 559L365 274L80 274C64 274 56 266 56 250C56 234 64 226 80 226L365 226L365-59C365-75 373-83 389-83C405-83 413-75 413-59L413 226L698 226C714 226 722 234 722 250C722 263 711 274 698 274Z"></path></g><g data-mml-node="mi" data-latex="z" transform="translate(6100,0)"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="mi" data-latex="F" transform="translate(6567,0)"><path data-c="1D439" d="M199 656C199 646 210 641 231 641C271 641 291 637 291 628C291 625 289 618 286 605L156 82C150 60 140 47 126 42C119 40 101 39 70 39C48 39 38 37 38 16C38 5 44 0 57 0L187 3L335 0C351 0 359 8 359 23C359 40 348 39 322 39C278 39 253 41 247 46C244 47 243 51 243 56L307 321L400 321C446 321 478 319 478 281C478 268 476 252 471 233C470 230 469 226 468 222C468 211 473 206 484 206C489 207 496 214 503 229L557 444C559 452 560 458 560 461C557 470 551 475 544 475C536 475 530 467 526 452C516 414 502 390 486 378C470 366 442 360 402 360L317 360L379 606C387 640 387 641 429 641L559 641C656 641 700 626 700 537C700 517 699 499 697 484C696 473 695 467 695 466C695 455 700 450 710 450C720 450 726 459 728 478L748 649C751 677 744 680 717 680L233 680C210 680 199 679 199 656Z"></path></g><g data-mml-node="mi" data-latex="a" transform="translate(7318,0)"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(7847,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g></g></g><g data-mml-node="mtr" transform="translate(0,-600)"><g data-mml-node="mtd"><g data-mml-node="mi" data-latex="B"><path data-c="1D435" d="M756 543C756 634 666 683 568 683L236 683C213 683 203 682 203 659C203 643 223 644 235 644C265 643 283 641 288 640C293 639 295 636 295 631C295 629 294 623 291 613L159 82C154 60 144 47 129 42C122 40 104 39 73 39C52 39 42 31 42 15C42 5 52 0 73 0L426 0C491 0 551 20 608 59C671 102 703 155 703 217C703 296 638 344 567 358C655 379 756 446 756 543M554 644C623 644 658 612 658 547C658 496 638 454 596 420C554 386 507 370 456 370L317 370L377 610C385 644 385 644 427 644M582 299C596 276 603 253 603 228C603 176 583 131 542 94C501 57 455 39 402 39L267 39C257 39 250 39 246 40C240 40 237 42 237 45C237 46 237 49 238 53C269 180 293 276 309 340L493 340C536 340 565 326 582 299Z"></path></g><g data-mml-node="mo" data-latex="=" transform="translate(1036.8,0)"><path data-c="3D" d="M698 367L80 367C64 367 56 359 56 344C56 329 64 321 80 321L698 321C714 321 722 329 722 344C722 356 711 367 698 367M698 179L80 179C64 179 56 171 56 156C56 141 64 133 80 133L698 133C714 133 722 141 722 156C722 169 711 179 698 179Z"></path></g><g data-mml-node="mo" data-latex="-" transform="translate(2092.6,0)"><path data-c="2212" d="M698 270L80 270C64 270 56 263 56 250C56 237 64 230 80 230L698 230C714 230 722 237 722 250C722 262 710 270 698 270Z"></path></g><g data-mml-node="mi" data-latex="z" transform="translate(2870.6,0)"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="mi" data-latex="N" transform="translate(3337.6,0)"><path data-c="1D441" d="M864 683C845 683 783 680 764 680C745 680 682 683 663 683C648 683 641 675 641 659C641 650 648 645 663 644C705 644 726 631 726 605C726 599 725 592 724 585L616 157L401 662C393 681 391 683 366 683L233 683C209 683 200 681 200 659C200 649 211 644 232 644C274 644 295 643 296 640L163 110C154 71 131 49 95 42C69 39 39 43 39 15C39 5 45 0 56 0C74 0 136 3 155 3C174 3 238 0 257 0C272 0 279 8 279 24C279 33 271 38 255 39C214 40 194 53 194 78C194 83 195 90 197 100L326 611L576 21C582 7 590 0 599 0C608 0 614 8 618 24L757 574C770 625 798 643 860 644C874 645 881 653 881 669C878 678 877 683 864 683Z"></path></g><g data-mml-node="mi" data-latex="e" transform="translate(4218.6,0)"><path data-c="1D452" d="M124 129C124 153 129 186 139 227L188 227C253 227 303 235 339 250C372 264 394 284 405 309C412 326 415 342 415 355C415 410 363 442 307 442C268 442 229 432 190 412C113 372 46 281 46 171C46 69 105-11 204-11C257-11 304 2 345 27C379 48 404 69 420 90C427 99 430 106 430 109C430 120 425 126 414 126C409 126 404 122 398 114C365 70 324 42 277 30C246 22 223 18 206 18C149 18 124 72 124 129M375 355C375 289 311 256 182 256L147 256C166 322 194 366 232 387C262 404 287 413 307 413C343 413 375 391 375 355Z"></path></g><g data-mml-node="mi" data-latex="a" transform="translate(4684.6,0)"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(5213.6,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g><g data-mml-node="mo" data-latex="\cdot" transform="translate(5886.8,0)"><path data-c="22C5" d="M192 250C192 279 168 303 139 303C110 303 86 279 86 250C86 221 110 197 139 197C168 197 192 221 192 250Z"></path></g><g data-mml-node="mi" data-latex="z" transform="translate(6387,0)"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="mi" data-latex="F" transform="translate(6854,0)"><path data-c="1D439" d="M199 656C199 646 210 641 231 641C271 641 291 637 291 628C291 625 289 618 286 605L156 82C150 60 140 47 126 42C119 40 101 39 70 39C48 39 38 37 38 16C38 5 44 0 57 0L187 3L335 0C351 0 359 8 359 23C359 40 348 39 322 39C278 39 253 41 247 46C244 47 243 51 243 56L307 321L400 321C446 321 478 319 478 281C478 268 476 252 471 233C470 230 469 226 468 222C468 211 473 206 484 206C489 207 496 214 503 229L557 444C559 452 560 458 560 461C557 470 551 475 544 475C536 475 530 467 526 452C516 414 502 390 486 378C470 366 442 360 402 360L317 360L379 606C387 640 387 641 429 641L559 641C656 641 700 626 700 537C700 517 699 499 697 484C696 473 695 467 695 466C695 455 700 450 710 450C720 450 726 459 728 478L748 649C751 677 744 680 717 680L233 680C210 680 199 679 199 656Z"></path></g><g data-mml-node="mi" data-latex="a" transform="translate(7605,0)"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(8134,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g></g></g></g><g data-mml-node="mo" transform="translate(9292,0) translate(0 250)"></g></g></g></g></svg></mjx-container></p></li><li><p>至此，我们就得到了 <mjx-container class="MathJax" jax="SVG" overflow="overflow"><svg style="vertical-align: -0.65ex;" xmlns="http://www.w3.org/2000/svg" width="12.4ex" height="2.195ex" role="img" focusable="false" viewBox="0 -683 5480.9 970.2"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="M_{persp\_to\_ortho}"><g data-mml-node="msub" data-latex="M_{persp\_to\_ortho}"><g data-mml-node="mi" data-latex="M"><path data-c="1D440" d="M594 16C594 5 600 0 613 0L736 3C759 4 840 0 859 0C874 0 882 8 882 24C882 34 872 39 851 39C810 39 790 43 790 52C790 55 792 62 795 75L927 602C932 623 942 636 955 641C961 643 979 644 1008 644C1033 644 1044 645 1044 668C1044 678 1034 683 1013 683L882 683C853 683 853 681 840 662L484 108L408 657C404 682 402 683 373 683L237 683C215 683 204 682 204 660C204 649 215 644 236 644C256 644 297 647 297 631C297 629 296 623 293 613L167 110C158 72 135 49 100 42C75 39 42 43 42 16C42 5 48 0 60 0C78 0 141 3 159 3C178 3 242 0 261 0C276 0 283 8 283 24C283 33 276 38 261 39C219 39 198 52 198 78C198 82 199 89 202 100L332 621L415 26C418 9 424 0 434 0C442 0 450 7 459 20L848 627L712 82C706 60 696 47 681 42C675 40 656 39 625 39C604 39 594 37 594 16Z"></path></g><g data-mml-node="TeXAtom" transform="translate(1003,-150) scale(0.707)" data-latex="{p e r s p\_t o\_o r t h o}" data-mjx-texclass="ORD"><g data-mml-node="mi" data-latex="p"><path data-c="1D45D" d="M355 442C311 442 269 419 228 373C217 419 186 442 137 442C96 442 66 409 45 344C35 311 30 292 30 286C30 277 35 272 46 272C51 272 54 273 57 275C62 284 65 291 66 298C84 374 107 412 134 412C152 412 161 398 161 371C161 356 159 339 154 321L44-118C35-151 34-155-5-155C-23-155-32-163-32-178C-32-189-26-194-15-194C0-194 52-191 67-191C86-191 146-194 165-194C180-194 187-186 187-170C187-160 178-155 159-155C141-155 114-156 114-144C114-131 155 26 159 43C179 6 209-13 249-13C314-13 371 20 421 87C467 148 490 213 490 280C490 367 438 442 355 442M352 412C391 412 411 382 411 323C411 296 405 260 394 215C371 128 342 71 307 42C286 25 267 16 248 16C219 16 199 29 188 56C179 77 174 92 174 100L225 309C230 331 248 354 276 377C304 400 329 412 352 412Z"></path></g><g data-mml-node="mi" data-latex="e" transform="translate(503,0)"><path data-c="1D452" d="M124 129C124 153 129 186 139 227L188 227C253 227 303 235 339 250C372 264 394 284 405 309C412 326 415 342 415 355C415 410 363 442 307 442C268 442 229 432 190 412C113 372 46 281 46 171C46 69 105-11 204-11C257-11 304 2 345 27C379 48 404 69 420 90C427 99 430 106 430 109C430 120 425 126 414 126C409 126 404 122 398 114C365 70 324 42 277 30C246 22 223 18 206 18C149 18 124 72 124 129M375 355C375 289 311 256 182 256L147 256C166 322 194 366 232 387C262 404 287 413 307 413C343 413 375 391 375 355Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(969,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g><g data-mml-node="mi" data-latex="s" transform="translate(1420,0)"><path data-c="1D460" d="M420 354C420 411 362 442 300 442C237 442 192 423 165 385C142 352 130 322 130 295C130 242 165 208 234 193C263 188 285 181 302 173C323 164 333 147 333 123C333 105 325 85 308 62C287 33 250 18 197 18C143 18 108 33 92 62C124 61 151 87 151 119C151 144 138 157 111 157C75 157 52 124 52 88C52 22 124-11 196-11C271-11 325 11 357 56C384 93 397 126 397 156C397 199 376 231 335 252C304 263 280 270 265 273C230 282 194 285 194 328C194 381 244 413 300 413C342 413 369 400 382 375C360 371 337 352 337 327C337 306 348 295 371 295C402 295 420 323 420 354Z"></path></g><g data-mml-node="mi" data-latex="p" transform="translate(1889,0)"><path data-c="1D45D" d="M355 442C311 442 269 419 228 373C217 419 186 442 137 442C96 442 66 409 45 344C35 311 30 292 30 286C30 277 35 272 46 272C51 272 54 273 57 275C62 284 65 291 66 298C84 374 107 412 134 412C152 412 161 398 161 371C161 356 159 339 154 321L44-118C35-151 34-155-5-155C-23-155-32-163-32-178C-32-189-26-194-15-194C0-194 52-191 67-191C86-191 146-194 165-194C180-194 187-186 187-170C187-160 178-155 159-155C141-155 114-156 114-144C114-131 155 26 159 43C179 6 209-13 249-13C314-13 371 20 421 87C467 148 490 213 490 280C490 367 438 442 355 442M352 412C391 412 411 382 411 323C411 296 405 260 394 215C371 128 342 71 307 42C286 25 267 16 248 16C219 16 199 29 188 56C179 77 174 92 174 100L225 309C230 331 248 354 276 377C304 400 329 412 352 412Z"></path></g><g data-mml-node="mi" data-latex="\_" transform="translate(2392,0)"><path data-c="5F" d="M0-140L333-140L333-100L0-100Z"></path></g><g data-mml-node="mi" data-latex="t" transform="translate(2725,0)"><path data-c="1D461" d="M330 419C330 428 320 433 299 433L218 433C244 537 257 591 257 595C257 616 246 626 225 626C202 626 188 613 182 587L145 433L56 433C34 433 23 432 23 411C23 400 33 395 54 395L135 395C86 200 62 97 62 84C62 28 100-11 156-11C194-11 227 6 256 41C280 70 297 98 308 125C312 136 314 142 314 145C314 154 309 159 299 159C291 159 285 154 281 143C247 60 206 19 157 19C140 19 131 33 131 60C131 75 133 91 137 107L208 395L297 395C323 395 330 397 330 419Z"></path></g><g data-mml-node="mi" data-latex="o" transform="translate(3086,0)"><path data-c="1D45C" d="M308 442C239 442 176 412 122 353C68 294 41 229 41 159C41 63 106-11 202-11C272-11 334 19 388 78C442 137 469 201 469 272C469 369 405 442 308 442M389 310C389 287 384 255 374 213C353 130 319 73 272 42C248 26 225 18 203 18C149 18 121 65 121 122C121 180 155 288 178 324C216 383 259 413 307 413C361 413 389 367 389 310Z"></path></g><g data-mml-node="mi" data-latex="\_" transform="translate(3571,0)"><path data-c="5F" d="M0-140L333-140L333-100L0-100Z"></path></g><g data-mml-node="mi" data-latex="o" transform="translate(3904,0)"><path data-c="1D45C" d="M308 442C239 442 176 412 122 353C68 294 41 229 41 159C41 63 106-11 202-11C272-11 334 19 388 78C442 137 469 201 469 272C469 369 405 442 308 442M389 310C389 287 384 255 374 213C353 130 319 73 272 42C248 26 225 18 203 18C149 18 121 65 121 122C121 180 155 288 178 324C216 383 259 413 307 413C361 413 389 367 389 310Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(4389,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g><g data-mml-node="mi" data-latex="t" transform="translate(4840,0)"><path data-c="1D461" d="M330 419C330 428 320 433 299 433L218 433C244 537 257 591 257 595C257 616 246 626 225 626C202 626 188 613 182 587L145 433L56 433C34 433 23 432 23 411C23 400 33 395 54 395L135 395C86 200 62 97 62 84C62 28 100-11 156-11C194-11 227 6 256 41C280 70 297 98 308 125C312 136 314 142 314 145C314 154 309 159 299 159C291 159 285 154 281 143C247 60 206 19 157 19C140 19 131 33 131 60C131 75 133 91 137 107L208 395L297 395C323 395 330 397 330 419Z"></path></g><g data-mml-node="mi" data-latex="h" transform="translate(5201,0)"><path data-c="210E" d="M512 138C489 59 457 19 415 19C402 19 395 28 395 47C395 62 401 85 413 116C453 223 473 296 473 335C473 406 427 445 356 445C303 445 257 423 218 380L291 679C289 688 287 694 274 694C241 694 168 685 155 684C140 682 132 675 132 660C132 650 141 645 159 645C180 645 203 646 205 632L59 43C56 32 55 25 55 21C55 0 66-11 87-11C107-11 121-1 128 18L168 182C180 231 189 268 196 293C199 300 207 314 220 334C256 388 300 415 353 415C386 415 402 393 402 350C402 309 382 236 342 130C333 107 329 89 329 74C329 26 365-11 413-11C457-11 492 14 517 65C536 105 546 132 546 145C546 154 541 159 530 159C527 159 512 150 512 138Z"></path></g><g data-mml-node="mi" data-latex="o" transform="translate(5777,0)"><path data-c="1D45C" d="M308 442C239 442 176 412 122 353C68 294 41 229 41 159C41 63 106-11 202-11C272-11 334 19 388 78C442 137 469 201 469 272C469 369 405 442 308 442M389 310C389 287 384 255 374 213C353 130 319 73 272 42C248 26 225 18 203 18C149 18 121 65 121 122C121 180 155 288 178 324C216 383 259 413 307 413C361 413 389 367 389 310Z"></path></g></g></g></g></g></svg></mjx-container>：</p><p>  <mjx-container class="MathJax" jax="SVG" overflow="overflow" display="true"><svg style="vertical-align: -5.317ex;" xmlns="http://www.w3.org/2000/svg" width="89.158ex" height="11.765ex" role="img" focusable="false" viewBox="0 -2850 39407.8 5200"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="  M_{persp\_to\_ortho} =  \begin{pmatrix}  zNear &amp; 0 &amp; 0 &amp; 0 \\  0 &amp; zNear &amp; 0 &amp; 0 \\  0 &amp; 0 &amp; zNear + zFar &amp; -zNear \cdot zFar \\  0 &amp; 0 &amp; 1 &amp; 0  \end{pmatrix}, (zFar < zNear < 0)  "><g data-mml-node="msub" data-latex="M_{p e r s p\_t o\_o r t h o}"><g data-mml-node="mi" data-latex="M"><path data-c="1D440" d="M594 16C594 5 600 0 613 0L736 3C759 4 840 0 859 0C874 0 882 8 882 24C882 34 872 39 851 39C810 39 790 43 790 52C790 55 792 62 795 75L927 602C932 623 942 636 955 641C961 643 979 644 1008 644C1033 644 1044 645 1044 668C1044 678 1034 683 1013 683L882 683C853 683 853 681 840 662L484 108L408 657C404 682 402 683 373 683L237 683C215 683 204 682 204 660C204 649 215 644 236 644C256 644 297 647 297 631C297 629 296 623 293 613L167 110C158 72 135 49 100 42C75 39 42 43 42 16C42 5 48 0 60 0C78 0 141 3 159 3C178 3 242 0 261 0C276 0 283 8 283 24C283 33 276 38 261 39C219 39 198 52 198 78C198 82 199 89 202 100L332 621L415 26C418 9 424 0 434 0C442 0 450 7 459 20L848 627L712 82C706 60 696 47 681 42C675 40 656 39 625 39C604 39 594 37 594 16Z"></path></g><g data-mml-node="TeXAtom" transform="translate(1003,-150) scale(0.707)" data-latex="{p e r s p\_t o\_o r t h o}" data-mjx-texclass="ORD"><g data-mml-node="mi" data-latex="p"><path data-c="1D45D" d="M355 442C311 442 269 419 228 373C217 419 186 442 137 442C96 442 66 409 45 344C35 311 30 292 30 286C30 277 35 272 46 272C51 272 54 273 57 275C62 284 65 291 66 298C84 374 107 412 134 412C152 412 161 398 161 371C161 356 159 339 154 321L44-118C35-151 34-155-5-155C-23-155-32-163-32-178C-32-189-26-194-15-194C0-194 52-191 67-191C86-191 146-194 165-194C180-194 187-186 187-170C187-160 178-155 159-155C141-155 114-156 114-144C114-131 155 26 159 43C179 6 209-13 249-13C314-13 371 20 421 87C467 148 490 213 490 280C490 367 438 442 355 442M352 412C391 412 411 382 411 323C411 296 405 260 394 215C371 128 342 71 307 42C286 25 267 16 248 16C219 16 199 29 188 56C179 77 174 92 174 100L225 309C230 331 248 354 276 377C304 400 329 412 352 412Z"></path></g><g data-mml-node="mi" data-latex="e" transform="translate(503,0)"><path data-c="1D452" d="M124 129C124 153 129 186 139 227L188 227C253 227 303 235 339 250C372 264 394 284 405 309C412 326 415 342 415 355C415 410 363 442 307 442C268 442 229 432 190 412C113 372 46 281 46 171C46 69 105-11 204-11C257-11 304 2 345 27C379 48 404 69 420 90C427 99 430 106 430 109C430 120 425 126 414 126C409 126 404 122 398 114C365 70 324 42 277 30C246 22 223 18 206 18C149 18 124 72 124 129M375 355C375 289 311 256 182 256L147 256C166 322 194 366 232 387C262 404 287 413 307 413C343 413 375 391 375 355Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(969,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g><g data-mml-node="mi" data-latex="s" transform="translate(1420,0)"><path data-c="1D460" d="M420 354C420 411 362 442 300 442C237 442 192 423 165 385C142 352 130 322 130 295C130 242 165 208 234 193C263 188 285 181 302 173C323 164 333 147 333 123C333 105 325 85 308 62C287 33 250 18 197 18C143 18 108 33 92 62C124 61 151 87 151 119C151 144 138 157 111 157C75 157 52 124 52 88C52 22 124-11 196-11C271-11 325 11 357 56C384 93 397 126 397 156C397 199 376 231 335 252C304 263 280 270 265 273C230 282 194 285 194 328C194 381 244 413 300 413C342 413 369 400 382 375C360 371 337 352 337 327C337 306 348 295 371 295C402 295 420 323 420 354Z"></path></g><g data-mml-node="mi" data-latex="p" transform="translate(1889,0)"><path data-c="1D45D" d="M355 442C311 442 269 419 228 373C217 419 186 442 137 442C96 442 66 409 45 344C35 311 30 292 30 286C30 277 35 272 46 272C51 272 54 273 57 275C62 284 65 291 66 298C84 374 107 412 134 412C152 412 161 398 161 371C161 356 159 339 154 321L44-118C35-151 34-155-5-155C-23-155-32-163-32-178C-32-189-26-194-15-194C0-194 52-191 67-191C86-191 146-194 165-194C180-194 187-186 187-170C187-160 178-155 159-155C141-155 114-156 114-144C114-131 155 26 159 43C179 6 209-13 249-13C314-13 371 20 421 87C467 148 490 213 490 280C490 367 438 442 355 442M352 412C391 412 411 382 411 323C411 296 405 260 394 215C371 128 342 71 307 42C286 25 267 16 248 16C219 16 199 29 188 56C179 77 174 92 174 100L225 309C230 331 248 354 276 377C304 400 329 412 352 412Z"></path></g><g data-mml-node="mi" data-latex="\_" transform="translate(2392,0)"><path data-c="5F" d="M0-140L333-140L333-100L0-100Z"></path></g><g data-mml-node="mi" data-latex="t" transform="translate(2725,0)"><path data-c="1D461" d="M330 419C330 428 320 433 299 433L218 433C244 537 257 591 257 595C257 616 246 626 225 626C202 626 188 613 182 587L145 433L56 433C34 433 23 432 23 411C23 400 33 395 54 395L135 395C86 200 62 97 62 84C62 28 100-11 156-11C194-11 227 6 256 41C280 70 297 98 308 125C312 136 314 142 314 145C314 154 309 159 299 159C291 159 285 154 281 143C247 60 206 19 157 19C140 19 131 33 131 60C131 75 133 91 137 107L208 395L297 395C323 395 330 397 330 419Z"></path></g><g data-mml-node="mi" data-latex="o" transform="translate(3086,0)"><path data-c="1D45C" d="M308 442C239 442 176 412 122 353C68 294 41 229 41 159C41 63 106-11 202-11C272-11 334 19 388 78C442 137 469 201 469 272C469 369 405 442 308 442M389 310C389 287 384 255 374 213C353 130 319 73 272 42C248 26 225 18 203 18C149 18 121 65 121 122C121 180 155 288 178 324C216 383 259 413 307 413C361 413 389 367 389 310Z"></path></g><g data-mml-node="mi" data-latex="\_" transform="translate(3571,0)"><path data-c="5F" d="M0-140L333-140L333-100L0-100Z"></path></g><g data-mml-node="mi" data-latex="o" transform="translate(3904,0)"><path data-c="1D45C" d="M308 442C239 442 176 412 122 353C68 294 41 229 41 159C41 63 106-11 202-11C272-11 334 19 388 78C442 137 469 201 469 272C469 369 405 442 308 442M389 310C389 287 384 255 374 213C353 130 319 73 272 42C248 26 225 18 203 18C149 18 121 65 121 122C121 180 155 288 178 324C216 383 259 413 307 413C361 413 389 367 389 310Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(4389,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g><g data-mml-node="mi" data-latex="t" transform="translate(4840,0)"><path data-c="1D461" d="M330 419C330 428 320 433 299 433L218 433C244 537 257 591 257 595C257 616 246 626 225 626C202 626 188 613 182 587L145 433L56 433C34 433 23 432 23 411C23 400 33 395 54 395L135 395C86 200 62 97 62 84C62 28 100-11 156-11C194-11 227 6 256 41C280 70 297 98 308 125C312 136 314 142 314 145C314 154 309 159 299 159C291 159 285 154 281 143C247 60 206 19 157 19C140 19 131 33 131 60C131 75 133 91 137 107L208 395L297 395C323 395 330 397 330 419Z"></path></g><g data-mml-node="mi" data-latex="h" transform="translate(5201,0)"><path data-c="210E" d="M512 138C489 59 457 19 415 19C402 19 395 28 395 47C395 62 401 85 413 116C453 223 473 296 473 335C473 406 427 445 356 445C303 445 257 423 218 380L291 679C289 688 287 694 274 694C241 694 168 685 155 684C140 682 132 675 132 660C132 650 141 645 159 645C180 645 203 646 205 632L59 43C56 32 55 25 55 21C55 0 66-11 87-11C107-11 121-1 128 18L168 182C180 231 189 268 196 293C199 300 207 314 220 334C256 388 300 415 353 415C386 415 402 393 402 350C402 309 382 236 342 130C333 107 329 89 329 74C329 26 365-11 413-11C457-11 492 14 517 65C536 105 546 132 546 145C546 154 541 159 530 159C527 159 512 150 512 138Z"></path></g><g data-mml-node="mi" data-latex="o" transform="translate(5777,0)"><path data-c="1D45C" d="M308 442C239 442 176 412 122 353C68 294 41 229 41 159C41 63 106-11 202-11C272-11 334 19 388 78C442 137 469 201 469 272C469 369 405 442 308 442M389 310C389 287 384 255 374 213C353 130 319 73 272 42C248 26 225 18 203 18C149 18 121 65 121 122C121 180 155 288 178 324C216 383 259 413 307 413C361 413 389 367 389 310Z"></path></g></g></g><g data-mml-node="mo" data-latex="=" transform="translate(5758.7,0)"><path data-c="3D" d="M698 367L80 367C64 367 56 359 56 344C56 329 64 321 80 321L698 321C714 321 722 329 722 344C722 356 711 367 698 367M698 179L80 179C64 179 56 171 56 156C56 141 64 133 80 133L698 133C714 133 722 141 722 156C722 169 711 179 698 179Z"></path></g><g data-mml-node="mrow" data-latex="{pmatrix}" transform="translate(6814.5,0)"><g data-mml-node="mo"><path data-c="239B" d="M813 1450C820 1455 823 1462 823 1470C823 1487 815 1495 798 1495C793 1495 788 1493 784 1490C697 1423 614 1324 536 1192C399 956 277 603 277 253L277 0L385 0L385 253C385 407 403 562 438 719C500 999 630 1313 813 1450Z" transform="translate(0,1355)"></path><path data-c="239D" d="M798 0C815 0 823 8 823 25C823 34 819 40 812 44C731 106 658 202 592 334C474 569 385 903 385 1242L385 1495L277 1495L277 1242C277 914 388 575 512 345C594 193 685 80 784 5C788 2 793 0 798 0Z" transform="translate(0,-2350)"></path><svg width="875" height="2350" y="-925" x="0" viewBox="0 587.5 875 2350"><path data-c="239C" d="M277 0L385 0L385 498L277 498Z" transform="scale(1,7.078)"></path></svg></g><g data-mml-node="mtable" transform="translate(875,0)"><g data-mml-node="mtr" transform="translate(0,2100)"><g data-mml-node="mtd"><g data-mml-node="mi" data-latex="z"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="mi" data-latex="N" transform="translate(467,0)"><path data-c="1D441" d="M864 683C845 683 783 680 764 680C745 680 682 683 663 683C648 683 641 675 641 659C641 650 648 645 663 644C705 644 726 631 726 605C726 599 725 592 724 585L616 157L401 662C393 681 391 683 366 683L233 683C209 683 200 681 200 659C200 649 211 644 232 644C274 644 295 643 296 640L163 110C154 71 131 49 95 42C69 39 39 43 39 15C39 5 45 0 56 0C74 0 136 3 155 3C174 3 238 0 257 0C272 0 279 8 279 24C279 33 271 38 255 39C214 40 194 53 194 78C194 83 195 90 197 100L326 611L576 21C582 7 590 0 599 0C608 0 614 8 618 24L757 574C770 625 798 643 860 644C874 645 881 653 881 669C878 678 877 683 864 683Z"></path></g><g data-mml-node="mi" data-latex="e" transform="translate(1348,0)"><path data-c="1D452" d="M124 129C124 153 129 186 139 227L188 227C253 227 303 235 339 250C372 264 394 284 405 309C412 326 415 342 415 355C415 410 363 442 307 442C268 442 229 432 190 412C113 372 46 281 46 171C46 69 105-11 204-11C257-11 304 2 345 27C379 48 404 69 420 90C427 99 430 106 430 109C430 120 425 126 414 126C409 126 404 122 398 114C365 70 324 42 277 30C246 22 223 18 206 18C149 18 124 72 124 129M375 355C375 289 311 256 182 256L147 256C166 322 194 366 232 387C262 404 287 413 307 413C343 413 375 391 375 355Z"></path></g><g data-mml-node="mi" data-latex="a" transform="translate(1814,0)"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(2343,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g></g><g data-mml-node="mtd" transform="translate(4941,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(10445.2,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(17798.7,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g></g><g data-mml-node="mtr" transform="translate(0,700)"><g data-mml-node="mtd" transform="translate(1147,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(3794,0)"><g data-mml-node="mi" data-latex="z"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="mi" data-latex="N" transform="translate(467,0)"><path data-c="1D441" d="M864 683C845 683 783 680 764 680C745 680 682 683 663 683C648 683 641 675 641 659C641 650 648 645 663 644C705 644 726 631 726 605C726 599 725 592 724 585L616 157L401 662C393 681 391 683 366 683L233 683C209 683 200 681 200 659C200 649 211 644 232 644C274 644 295 643 296 640L163 110C154 71 131 49 95 42C69 39 39 43 39 15C39 5 45 0 56 0C74 0 136 3 155 3C174 3 238 0 257 0C272 0 279 8 279 24C279 33 271 38 255 39C214 40 194 53 194 78C194 83 195 90 197 100L326 611L576 21C582 7 590 0 599 0C608 0 614 8 618 24L757 574C770 625 798 643 860 644C874 645 881 653 881 669C878 678 877 683 864 683Z"></path></g><g data-mml-node="mi" data-latex="e" transform="translate(1348,0)"><path data-c="1D452" d="M124 129C124 153 129 186 139 227L188 227C253 227 303 235 339 250C372 264 394 284 405 309C412 326 415 342 415 355C415 410 363 442 307 442C268 442 229 432 190 412C113 372 46 281 46 171C46 69 105-11 204-11C257-11 304 2 345 27C379 48 404 69 420 90C427 99 430 106 430 109C430 120 425 126 414 126C409 126 404 122 398 114C365 70 324 42 277 30C246 22 223 18 206 18C149 18 124 72 124 129M375 355C375 289 311 256 182 256L147 256C166 322 194 366 232 387C262 404 287 413 307 413C343 413 375 391 375 355Z"></path></g><g data-mml-node="mi" data-latex="a" transform="translate(1814,0)"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(2343,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g></g><g data-mml-node="mtd" transform="translate(10445.2,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(17798.7,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g></g><g data-mml-node="mtr" transform="translate(0,-700)"><g data-mml-node="mtd" transform="translate(1147,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(4941,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(7588,0)"><g data-mml-node="mi" data-latex="z"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="mi" data-latex="N" transform="translate(467,0)"><path data-c="1D441" d="M864 683C845 683 783 680 764 680C745 680 682 683 663 683C648 683 641 675 641 659C641 650 648 645 663 644C705 644 726 631 726 605C726 599 725 592 724 585L616 157L401 662C393 681 391 683 366 683L233 683C209 683 200 681 200 659C200 649 211 644 232 644C274 644 295 643 296 640L163 110C154 71 131 49 95 42C69 39 39 43 39 15C39 5 45 0 56 0C74 0 136 3 155 3C174 3 238 0 257 0C272 0 279 8 279 24C279 33 271 38 255 39C214 40 194 53 194 78C194 83 195 90 197 100L326 611L576 21C582 7 590 0 599 0C608 0 614 8 618 24L757 574C770 625 798 643 860 644C874 645 881 653 881 669C878 678 877 683 864 683Z"></path></g><g data-mml-node="mi" data-latex="e" transform="translate(1348,0)"><path data-c="1D452" d="M124 129C124 153 129 186 139 227L188 227C253 227 303 235 339 250C372 264 394 284 405 309C412 326 415 342 415 355C415 410 363 442 307 442C268 442 229 432 190 412C113 372 46 281 46 171C46 69 105-11 204-11C257-11 304 2 345 27C379 48 404 69 420 90C427 99 430 106 430 109C430 120 425 126 414 126C409 126 404 122 398 114C365 70 324 42 277 30C246 22 223 18 206 18C149 18 124 72 124 129M375 355C375 289 311 256 182 256L147 256C166 322 194 366 232 387C262 404 287 413 307 413C343 413 375 391 375 355Z"></path></g><g data-mml-node="mi" data-latex="a" transform="translate(1814,0)"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(2343,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g><g data-mml-node="mo" data-latex="+" transform="translate(3016.2,0)"><path data-c="2B" d="M698 274L413 274L413 559C413 575 405 583 389 583C373 583 365 575 365 559L365 274L80 274C64 274 56 266 56 250C56 234 64 226 80 226L365 226L365-59C365-75 373-83 389-83C405-83 413-75 413-59L413 226L698 226C714 226 722 234 722 250C722 263 711 274 698 274Z"></path></g><g data-mml-node="mi" data-latex="z" transform="translate(4016.4,0)"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="mi" data-latex="F" transform="translate(4483.4,0)"><path data-c="1D439" d="M199 656C199 646 210 641 231 641C271 641 291 637 291 628C291 625 289 618 286 605L156 82C150 60 140 47 126 42C119 40 101 39 70 39C48 39 38 37 38 16C38 5 44 0 57 0L187 3L335 0C351 0 359 8 359 23C359 40 348 39 322 39C278 39 253 41 247 46C244 47 243 51 243 56L307 321L400 321C446 321 478 319 478 281C478 268 476 252 471 233C470 230 469 226 468 222C468 211 473 206 484 206C489 207 496 214 503 229L557 444C559 452 560 458 560 461C557 470 551 475 544 475C536 475 530 467 526 452C516 414 502 390 486 378C470 366 442 360 402 360L317 360L379 606C387 640 387 641 429 641L559 641C656 641 700 626 700 537C700 517 699 499 697 484C696 473 695 467 695 466C695 455 700 450 710 450C720 450 726 459 728 478L748 649C751 677 744 680 717 680L233 680C210 680 199 679 199 656Z"></path></g><g data-mml-node="mi" data-latex="a" transform="translate(5234.4,0)"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(5763.4,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g></g><g data-mml-node="mtd" transform="translate(14802.4,0)"><g data-mml-node="mo" data-latex="-"><path data-c="2212" d="M698 270L80 270C64 270 56 263 56 250C56 237 64 230 80 230L698 230C714 230 722 237 722 250C722 262 710 270 698 270Z"></path></g><g data-mml-node="mi" data-latex="z" transform="translate(778,0)"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="mi" data-latex="N" transform="translate(1245,0)"><path data-c="1D441" d="M864 683C845 683 783 680 764 680C745 680 682 683 663 683C648 683 641 675 641 659C641 650 648 645 663 644C705 644 726 631 726 605C726 599 725 592 724 585L616 157L401 662C393 681 391 683 366 683L233 683C209 683 200 681 200 659C200 649 211 644 232 644C274 644 295 643 296 640L163 110C154 71 131 49 95 42C69 39 39 43 39 15C39 5 45 0 56 0C74 0 136 3 155 3C174 3 238 0 257 0C272 0 279 8 279 24C279 33 271 38 255 39C214 40 194 53 194 78C194 83 195 90 197 100L326 611L576 21C582 7 590 0 599 0C608 0 614 8 618 24L757 574C770 625 798 643 860 644C874 645 881 653 881 669C878 678 877 683 864 683Z"></path></g><g data-mml-node="mi" data-latex="e" transform="translate(2126,0)"><path data-c="1D452" d="M124 129C124 153 129 186 139 227L188 227C253 227 303 235 339 250C372 264 394 284 405 309C412 326 415 342 415 355C415 410 363 442 307 442C268 442 229 432 190 412C113 372 46 281 46 171C46 69 105-11 204-11C257-11 304 2 345 27C379 48 404 69 420 90C427 99 430 106 430 109C430 120 425 126 414 126C409 126 404 122 398 114C365 70 324 42 277 30C246 22 223 18 206 18C149 18 124 72 124 129M375 355C375 289 311 256 182 256L147 256C166 322 194 366 232 387C262 404 287 413 307 413C343 413 375 391 375 355Z"></path></g><g data-mml-node="mi" data-latex="a" transform="translate(2592,0)"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(3121,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g><g data-mml-node="mo" data-latex="\cdot" transform="translate(3794.2,0)"><path data-c="22C5" d="M192 250C192 279 168 303 139 303C110 303 86 279 86 250C86 221 110 197 139 197C168 197 192 221 192 250Z"></path></g><g data-mml-node="mi" data-latex="z" transform="translate(4294.4,0)"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="mi" data-latex="F" transform="translate(4761.4,0)"><path data-c="1D439" d="M199 656C199 646 210 641 231 641C271 641 291 637 291 628C291 625 289 618 286 605L156 82C150 60 140 47 126 42C119 40 101 39 70 39C48 39 38 37 38 16C38 5 44 0 57 0L187 3L335 0C351 0 359 8 359 23C359 40 348 39 322 39C278 39 253 41 247 46C244 47 243 51 243 56L307 321L400 321C446 321 478 319 478 281C478 268 476 252 471 233C470 230 469 226 468 222C468 211 473 206 484 206C489 207 496 214 503 229L557 444C559 452 560 458 560 461C557 470 551 475 544 475C536 475 530 467 526 452C516 414 502 390 486 378C470 366 442 360 402 360L317 360L379 606C387 640 387 641 429 641L559 641C656 641 700 626 700 537C700 517 699 499 697 484C696 473 695 467 695 466C695 455 700 450 710 450C720 450 726 459 728 478L748 649C751 677 744 680 717 680L233 680C210 680 199 679 199 656Z"></path></g><g data-mml-node="mi" data-latex="a" transform="translate(5512.4,0)"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(6041.4,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g></g></g><g data-mml-node="mtr" transform="translate(0,-2100)"><g data-mml-node="mtd" transform="translate(1147,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(4941,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g><g data-mml-node="mtd" transform="translate(10445.2,0)"><g data-mml-node="mn" data-latex="1"><path data-c="31" d="M269 666C228 624 168 603 89 603L89 564C141 564 184 572 217 588L217 82C217 64 213 52 204 47C195 42 170 39 130 39L95 39L95 0C120 2 174 3 257 3C340 3 394 2 419 0L419 39L384 39C343 39 318 42 310 47C302 52 297 64 297 82L297 636C297 660 295 666 269 666Z"></path></g></g><g data-mml-node="mtd" transform="translate(17798.7,0)"><g data-mml-node="mn" data-latex="0"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g></g></g><g data-mml-node="mo" transform="translate(22169.9,0)"><path data-c="239E" d="M490 0L598 0L598 253C598 581 487 920 363 1150C281 1301 190 1415 91 1490C87 1493 82 1495 77 1495C60 1495 52 1487 52 1470C52 1462 55 1455 62 1450C143 1389 216 1292 283 1160C402 924 490 593 490 253Z" transform="translate(0,1355)"></path><path data-c="23A0" d="M598 1242L598 1495L490 1495L490 1242C490 1088 472 933 437 776C375 494 246 184 63 44C56 40 52 34 52 25C52 8 60 0 77 0C82 0 87 2 91 5C178 71 261 170 339 303C477 539 598 892 598 1242Z" transform="translate(0,-2350)"></path><svg width="875" height="2350" y="-925" x="0" viewBox="0 587.5 875 2350"><path data-c="239F" d="M490 0L598 0L598 498L490 498Z" transform="scale(1,7.078)"></path></svg></g></g><g data-mml-node="mo" data-latex="," transform="translate(30026,0)"><path data-c="2C" d="M139 106C107 106 86 82 86 50C86 20 109-5 139-5C153-5 165-1 174 8L175 0C175-63 154-117 112-160C105-168 101-174 101-178C101-188 105-193 114-193C123-193 135-181 152-158C186-110 203-57 203 0C203 53 185 106 139 106Z"></path></g><g data-mml-node="mo" data-latex="(" transform="translate(30470.7,0)"><path data-c="28" d="M318-248C327-248 332-243 332-234C332-231 330-227 327-223C275-183 233-117 202-26C175 53 161 131 161 208L161 292C161 369 175 447 202 526C233 617 275 683 327 723C330 726 332 730 332 734C332 743 327 748 318 748C317 748 314 747 311 745C251 699 201 631 160 540C121 453 101 371 101 292L101 208C101 129 121 47 160-40C201-131 251-199 311-245C314-247 317-248 318-248Z"></path></g><g data-mml-node="mi" data-latex="z" transform="translate(30859.7,0)"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="mi" data-latex="F" transform="translate(31326.7,0)"><path data-c="1D439" d="M199 656C199 646 210 641 231 641C271 641 291 637 291 628C291 625 289 618 286 605L156 82C150 60 140 47 126 42C119 40 101 39 70 39C48 39 38 37 38 16C38 5 44 0 57 0L187 3L335 0C351 0 359 8 359 23C359 40 348 39 322 39C278 39 253 41 247 46C244 47 243 51 243 56L307 321L400 321C446 321 478 319 478 281C478 268 476 252 471 233C470 230 469 226 468 222C468 211 473 206 484 206C489 207 496 214 503 229L557 444C559 452 560 458 560 461C557 470 551 475 544 475C536 475 530 467 526 452C516 414 502 390 486 378C470 366 442 360 402 360L317 360L379 606C387 640 387 641 429 641L559 641C656 641 700 626 700 537C700 517 699 499 697 484C696 473 695 467 695 466C695 455 700 450 710 450C720 450 726 459 728 478L748 649C751 677 744 680 717 680L233 680C210 680 199 679 199 656Z"></path></g><g data-mml-node="mi" data-latex="a" transform="translate(32077.7,0)"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(32606.7,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g><g data-mml-node="mo" data-latex="<" transform="translate(33335.5,0)"><path data-c="3C" d="M666-45C683-52 701-39 701-23C701-13 696-6 687-2L153 250L687 502C696 506 701 513 701 522C701 539 693 547 677 547C673 547 669 546 666 545L92 273C82 268 77 261 77 250C77 239 82 232 92 227Z"></path></g><g data-mml-node="mi" data-latex="z" transform="translate(34391.2,0)"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="mi" data-latex="N" transform="translate(34858.2,0)"><path data-c="1D441" d="M864 683C845 683 783 680 764 680C745 680 682 683 663 683C648 683 641 675 641 659C641 650 648 645 663 644C705 644 726 631 726 605C726 599 725 592 724 585L616 157L401 662C393 681 391 683 366 683L233 683C209 683 200 681 200 659C200 649 211 644 232 644C274 644 295 643 296 640L163 110C154 71 131 49 95 42C69 39 39 43 39 15C39 5 45 0 56 0C74 0 136 3 155 3C174 3 238 0 257 0C272 0 279 8 279 24C279 33 271 38 255 39C214 40 194 53 194 78C194 83 195 90 197 100L326 611L576 21C582 7 590 0 599 0C608 0 614 8 618 24L757 574C770 625 798 643 860 644C874 645 881 653 881 669C878 678 877 683 864 683Z"></path></g><g data-mml-node="mi" data-latex="e" transform="translate(35739.2,0)"><path data-c="1D452" d="M124 129C124 153 129 186 139 227L188 227C253 227 303 235 339 250C372 264 394 284 405 309C412 326 415 342 415 355C415 410 363 442 307 442C268 442 229 432 190 412C113 372 46 281 46 171C46 69 105-11 204-11C257-11 304 2 345 27C379 48 404 69 420 90C427 99 430 106 430 109C430 120 425 126 414 126C409 126 404 122 398 114C365 70 324 42 277 30C246 22 223 18 206 18C149 18 124 72 124 129M375 355C375 289 311 256 182 256L147 256C166 322 194 366 232 387C262 404 287 413 307 413C343 413 375 391 375 355Z"></path></g><g data-mml-node="mi" data-latex="a" transform="translate(36205.2,0)"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(36734.2,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g><g data-mml-node="mo" data-latex="<" transform="translate(37463,0)"><path data-c="3C" d="M666-45C683-52 701-39 701-23C701-13 696-6 687-2L153 250L687 502C696 506 701 513 701 522C701 539 693 547 677 547C673 547 669 546 666 545L92 273C82 268 77 261 77 250C77 239 82 232 92 227Z"></path></g><g data-mml-node="mn" data-latex="0" transform="translate(38518.8,0)"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g><g data-mml-node="mo" data-latex=")" transform="translate(39018.8,0)"><path data-c="29" d="M78-245C138-199 188-131 229-40C268 47 288 129 288 208L288 292C288 371 268 453 229 540C188 631 138 699 78 745C75 747 72 748 71 748C62 748 57 743 57 734C57 730 59 726 62 723C114 683 156 617 187 526C214 447 228 369 228 292L228 208C228 131 214 53 187-26C156-117 114-183 62-223C59-227 57-231 57-234C57-243 62-248 71-248C72-248 75-247 78-245Z"></path></g></g></g></svg></mjx-container></p></li><li><p>也就有：</p><p>  <mjx-container class="MathJax" jax="SVG" overflow="overflow" display="true"><svg style="vertical-align: -0.65ex;" xmlns="http://www.w3.org/2000/svg" width="27.781ex" height="2.195ex" role="img" focusable="false" viewBox="0 -683 12279.2 970.2"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="  M_{persp} = M_{ortho}M_{persp\_to\_ortho}  "><g data-mml-node="msub" data-latex="M_{p e r s p}"><g data-mml-node="mi" data-latex="M"><path data-c="1D440" d="M594 16C594 5 600 0 613 0L736 3C759 4 840 0 859 0C874 0 882 8 882 24C882 34 872 39 851 39C810 39 790 43 790 52C790 55 792 62 795 75L927 602C932 623 942 636 955 641C961 643 979 644 1008 644C1033 644 1044 645 1044 668C1044 678 1034 683 1013 683L882 683C853 683 853 681 840 662L484 108L408 657C404 682 402 683 373 683L237 683C215 683 204 682 204 660C204 649 215 644 236 644C256 644 297 647 297 631C297 629 296 623 293 613L167 110C158 72 135 49 100 42C75 39 42 43 42 16C42 5 48 0 60 0C78 0 141 3 159 3C178 3 242 0 261 0C276 0 283 8 283 24C283 33 276 38 261 39C219 39 198 52 198 78C198 82 199 89 202 100L332 621L415 26C418 9 424 0 434 0C442 0 450 7 459 20L848 627L712 82C706 60 696 47 681 42C675 40 656 39 625 39C604 39 594 37 594 16Z"></path></g><g data-mml-node="TeXAtom" transform="translate(1003,-150) scale(0.707)" data-latex="{p e r s p}" data-mjx-texclass="ORD"><g data-mml-node="mi" data-latex="p"><path data-c="1D45D" d="M355 442C311 442 269 419 228 373C217 419 186 442 137 442C96 442 66 409 45 344C35 311 30 292 30 286C30 277 35 272 46 272C51 272 54 273 57 275C62 284 65 291 66 298C84 374 107 412 134 412C152 412 161 398 161 371C161 356 159 339 154 321L44-118C35-151 34-155-5-155C-23-155-32-163-32-178C-32-189-26-194-15-194C0-194 52-191 67-191C86-191 146-194 165-194C180-194 187-186 187-170C187-160 178-155 159-155C141-155 114-156 114-144C114-131 155 26 159 43C179 6 209-13 249-13C314-13 371 20 421 87C467 148 490 213 490 280C490 367 438 442 355 442M352 412C391 412 411 382 411 323C411 296 405 260 394 215C371 128 342 71 307 42C286 25 267 16 248 16C219 16 199 29 188 56C179 77 174 92 174 100L225 309C230 331 248 354 276 377C304 400 329 412 352 412Z"></path></g><g data-mml-node="mi" data-latex="e" transform="translate(503,0)"><path data-c="1D452" d="M124 129C124 153 129 186 139 227L188 227C253 227 303 235 339 250C372 264 394 284 405 309C412 326 415 342 415 355C415 410 363 442 307 442C268 442 229 432 190 412C113 372 46 281 46 171C46 69 105-11 204-11C257-11 304 2 345 27C379 48 404 69 420 90C427 99 430 106 430 109C430 120 425 126 414 126C409 126 404 122 398 114C365 70 324 42 277 30C246 22 223 18 206 18C149 18 124 72 124 129M375 355C375 289 311 256 182 256L147 256C166 322 194 366 232 387C262 404 287 413 307 413C343 413 375 391 375 355Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(969,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g><g data-mml-node="mi" data-latex="s" transform="translate(1420,0)"><path data-c="1D460" d="M420 354C420 411 362 442 300 442C237 442 192 423 165 385C142 352 130 322 130 295C130 242 165 208 234 193C263 188 285 181 302 173C323 164 333 147 333 123C333 105 325 85 308 62C287 33 250 18 197 18C143 18 108 33 92 62C124 61 151 87 151 119C151 144 138 157 111 157C75 157 52 124 52 88C52 22 124-11 196-11C271-11 325 11 357 56C384 93 397 126 397 156C397 199 376 231 335 252C304 263 280 270 265 273C230 282 194 285 194 328C194 381 244 413 300 413C342 413 369 400 382 375C360 371 337 352 337 327C337 306 348 295 371 295C402 295 420 323 420 354Z"></path></g><g data-mml-node="mi" data-latex="p" transform="translate(1889,0)"><path data-c="1D45D" d="M355 442C311 442 269 419 228 373C217 419 186 442 137 442C96 442 66 409 45 344C35 311 30 292 30 286C30 277 35 272 46 272C51 272 54 273 57 275C62 284 65 291 66 298C84 374 107 412 134 412C152 412 161 398 161 371C161 356 159 339 154 321L44-118C35-151 34-155-5-155C-23-155-32-163-32-178C-32-189-26-194-15-194C0-194 52-191 67-191C86-191 146-194 165-194C180-194 187-186 187-170C187-160 178-155 159-155C141-155 114-156 114-144C114-131 155 26 159 43C179 6 209-13 249-13C314-13 371 20 421 87C467 148 490 213 490 280C490 367 438 442 355 442M352 412C391 412 411 382 411 323C411 296 405 260 394 215C371 128 342 71 307 42C286 25 267 16 248 16C219 16 199 29 188 56C179 77 174 92 174 100L225 309C230 331 248 354 276 377C304 400 329 412 352 412Z"></path></g></g></g><g data-mml-node="mo" data-latex="=" transform="translate(3022.2,0)"><path data-c="3D" d="M698 367L80 367C64 367 56 359 56 344C56 329 64 321 80 321L698 321C714 321 722 329 722 344C722 356 711 367 698 367M698 179L80 179C64 179 56 171 56 156C56 141 64 133 80 133L698 133C714 133 722 141 722 156C722 169 711 179 698 179Z"></path></g><g data-mml-node="msub" data-latex="M_{o r t h o}" transform="translate(4078,0)"><g data-mml-node="mi" data-latex="M"><path data-c="1D440" d="M594 16C594 5 600 0 613 0L736 3C759 4 840 0 859 0C874 0 882 8 882 24C882 34 872 39 851 39C810 39 790 43 790 52C790 55 792 62 795 75L927 602C932 623 942 636 955 641C961 643 979 644 1008 644C1033 644 1044 645 1044 668C1044 678 1034 683 1013 683L882 683C853 683 853 681 840 662L484 108L408 657C404 682 402 683 373 683L237 683C215 683 204 682 204 660C204 649 215 644 236 644C256 644 297 647 297 631C297 629 296 623 293 613L167 110C158 72 135 49 100 42C75 39 42 43 42 16C42 5 48 0 60 0C78 0 141 3 159 3C178 3 242 0 261 0C276 0 283 8 283 24C283 33 276 38 261 39C219 39 198 52 198 78C198 82 199 89 202 100L332 621L415 26C418 9 424 0 434 0C442 0 450 7 459 20L848 627L712 82C706 60 696 47 681 42C675 40 656 39 625 39C604 39 594 37 594 16Z"></path></g><g data-mml-node="TeXAtom" transform="translate(1003,-150) scale(0.707)" data-latex="{o r t h o}" data-mjx-texclass="ORD"><g data-mml-node="mi" data-latex="o"><path data-c="1D45C" d="M308 442C239 442 176 412 122 353C68 294 41 229 41 159C41 63 106-11 202-11C272-11 334 19 388 78C442 137 469 201 469 272C469 369 405 442 308 442M389 310C389 287 384 255 374 213C353 130 319 73 272 42C248 26 225 18 203 18C149 18 121 65 121 122C121 180 155 288 178 324C216 383 259 413 307 413C361 413 389 367 389 310Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(485,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g><g data-mml-node="mi" data-latex="t" transform="translate(936,0)"><path data-c="1D461" d="M330 419C330 428 320 433 299 433L218 433C244 537 257 591 257 595C257 616 246 626 225 626C202 626 188 613 182 587L145 433L56 433C34 433 23 432 23 411C23 400 33 395 54 395L135 395C86 200 62 97 62 84C62 28 100-11 156-11C194-11 227 6 256 41C280 70 297 98 308 125C312 136 314 142 314 145C314 154 309 159 299 159C291 159 285 154 281 143C247 60 206 19 157 19C140 19 131 33 131 60C131 75 133 91 137 107L208 395L297 395C323 395 330 397 330 419Z"></path></g><g data-mml-node="mi" data-latex="h" transform="translate(1297,0)"><path data-c="210E" d="M512 138C489 59 457 19 415 19C402 19 395 28 395 47C395 62 401 85 413 116C453 223 473 296 473 335C473 406 427 445 356 445C303 445 257 423 218 380L291 679C289 688 287 694 274 694C241 694 168 685 155 684C140 682 132 675 132 660C132 650 141 645 159 645C180 645 203 646 205 632L59 43C56 32 55 25 55 21C55 0 66-11 87-11C107-11 121-1 128 18L168 182C180 231 189 268 196 293C199 300 207 314 220 334C256 388 300 415 353 415C386 415 402 393 402 350C402 309 382 236 342 130C333 107 329 89 329 74C329 26 365-11 413-11C457-11 492 14 517 65C536 105 546 132 546 145C546 154 541 159 530 159C527 159 512 150 512 138Z"></path></g><g data-mml-node="mi" data-latex="o" transform="translate(1873,0)"><path data-c="1D45C" d="M308 442C239 442 176 412 122 353C68 294 41 229 41 159C41 63 106-11 202-11C272-11 334 19 388 78C442 137 469 201 469 272C469 369 405 442 308 442M389 310C389 287 384 255 374 213C353 130 319 73 272 42C248 26 225 18 203 18C149 18 121 65 121 122C121 180 155 288 178 324C216 383 259 413 307 413C361 413 389 367 389 310Z"></path></g></g></g><g data-mml-node="msub" data-latex="M_{p e r s p\_t o\_o r t h o}" transform="translate(6798.3,0)"><g data-mml-node="mi" data-latex="M"><path data-c="1D440" d="M594 16C594 5 600 0 613 0L736 3C759 4 840 0 859 0C874 0 882 8 882 24C882 34 872 39 851 39C810 39 790 43 790 52C790 55 792 62 795 75L927 602C932 623 942 636 955 641C961 643 979 644 1008 644C1033 644 1044 645 1044 668C1044 678 1034 683 1013 683L882 683C853 683 853 681 840 662L484 108L408 657C404 682 402 683 373 683L237 683C215 683 204 682 204 660C204 649 215 644 236 644C256 644 297 647 297 631C297 629 296 623 293 613L167 110C158 72 135 49 100 42C75 39 42 43 42 16C42 5 48 0 60 0C78 0 141 3 159 3C178 3 242 0 261 0C276 0 283 8 283 24C283 33 276 38 261 39C219 39 198 52 198 78C198 82 199 89 202 100L332 621L415 26C418 9 424 0 434 0C442 0 450 7 459 20L848 627L712 82C706 60 696 47 681 42C675 40 656 39 625 39C604 39 594 37 594 16Z"></path></g><g data-mml-node="TeXAtom" transform="translate(1003,-150) scale(0.707)" data-latex="{p e r s p\_t o\_o r t h o}" data-mjx-texclass="ORD"><g data-mml-node="mi" data-latex="p"><path data-c="1D45D" d="M355 442C311 442 269 419 228 373C217 419 186 442 137 442C96 442 66 409 45 344C35 311 30 292 30 286C30 277 35 272 46 272C51 272 54 273 57 275C62 284 65 291 66 298C84 374 107 412 134 412C152 412 161 398 161 371C161 356 159 339 154 321L44-118C35-151 34-155-5-155C-23-155-32-163-32-178C-32-189-26-194-15-194C0-194 52-191 67-191C86-191 146-194 165-194C180-194 187-186 187-170C187-160 178-155 159-155C141-155 114-156 114-144C114-131 155 26 159 43C179 6 209-13 249-13C314-13 371 20 421 87C467 148 490 213 490 280C490 367 438 442 355 442M352 412C391 412 411 382 411 323C411 296 405 260 394 215C371 128 342 71 307 42C286 25 267 16 248 16C219 16 199 29 188 56C179 77 174 92 174 100L225 309C230 331 248 354 276 377C304 400 329 412 352 412Z"></path></g><g data-mml-node="mi" data-latex="e" transform="translate(503,0)"><path data-c="1D452" d="M124 129C124 153 129 186 139 227L188 227C253 227 303 235 339 250C372 264 394 284 405 309C412 326 415 342 415 355C415 410 363 442 307 442C268 442 229 432 190 412C113 372 46 281 46 171C46 69 105-11 204-11C257-11 304 2 345 27C379 48 404 69 420 90C427 99 430 106 430 109C430 120 425 126 414 126C409 126 404 122 398 114C365 70 324 42 277 30C246 22 223 18 206 18C149 18 124 72 124 129M375 355C375 289 311 256 182 256L147 256C166 322 194 366 232 387C262 404 287 413 307 413C343 413 375 391 375 355Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(969,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g><g data-mml-node="mi" data-latex="s" transform="translate(1420,0)"><path data-c="1D460" d="M420 354C420 411 362 442 300 442C237 442 192 423 165 385C142 352 130 322 130 295C130 242 165 208 234 193C263 188 285 181 302 173C323 164 333 147 333 123C333 105 325 85 308 62C287 33 250 18 197 18C143 18 108 33 92 62C124 61 151 87 151 119C151 144 138 157 111 157C75 157 52 124 52 88C52 22 124-11 196-11C271-11 325 11 357 56C384 93 397 126 397 156C397 199 376 231 335 252C304 263 280 270 265 273C230 282 194 285 194 328C194 381 244 413 300 413C342 413 369 400 382 375C360 371 337 352 337 327C337 306 348 295 371 295C402 295 420 323 420 354Z"></path></g><g data-mml-node="mi" data-latex="p" transform="translate(1889,0)"><path data-c="1D45D" d="M355 442C311 442 269 419 228 373C217 419 186 442 137 442C96 442 66 409 45 344C35 311 30 292 30 286C30 277 35 272 46 272C51 272 54 273 57 275C62 284 65 291 66 298C84 374 107 412 134 412C152 412 161 398 161 371C161 356 159 339 154 321L44-118C35-151 34-155-5-155C-23-155-32-163-32-178C-32-189-26-194-15-194C0-194 52-191 67-191C86-191 146-194 165-194C180-194 187-186 187-170C187-160 178-155 159-155C141-155 114-156 114-144C114-131 155 26 159 43C179 6 209-13 249-13C314-13 371 20 421 87C467 148 490 213 490 280C490 367 438 442 355 442M352 412C391 412 411 382 411 323C411 296 405 260 394 215C371 128 342 71 307 42C286 25 267 16 248 16C219 16 199 29 188 56C179 77 174 92 174 100L225 309C230 331 248 354 276 377C304 400 329 412 352 412Z"></path></g><g data-mml-node="mi" data-latex="\_" transform="translate(2392,0)"><path data-c="5F" d="M0-140L333-140L333-100L0-100Z"></path></g><g data-mml-node="mi" data-latex="t" transform="translate(2725,0)"><path data-c="1D461" d="M330 419C330 428 320 433 299 433L218 433C244 537 257 591 257 595C257 616 246 626 225 626C202 626 188 613 182 587L145 433L56 433C34 433 23 432 23 411C23 400 33 395 54 395L135 395C86 200 62 97 62 84C62 28 100-11 156-11C194-11 227 6 256 41C280 70 297 98 308 125C312 136 314 142 314 145C314 154 309 159 299 159C291 159 285 154 281 143C247 60 206 19 157 19C140 19 131 33 131 60C131 75 133 91 137 107L208 395L297 395C323 395 330 397 330 419Z"></path></g><g data-mml-node="mi" data-latex="o" transform="translate(3086,0)"><path data-c="1D45C" d="M308 442C239 442 176 412 122 353C68 294 41 229 41 159C41 63 106-11 202-11C272-11 334 19 388 78C442 137 469 201 469 272C469 369 405 442 308 442M389 310C389 287 384 255 374 213C353 130 319 73 272 42C248 26 225 18 203 18C149 18 121 65 121 122C121 180 155 288 178 324C216 383 259 413 307 413C361 413 389 367 389 310Z"></path></g><g data-mml-node="mi" data-latex="\_" transform="translate(3571,0)"><path data-c="5F" d="M0-140L333-140L333-100L0-100Z"></path></g><g data-mml-node="mi" data-latex="o" transform="translate(3904,0)"><path data-c="1D45C" d="M308 442C239 442 176 412 122 353C68 294 41 229 41 159C41 63 106-11 202-11C272-11 334 19 388 78C442 137 469 201 469 272C469 369 405 442 308 442M389 310C389 287 384 255 374 213C353 130 319 73 272 42C248 26 225 18 203 18C149 18 121 65 121 122C121 180 155 288 178 324C216 383 259 413 307 413C361 413 389 367 389 310Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(4389,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g><g data-mml-node="mi" data-latex="t" transform="translate(4840,0)"><path data-c="1D461" d="M330 419C330 428 320 433 299 433L218 433C244 537 257 591 257 595C257 616 246 626 225 626C202 626 188 613 182 587L145 433L56 433C34 433 23 432 23 411C23 400 33 395 54 395L135 395C86 200 62 97 62 84C62 28 100-11 156-11C194-11 227 6 256 41C280 70 297 98 308 125C312 136 314 142 314 145C314 154 309 159 299 159C291 159 285 154 281 143C247 60 206 19 157 19C140 19 131 33 131 60C131 75 133 91 137 107L208 395L297 395C323 395 330 397 330 419Z"></path></g><g data-mml-node="mi" data-latex="h" transform="translate(5201,0)"><path data-c="210E" d="M512 138C489 59 457 19 415 19C402 19 395 28 395 47C395 62 401 85 413 116C453 223 473 296 473 335C473 406 427 445 356 445C303 445 257 423 218 380L291 679C289 688 287 694 274 694C241 694 168 685 155 684C140 682 132 675 132 660C132 650 141 645 159 645C180 645 203 646 205 632L59 43C56 32 55 25 55 21C55 0 66-11 87-11C107-11 121-1 128 18L168 182C180 231 189 268 196 293C199 300 207 314 220 334C256 388 300 415 353 415C386 415 402 393 402 350C402 309 382 236 342 130C333 107 329 89 329 74C329 26 365-11 413-11C457-11 492 14 517 65C536 105 546 132 546 145C546 154 541 159 530 159C527 159 512 150 512 138Z"></path></g><g data-mml-node="mi" data-latex="o" transform="translate(5777,0)"><path data-c="1D45C" d="M308 442C239 442 176 412 122 353C68 294 41 229 41 159C41 63 106-11 202-11C272-11 334 19 388 78C442 137 469 201 469 272C469 369 405 442 308 442M389 310C389 287 384 255 374 213C353 130 319 73 272 42C248 26 225 18 203 18C149 18 121 65 121 122C121 180 155 288 178 324C216 383 259 413 307 413C361 413 389 367 389 310Z"></path></g></g></g></g></g></svg></mjx-container></p></li></ul><h3 id="Z-轴深度非线性挤压"><a href="#Z-轴深度非线性挤压" class="headerlink" title="Z 轴深度非线性挤压"></a>Z 轴深度非线性挤压</h3><ul><li><p>注意到应用 <mjx-container class="MathJax" jax="SVG" overflow="overflow"><svg style="vertical-align: -0.65ex;" xmlns="http://www.w3.org/2000/svg" width="12.4ex" height="2.195ex" role="img" focusable="false" viewBox="0 -683 5480.9 970.2"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="M_{persp\_to\_ortho}"><g data-mml-node="msub" data-latex="M_{persp\_to\_ortho}"><g data-mml-node="mi" data-latex="M"><path data-c="1D440" d="M594 16C594 5 600 0 613 0L736 3C759 4 840 0 859 0C874 0 882 8 882 24C882 34 872 39 851 39C810 39 790 43 790 52C790 55 792 62 795 75L927 602C932 623 942 636 955 641C961 643 979 644 1008 644C1033 644 1044 645 1044 668C1044 678 1034 683 1013 683L882 683C853 683 853 681 840 662L484 108L408 657C404 682 402 683 373 683L237 683C215 683 204 682 204 660C204 649 215 644 236 644C256 644 297 647 297 631C297 629 296 623 293 613L167 110C158 72 135 49 100 42C75 39 42 43 42 16C42 5 48 0 60 0C78 0 141 3 159 3C178 3 242 0 261 0C276 0 283 8 283 24C283 33 276 38 261 39C219 39 198 52 198 78C198 82 199 89 202 100L332 621L415 26C418 9 424 0 434 0C442 0 450 7 459 20L848 627L712 82C706 60 696 47 681 42C675 40 656 39 625 39C604 39 594 37 594 16Z"></path></g><g data-mml-node="TeXAtom" transform="translate(1003,-150) scale(0.707)" data-latex="{p e r s p\_t o\_o r t h o}" data-mjx-texclass="ORD"><g data-mml-node="mi" data-latex="p"><path data-c="1D45D" d="M355 442C311 442 269 419 228 373C217 419 186 442 137 442C96 442 66 409 45 344C35 311 30 292 30 286C30 277 35 272 46 272C51 272 54 273 57 275C62 284 65 291 66 298C84 374 107 412 134 412C152 412 161 398 161 371C161 356 159 339 154 321L44-118C35-151 34-155-5-155C-23-155-32-163-32-178C-32-189-26-194-15-194C0-194 52-191 67-191C86-191 146-194 165-194C180-194 187-186 187-170C187-160 178-155 159-155C141-155 114-156 114-144C114-131 155 26 159 43C179 6 209-13 249-13C314-13 371 20 421 87C467 148 490 213 490 280C490 367 438 442 355 442M352 412C391 412 411 382 411 323C411 296 405 260 394 215C371 128 342 71 307 42C286 25 267 16 248 16C219 16 199 29 188 56C179 77 174 92 174 100L225 309C230 331 248 354 276 377C304 400 329 412 352 412Z"></path></g><g data-mml-node="mi" data-latex="e" transform="translate(503,0)"><path data-c="1D452" d="M124 129C124 153 129 186 139 227L188 227C253 227 303 235 339 250C372 264 394 284 405 309C412 326 415 342 415 355C415 410 363 442 307 442C268 442 229 432 190 412C113 372 46 281 46 171C46 69 105-11 204-11C257-11 304 2 345 27C379 48 404 69 420 90C427 99 430 106 430 109C430 120 425 126 414 126C409 126 404 122 398 114C365 70 324 42 277 30C246 22 223 18 206 18C149 18 124 72 124 129M375 355C375 289 311 256 182 256L147 256C166 322 194 366 232 387C262 404 287 413 307 413C343 413 375 391 375 355Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(969,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g><g data-mml-node="mi" data-latex="s" transform="translate(1420,0)"><path data-c="1D460" d="M420 354C420 411 362 442 300 442C237 442 192 423 165 385C142 352 130 322 130 295C130 242 165 208 234 193C263 188 285 181 302 173C323 164 333 147 333 123C333 105 325 85 308 62C287 33 250 18 197 18C143 18 108 33 92 62C124 61 151 87 151 119C151 144 138 157 111 157C75 157 52 124 52 88C52 22 124-11 196-11C271-11 325 11 357 56C384 93 397 126 397 156C397 199 376 231 335 252C304 263 280 270 265 273C230 282 194 285 194 328C194 381 244 413 300 413C342 413 369 400 382 375C360 371 337 352 337 327C337 306 348 295 371 295C402 295 420 323 420 354Z"></path></g><g data-mml-node="mi" data-latex="p" transform="translate(1889,0)"><path data-c="1D45D" d="M355 442C311 442 269 419 228 373C217 419 186 442 137 442C96 442 66 409 45 344C35 311 30 292 30 286C30 277 35 272 46 272C51 272 54 273 57 275C62 284 65 291 66 298C84 374 107 412 134 412C152 412 161 398 161 371C161 356 159 339 154 321L44-118C35-151 34-155-5-155C-23-155-32-163-32-178C-32-189-26-194-15-194C0-194 52-191 67-191C86-191 146-194 165-194C180-194 187-186 187-170C187-160 178-155 159-155C141-155 114-156 114-144C114-131 155 26 159 43C179 6 209-13 249-13C314-13 371 20 421 87C467 148 490 213 490 280C490 367 438 442 355 442M352 412C391 412 411 382 411 323C411 296 405 260 394 215C371 128 342 71 307 42C286 25 267 16 248 16C219 16 199 29 188 56C179 77 174 92 174 100L225 309C230 331 248 354 276 377C304 400 329 412 352 412Z"></path></g><g data-mml-node="mi" data-latex="\_" transform="translate(2392,0)"><path data-c="5F" d="M0-140L333-140L333-100L0-100Z"></path></g><g data-mml-node="mi" data-latex="t" transform="translate(2725,0)"><path data-c="1D461" d="M330 419C330 428 320 433 299 433L218 433C244 537 257 591 257 595C257 616 246 626 225 626C202 626 188 613 182 587L145 433L56 433C34 433 23 432 23 411C23 400 33 395 54 395L135 395C86 200 62 97 62 84C62 28 100-11 156-11C194-11 227 6 256 41C280 70 297 98 308 125C312 136 314 142 314 145C314 154 309 159 299 159C291 159 285 154 281 143C247 60 206 19 157 19C140 19 131 33 131 60C131 75 133 91 137 107L208 395L297 395C323 395 330 397 330 419Z"></path></g><g data-mml-node="mi" data-latex="o" transform="translate(3086,0)"><path data-c="1D45C" d="M308 442C239 442 176 412 122 353C68 294 41 229 41 159C41 63 106-11 202-11C272-11 334 19 388 78C442 137 469 201 469 272C469 369 405 442 308 442M389 310C389 287 384 255 374 213C353 130 319 73 272 42C248 26 225 18 203 18C149 18 121 65 121 122C121 180 155 288 178 324C216 383 259 413 307 413C361 413 389 367 389 310Z"></path></g><g data-mml-node="mi" data-latex="\_" transform="translate(3571,0)"><path data-c="5F" d="M0-140L333-140L333-100L0-100Z"></path></g><g data-mml-node="mi" data-latex="o" transform="translate(3904,0)"><path data-c="1D45C" d="M308 442C239 442 176 412 122 353C68 294 41 229 41 159C41 63 106-11 202-11C272-11 334 19 388 78C442 137 469 201 469 272C469 369 405 442 308 442M389 310C389 287 384 255 374 213C353 130 319 73 272 42C248 26 225 18 203 18C149 18 121 65 121 122C121 180 155 288 178 324C216 383 259 413 307 413C361 413 389 367 389 310Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(4389,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g><g data-mml-node="mi" data-latex="t" transform="translate(4840,0)"><path data-c="1D461" d="M330 419C330 428 320 433 299 433L218 433C244 537 257 591 257 595C257 616 246 626 225 626C202 626 188 613 182 587L145 433L56 433C34 433 23 432 23 411C23 400 33 395 54 395L135 395C86 200 62 97 62 84C62 28 100-11 156-11C194-11 227 6 256 41C280 70 297 98 308 125C312 136 314 142 314 145C314 154 309 159 299 159C291 159 285 154 281 143C247 60 206 19 157 19C140 19 131 33 131 60C131 75 133 91 137 107L208 395L297 395C323 395 330 397 330 419Z"></path></g><g data-mml-node="mi" data-latex="h" transform="translate(5201,0)"><path data-c="210E" d="M512 138C489 59 457 19 415 19C402 19 395 28 395 47C395 62 401 85 413 116C453 223 473 296 473 335C473 406 427 445 356 445C303 445 257 423 218 380L291 679C289 688 287 694 274 694C241 694 168 685 155 684C140 682 132 675 132 660C132 650 141 645 159 645C180 645 203 646 205 632L59 43C56 32 55 25 55 21C55 0 66-11 87-11C107-11 121-1 128 18L168 182C180 231 189 268 196 293C199 300 207 314 220 334C256 388 300 415 353 415C386 415 402 393 402 350C402 309 382 236 342 130C333 107 329 89 329 74C329 26 365-11 413-11C457-11 492 14 517 65C536 105 546 132 546 145C546 154 541 159 530 159C527 159 512 150 512 138Z"></path></g><g data-mml-node="mi" data-latex="o" transform="translate(5777,0)"><path data-c="1D45C" d="M308 442C239 442 176 412 122 353C68 294 41 229 41 159C41 63 106-11 202-11C272-11 334 19 388 78C442 137 469 201 469 272C469 369 405 442 308 442M389 310C389 287 384 255 374 213C353 130 319 73 272 42C248 26 225 18 203 18C149 18 121 65 121 122C121 180 155 288 178 324C216 383 259 413 307 413C361 413 389 367 389 310Z"></path></g></g></g></g></g></svg></mjx-container> 前后，摄像机可视区域内点集的深度值变化并不均匀。</p></li><li><p>具体来说，设可视区域内某一点</p><p>  <mjx-container class="MathJax" jax="SVG" overflow="overflow" display="true"><svg style="vertical-align: -5.317ex;" xmlns="http://www.w3.org/2000/svg" width="38.917ex" height="11.765ex" role="img" focusable="false" viewBox="0 -2850 17201.4 5200"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="  P_{mid} =  \begin{pmatrix}  x_{P} \\  y_{P} \\  z_{mid} \\  1  \end{pmatrix} , z_{mid} = \frac{zFar + zNear}{2}  "><g data-mml-node="msub" data-latex="P_{m i d}"><g data-mml-node="mi" data-latex="P"><path data-c="1D443" d="M555 683L235 683C212 683 201 682 201 660C201 649 212 644 234 644C254 644 294 647 294 631C294 629 293 623 290 613L158 82C152 60 142 47 128 42C121 40 103 39 72 39C50 39 40 37 40 16C40 5 46 0 59 0L184 3L248 2C259 2 299 0 312 0C328 0 336 8 336 24C336 34 325 39 304 39C264 39 244 43 244 52C244 52 245 55 247 68L307 312L472 312C537 312 599 332 657 371C722 414 754 467 754 530C754 629 660 683 555 683M524 644C611 644 654 614 654 554C654 498 626 423 597 397C559 363 509 346 447 346L313 346L379 610C387 644 387 644 429 644Z"></path></g><g data-mml-node="TeXAtom" transform="translate(675,-150) scale(0.707)" data-latex="{m i d}" data-mjx-texclass="ORD"><g data-mml-node="mi" data-latex="m"><path data-c="1D45A" d="M657 442C596 442 543 412 498 353C489 412 451 442 383 442C324 442 273 416 231 363C223 407 188 442 137 442C96 442 66 409 45 344C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 66 299C84 375 107 413 134 413C152 413 161 399 161 371C161 358 156 331 145 290L88 63C84 51 79 25 79 19C79-1 90-11 111-11C131-11 145-1 152 19C153 24 160 49 171 92L192 181L222 295C233 318 250 341 272 365C301 397 337 413 380 413C413 413 429 391 429 348C429 335 424 308 414 267L387 153C380 124 364 64 356 32C355 25 354 21 354 19C354-1 365-11 387-11C398-11 406-8 413-1C428 14 429 21 435 48L494 285C497 298 511 321 535 353C565 393 605 413 654 413C687 413 703 391 703 348C703 309 683 236 642 129C633 106 629 87 629 74C629 25 666-11 714-11C759-11 793 14 818 64C838 104 848 131 848 144C848 153 843 158 832 158C825 157 818 148 813 137C791 58 759 18 716 18C703 18 696 28 696 47C696 62 702 84 714 115C755 222 775 295 775 333C775 404 728 442 657 442Z"></path></g><g data-mml-node="mi" data-latex="i" transform="translate(878,0)"><path data-c="1D456" d="M284 621C284 648 271 661 244 661C216 661 188 633 188 605C188 578 202 565 229 565C257 565 284 593 284 621M259 138C237 59 205 19 164 19C151 19 144 28 144 47C144 64 173 150 232 306C240 329 244 347 244 360C244 409 210 445 161 445C118 445 84 420 59 369C39 328 29 301 29 288C29 279 34 275 45 275C58 275 60 281 64 295C87 375 118 415 158 415C171 415 178 406 178 387C178 373 175 357 168 338C145 275 121 208 101 155C86 115 78 88 78 74C78 25 114-11 162-11C205-11 239 14 264 64C283 103 293 130 293 145C293 154 288 159 277 159C274 159 259 150 259 138Z"></path></g><g data-mml-node="mi" data-latex="d" transform="translate(1223,0)"><path data-c="1D451" d="M429 632L370 389C349 426 320 445 281 445C216 445 159 412 109 345C63 283 40 218 40 151C40 63 91-11 175-11C218-11 260 12 300 59C311 21 345-11 392-11C461-11 483 71 498 145C498 154 493 159 483 159C474 159 468 152 465 138C445 59 421 19 394 19C377 19 368 33 368 60C368 75 370 91 374 107L516 679L516 683C513 690 507 694 499 694C476 694 434 690 374 683C363 682 357 674 357 660C357 650 366 645 384 645C403 645 429 646 429 632M341 376C351 355 356 341 356 332C355 328 354 323 353 316L304 122C301 111 294 99 285 87C248 42 212 19 177 19C138 19 118 49 118 108C118 132 124 168 136 216C157 301 187 359 224 390C244 407 263 415 282 415C309 415 329 402 341 376Z"></path></g></g></g><g data-mml-node="mo" data-latex="=" transform="translate(2235.3,0)"><path data-c="3D" d="M698 367L80 367C64 367 56 359 56 344C56 329 64 321 80 321L698 321C714 321 722 329 722 344C722 356 711 367 698 367M698 179L80 179C64 179 56 171 56 156C56 141 64 133 80 133L698 133C714 133 722 141 722 156C722 169 711 179 698 179Z"></path></g><g data-mml-node="mrow" data-latex="{pmatrix}" transform="translate(3291,0)"><g data-mml-node="mo"><path data-c="239B" d="M813 1450C820 1455 823 1462 823 1470C823 1487 815 1495 798 1495C793 1495 788 1493 784 1490C697 1423 614 1324 536 1192C399 956 277 603 277 253L277 0L385 0L385 253C385 407 403 562 438 719C500 999 630 1313 813 1450Z" transform="translate(0,1355)"></path><path data-c="239D" d="M798 0C815 0 823 8 823 25C823 34 819 40 812 44C731 106 658 202 592 334C474 569 385 903 385 1242L385 1495L277 1495L277 1242C277 914 388 575 512 345C594 193 685 80 784 5C788 2 793 0 798 0Z" transform="translate(0,-2350)"></path><svg width="875" height="2350" y="-925" x="0" viewBox="0 587.5 875 2350"><path data-c="239C" d="M277 0L385 0L385 498L277 498Z" transform="scale(1,7.078)"></path></svg></g><g data-mml-node="mtable" transform="translate(875,0)"><g data-mml-node="mtr" transform="translate(0,2100)"><g data-mml-node="mtd" transform="translate(296.2,0)"><g data-mml-node="msub" data-latex="x_{P}"><g data-mml-node="mi" data-latex="x"><path data-c="1D465" d="M527 373C527 419 482 442 432 442C389 442 355 419 329 373C308 419 273 442 222 442C173 442 133 419 101 374C74 335 60 306 60 287C60 278 65 273 75 273C84 273 90 278 92 287C111 345 153 413 220 413C253 413 269 392 269 351C269 330 251 252 216 118C199 51 169 18 126 18C112 18 99 21 88 26C114 36 127 54 127 80C127 106 114 119 87 119C54 119 29 91 29 58C29 12 76-11 125-11C167-11 201 12 228 58C247 12 283-11 335-11C383-11 423 12 455 57C482 96 496 125 496 144C496 153 491 158 481 158C472 158 467 153 464 144C447 87 402 18 337 18C304 18 287 38 287 79C287 92 292 120 303 165L337 300C356 375 387 413 431 413C445 413 458 410 469 405C442 396 429 378 429 351C429 325 443 312 470 312C502 312 527 341 527 373Z"></path></g><g data-mml-node="TeXAtom" transform="translate(605,-150) scale(0.707)" data-latex="{P}" data-mjx-texclass="ORD"><g data-mml-node="mi" data-latex="P"><path data-c="1D443" d="M555 683L235 683C212 683 201 682 201 660C201 649 212 644 234 644C254 644 294 647 294 631C294 629 293 623 290 613L158 82C152 60 142 47 128 42C121 40 103 39 72 39C50 39 40 37 40 16C40 5 46 0 59 0L184 3L248 2C259 2 299 0 312 0C328 0 336 8 336 24C336 34 325 39 304 39C264 39 244 43 244 52C244 52 245 55 247 68L307 312L472 312C537 312 599 332 657 371C722 414 754 467 754 530C754 629 660 683 555 683M524 644C611 644 654 614 654 554C654 498 626 423 597 397C559 363 509 346 447 346L313 346L379 610C387 644 387 644 429 644Z"></path></g></g></g></g></g><g data-mml-node="mtr" transform="translate(0,700)"><g data-mml-node="mtd" transform="translate(337.2,0)"><g data-mml-node="msub" data-latex="y_{P}"><g data-mml-node="mi" data-latex="y"><path data-c="1D466" d="M163 442C118 442 83 417 58 367C39 328 29 301 29 286C29 277 34 272 45 272C59 272 60 278 64 293C87 372 119 412 160 412C173 412 180 403 180 385C180 369 175 346 164 317C126 214 107 145 107 108C107 32 154-13 231-13C264-13 295-1 323 23C288-109 233-175 158-175C124-175 101-164 89-142C129-140 149-121 149-85C149-60 136-47 109-47C72-47 50-78 50-115C50-170 100-205 158-205C273-205 367-99 392-1L486 377C489 388 490 396 490 401C490 421 479 431 458 431C442 431 429 423 420 408C414 387 409 369 406 354L342 97C332 61 279 16 234 16C196 16 177 41 177 92C177 134 194 198 227 284C240 319 247 343 247 357C247 406 212 442 163 442Z"></path></g><g data-mml-node="TeXAtom" transform="translate(523,-150) scale(0.707)" data-latex="{P}" data-mjx-texclass="ORD"><g data-mml-node="mi" data-latex="P"><path data-c="1D443" d="M555 683L235 683C212 683 201 682 201 660C201 649 212 644 234 644C254 644 294 647 294 631C294 629 293 623 290 613L158 82C152 60 142 47 128 42C121 40 103 39 72 39C50 39 40 37 40 16C40 5 46 0 59 0L184 3L248 2C259 2 299 0 312 0C328 0 336 8 336 24C336 34 325 39 304 39C264 39 244 43 244 52C244 52 245 55 247 68L307 312L472 312C537 312 599 332 657 371C722 414 754 467 754 530C754 629 660 683 555 683M524 644C611 644 654 614 654 554C654 498 626 423 597 397C559 363 509 346 447 346L313 346L379 610C387 644 387 644 429 644Z"></path></g></g></g></g></g><g data-mml-node="mtr" transform="translate(0,-700)"><g data-mml-node="mtd"><g data-mml-node="msub" data-latex="z_{m i d}"><g data-mml-node="mi" data-latex="z"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="TeXAtom" transform="translate(498,-150) scale(0.707)" data-latex="{m i d}" data-mjx-texclass="ORD"><g data-mml-node="mi" data-latex="m"><path data-c="1D45A" d="M657 442C596 442 543 412 498 353C489 412 451 442 383 442C324 442 273 416 231 363C223 407 188 442 137 442C96 442 66 409 45 344C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 66 299C84 375 107 413 134 413C152 413 161 399 161 371C161 358 156 331 145 290L88 63C84 51 79 25 79 19C79-1 90-11 111-11C131-11 145-1 152 19C153 24 160 49 171 92L192 181L222 295C233 318 250 341 272 365C301 397 337 413 380 413C413 413 429 391 429 348C429 335 424 308 414 267L387 153C380 124 364 64 356 32C355 25 354 21 354 19C354-1 365-11 387-11C398-11 406-8 413-1C428 14 429 21 435 48L494 285C497 298 511 321 535 353C565 393 605 413 654 413C687 413 703 391 703 348C703 309 683 236 642 129C633 106 629 87 629 74C629 25 666-11 714-11C759-11 793 14 818 64C838 104 848 131 848 144C848 153 843 158 832 158C825 157 818 148 813 137C791 58 759 18 716 18C703 18 696 28 696 47C696 62 702 84 714 115C755 222 775 295 775 333C775 404 728 442 657 442Z"></path></g><g data-mml-node="mi" data-latex="i" transform="translate(878,0)"><path data-c="1D456" d="M284 621C284 648 271 661 244 661C216 661 188 633 188 605C188 578 202 565 229 565C257 565 284 593 284 621M259 138C237 59 205 19 164 19C151 19 144 28 144 47C144 64 173 150 232 306C240 329 244 347 244 360C244 409 210 445 161 445C118 445 84 420 59 369C39 328 29 301 29 288C29 279 34 275 45 275C58 275 60 281 64 295C87 375 118 415 158 415C171 415 178 406 178 387C178 373 175 357 168 338C145 275 121 208 101 155C86 115 78 88 78 74C78 25 114-11 162-11C205-11 239 14 264 64C283 103 293 130 293 145C293 154 288 159 277 159C274 159 259 150 259 138Z"></path></g><g data-mml-node="mi" data-latex="d" transform="translate(1223,0)"><path data-c="1D451" d="M429 632L370 389C349 426 320 445 281 445C216 445 159 412 109 345C63 283 40 218 40 151C40 63 91-11 175-11C218-11 260 12 300 59C311 21 345-11 392-11C461-11 483 71 498 145C498 154 493 159 483 159C474 159 468 152 465 138C445 59 421 19 394 19C377 19 368 33 368 60C368 75 370 91 374 107L516 679L516 683C513 690 507 694 499 694C476 694 434 690 374 683C363 682 357 674 357 660C357 650 366 645 384 645C403 645 429 646 429 632M341 376C351 355 356 341 356 332C355 328 354 323 353 316L304 122C301 111 294 99 285 87C248 42 212 19 177 19C138 19 118 49 118 108C118 132 124 168 136 216C157 301 187 359 224 390C244 407 263 415 282 415C309 415 329 402 341 376Z"></path></g></g></g></g></g><g data-mml-node="mtr" transform="translate(0,-2100)"><g data-mml-node="mtd" transform="translate(640.2,0)"><g data-mml-node="mn" data-latex="1"><path data-c="31" d="M269 666C228 624 168 603 89 603L89 564C141 564 184 572 217 588L217 82C217 64 213 52 204 47C195 42 170 39 130 39L95 39L95 0C120 2 174 3 257 3C340 3 394 2 419 0L419 39L384 39C343 39 318 42 310 47C302 52 297 64 297 82L297 636C297 660 295 666 269 666Z"></path></g></g></g></g><g data-mml-node="mo" transform="translate(2655.5,0)"><path data-c="239E" d="M490 0L598 0L598 253C598 581 487 920 363 1150C281 1301 190 1415 91 1490C87 1493 82 1495 77 1495C60 1495 52 1487 52 1470C52 1462 55 1455 62 1450C143 1389 216 1292 283 1160C402 924 490 593 490 253Z" transform="translate(0,1355)"></path><path data-c="23A0" d="M598 1242L598 1495L490 1495L490 1242C490 1088 472 933 437 776C375 494 246 184 63 44C56 40 52 34 52 25C52 8 60 0 77 0C82 0 87 2 91 5C178 71 261 170 339 303C477 539 598 892 598 1242Z" transform="translate(0,-2350)"></path><svg width="875" height="2350" y="-925" x="0" viewBox="0 587.5 875 2350"><path data-c="239F" d="M490 0L598 0L598 498L490 498Z" transform="scale(1,7.078)"></path></svg></g></g><g data-mml-node="mo" data-latex="," transform="translate(6988.2,0)"><path data-c="2C" d="M139 106C107 106 86 82 86 50C86 20 109-5 139-5C153-5 165-1 174 8L175 0C175-63 154-117 112-160C105-168 101-174 101-178C101-188 105-193 114-193C123-193 135-181 152-158C186-110 203-57 203 0C203 53 185 106 139 106Z"></path></g><g data-mml-node="msub" data-latex="z_{m i d}" transform="translate(7432.9,0)"><g data-mml-node="mi" data-latex="z"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="TeXAtom" transform="translate(498,-150) scale(0.707)" data-latex="{m i d}" data-mjx-texclass="ORD"><g data-mml-node="mi" data-latex="m"><path data-c="1D45A" d="M657 442C596 442 543 412 498 353C489 412 451 442 383 442C324 442 273 416 231 363C223 407 188 442 137 442C96 442 66 409 45 344C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 66 299C84 375 107 413 134 413C152 413 161 399 161 371C161 358 156 331 145 290L88 63C84 51 79 25 79 19C79-1 90-11 111-11C131-11 145-1 152 19C153 24 160 49 171 92L192 181L222 295C233 318 250 341 272 365C301 397 337 413 380 413C413 413 429 391 429 348C429 335 424 308 414 267L387 153C380 124 364 64 356 32C355 25 354 21 354 19C354-1 365-11 387-11C398-11 406-8 413-1C428 14 429 21 435 48L494 285C497 298 511 321 535 353C565 393 605 413 654 413C687 413 703 391 703 348C703 309 683 236 642 129C633 106 629 87 629 74C629 25 666-11 714-11C759-11 793 14 818 64C838 104 848 131 848 144C848 153 843 158 832 158C825 157 818 148 813 137C791 58 759 18 716 18C703 18 696 28 696 47C696 62 702 84 714 115C755 222 775 295 775 333C775 404 728 442 657 442Z"></path></g><g data-mml-node="mi" data-latex="i" transform="translate(878,0)"><path data-c="1D456" d="M284 621C284 648 271 661 244 661C216 661 188 633 188 605C188 578 202 565 229 565C257 565 284 593 284 621M259 138C237 59 205 19 164 19C151 19 144 28 144 47C144 64 173 150 232 306C240 329 244 347 244 360C244 409 210 445 161 445C118 445 84 420 59 369C39 328 29 301 29 288C29 279 34 275 45 275C58 275 60 281 64 295C87 375 118 415 158 415C171 415 178 406 178 387C178 373 175 357 168 338C145 275 121 208 101 155C86 115 78 88 78 74C78 25 114-11 162-11C205-11 239 14 264 64C283 103 293 130 293 145C293 154 288 159 277 159C274 159 259 150 259 138Z"></path></g><g data-mml-node="mi" data-latex="d" transform="translate(1223,0)"><path data-c="1D451" d="M429 632L370 389C349 426 320 445 281 445C216 445 159 412 109 345C63 283 40 218 40 151C40 63 91-11 175-11C218-11 260 12 300 59C311 21 345-11 392-11C461-11 483 71 498 145C498 154 493 159 483 159C474 159 468 152 465 138C445 59 421 19 394 19C377 19 368 33 368 60C368 75 370 91 374 107L516 679L516 683C513 690 507 694 499 694C476 694 434 690 374 683C363 682 357 674 357 660C357 650 366 645 384 645C403 645 429 646 429 632M341 376C351 355 356 341 356 332C355 328 354 323 353 316L304 122C301 111 294 99 285 87C248 42 212 19 177 19C138 19 118 49 118 108C118 132 124 168 136 216C157 301 187 359 224 390C244 407 263 415 282 415C309 415 329 402 341 376Z"></path></g></g></g><g data-mml-node="mo" data-latex="=" transform="translate(9491.1,0)"><path data-c="3D" d="M698 367L80 367C64 367 56 359 56 344C56 329 64 321 80 321L698 321C714 321 722 329 722 344C722 356 711 367 698 367M698 179L80 179C64 179 56 171 56 156C56 141 64 133 80 133L698 133C714 133 722 141 722 156C722 169 711 179 698 179Z"></path></g><g data-mml-node="mfrac" data-latex="\frac{zFar + zNear}{2}" transform="translate(10546.9,0)"><g data-mml-node="mrow" data-latex="zFar + zNear" transform="translate(220,676)"><g data-mml-node="mi" data-latex="z"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="mi" data-latex="F" transform="translate(467,0)"><path data-c="1D439" d="M199 656C199 646 210 641 231 641C271 641 291 637 291 628C291 625 289 618 286 605L156 82C150 60 140 47 126 42C119 40 101 39 70 39C48 39 38 37 38 16C38 5 44 0 57 0L187 3L335 0C351 0 359 8 359 23C359 40 348 39 322 39C278 39 253 41 247 46C244 47 243 51 243 56L307 321L400 321C446 321 478 319 478 281C478 268 476 252 471 233C470 230 469 226 468 222C468 211 473 206 484 206C489 207 496 214 503 229L557 444C559 452 560 458 560 461C557 470 551 475 544 475C536 475 530 467 526 452C516 414 502 390 486 378C470 366 442 360 402 360L317 360L379 606C387 640 387 641 429 641L559 641C656 641 700 626 700 537C700 517 699 499 697 484C696 473 695 467 695 466C695 455 700 450 710 450C720 450 726 459 728 478L748 649C751 677 744 680 717 680L233 680C210 680 199 679 199 656Z"></path></g><g data-mml-node="mi" data-latex="a" transform="translate(1218,0)"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(1747,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g><g data-mml-node="mo" data-latex="+" transform="translate(2420.2,0)"><path data-c="2B" d="M698 274L413 274L413 559C413 575 405 583 389 583C373 583 365 575 365 559L365 274L80 274C64 274 56 266 56 250C56 234 64 226 80 226L365 226L365-59C365-75 373-83 389-83C405-83 413-75 413-59L413 226L698 226C714 226 722 234 722 250C722 263 711 274 698 274Z"></path></g><g data-mml-node="mi" data-latex="z" transform="translate(3420.4,0)"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="mi" data-latex="N" transform="translate(3887.4,0)"><path data-c="1D441" d="M864 683C845 683 783 680 764 680C745 680 682 683 663 683C648 683 641 675 641 659C641 650 648 645 663 644C705 644 726 631 726 605C726 599 725 592 724 585L616 157L401 662C393 681 391 683 366 683L233 683C209 683 200 681 200 659C200 649 211 644 232 644C274 644 295 643 296 640L163 110C154 71 131 49 95 42C69 39 39 43 39 15C39 5 45 0 56 0C74 0 136 3 155 3C174 3 238 0 257 0C272 0 279 8 279 24C279 33 271 38 255 39C214 40 194 53 194 78C194 83 195 90 197 100L326 611L576 21C582 7 590 0 599 0C608 0 614 8 618 24L757 574C770 625 798 643 860 644C874 645 881 653 881 669C878 678 877 683 864 683Z"></path></g><g data-mml-node="mi" data-latex="e" transform="translate(4768.4,0)"><path data-c="1D452" d="M124 129C124 153 129 186 139 227L188 227C253 227 303 235 339 250C372 264 394 284 405 309C412 326 415 342 415 355C415 410 363 442 307 442C268 442 229 432 190 412C113 372 46 281 46 171C46 69 105-11 204-11C257-11 304 2 345 27C379 48 404 69 420 90C427 99 430 106 430 109C430 120 425 126 414 126C409 126 404 122 398 114C365 70 324 42 277 30C246 22 223 18 206 18C149 18 124 72 124 129M375 355C375 289 311 256 182 256L147 256C166 322 194 366 232 387C262 404 287 413 307 413C343 413 375 391 375 355Z"></path></g><g data-mml-node="mi" data-latex="a" transform="translate(5234.4,0)"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(5763.4,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g></g><g data-mml-node="mn" data-latex="2" transform="translate(3077.2,-686)"><path data-c="32" d="M237 666C186 666 143 648 106 612C69 576 50 534 50 483C50 449 75 424 106 424C136 424 161 450 161 480C161 513 137 536 105 536C102 536 100 536 98 535C117 584 161 627 224 627C306 627 352 556 352 470C352 403 318 331 250 255L62 43C49 28 50 29 50 0L421 0L450 180L417 180C409 129 402 100 396 91C391 86 361 84 306 84L139 84L236 179C304 243 390 312 419 365C439 400 449 435 449 470C449 588 357 666 237 666Z"></path></g><rect width="6414.4" height="60" x="120" y="220"></rect></g></g></g></svg></mjx-container></p></li><li><p>经由 <mjx-container class="MathJax" jax="SVG" overflow="overflow"><svg style="vertical-align: -0.65ex;" xmlns="http://www.w3.org/2000/svg" width="12.4ex" height="2.195ex" role="img" focusable="false" viewBox="0 -683 5480.9 970.2"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="M_{persp\_to\_ortho}"><g data-mml-node="msub" data-latex="M_{persp\_to\_ortho}"><g data-mml-node="mi" data-latex="M"><path data-c="1D440" d="M594 16C594 5 600 0 613 0L736 3C759 4 840 0 859 0C874 0 882 8 882 24C882 34 872 39 851 39C810 39 790 43 790 52C790 55 792 62 795 75L927 602C932 623 942 636 955 641C961 643 979 644 1008 644C1033 644 1044 645 1044 668C1044 678 1034 683 1013 683L882 683C853 683 853 681 840 662L484 108L408 657C404 682 402 683 373 683L237 683C215 683 204 682 204 660C204 649 215 644 236 644C256 644 297 647 297 631C297 629 296 623 293 613L167 110C158 72 135 49 100 42C75 39 42 43 42 16C42 5 48 0 60 0C78 0 141 3 159 3C178 3 242 0 261 0C276 0 283 8 283 24C283 33 276 38 261 39C219 39 198 52 198 78C198 82 199 89 202 100L332 621L415 26C418 9 424 0 434 0C442 0 450 7 459 20L848 627L712 82C706 60 696 47 681 42C675 40 656 39 625 39C604 39 594 37 594 16Z"></path></g><g data-mml-node="TeXAtom" transform="translate(1003,-150) scale(0.707)" data-latex="{p e r s p\_t o\_o r t h o}" data-mjx-texclass="ORD"><g data-mml-node="mi" data-latex="p"><path data-c="1D45D" d="M355 442C311 442 269 419 228 373C217 419 186 442 137 442C96 442 66 409 45 344C35 311 30 292 30 286C30 277 35 272 46 272C51 272 54 273 57 275C62 284 65 291 66 298C84 374 107 412 134 412C152 412 161 398 161 371C161 356 159 339 154 321L44-118C35-151 34-155-5-155C-23-155-32-163-32-178C-32-189-26-194-15-194C0-194 52-191 67-191C86-191 146-194 165-194C180-194 187-186 187-170C187-160 178-155 159-155C141-155 114-156 114-144C114-131 155 26 159 43C179 6 209-13 249-13C314-13 371 20 421 87C467 148 490 213 490 280C490 367 438 442 355 442M352 412C391 412 411 382 411 323C411 296 405 260 394 215C371 128 342 71 307 42C286 25 267 16 248 16C219 16 199 29 188 56C179 77 174 92 174 100L225 309C230 331 248 354 276 377C304 400 329 412 352 412Z"></path></g><g data-mml-node="mi" data-latex="e" transform="translate(503,0)"><path data-c="1D452" d="M124 129C124 153 129 186 139 227L188 227C253 227 303 235 339 250C372 264 394 284 405 309C412 326 415 342 415 355C415 410 363 442 307 442C268 442 229 432 190 412C113 372 46 281 46 171C46 69 105-11 204-11C257-11 304 2 345 27C379 48 404 69 420 90C427 99 430 106 430 109C430 120 425 126 414 126C409 126 404 122 398 114C365 70 324 42 277 30C246 22 223 18 206 18C149 18 124 72 124 129M375 355C375 289 311 256 182 256L147 256C166 322 194 366 232 387C262 404 287 413 307 413C343 413 375 391 375 355Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(969,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g><g data-mml-node="mi" data-latex="s" transform="translate(1420,0)"><path data-c="1D460" d="M420 354C420 411 362 442 300 442C237 442 192 423 165 385C142 352 130 322 130 295C130 242 165 208 234 193C263 188 285 181 302 173C323 164 333 147 333 123C333 105 325 85 308 62C287 33 250 18 197 18C143 18 108 33 92 62C124 61 151 87 151 119C151 144 138 157 111 157C75 157 52 124 52 88C52 22 124-11 196-11C271-11 325 11 357 56C384 93 397 126 397 156C397 199 376 231 335 252C304 263 280 270 265 273C230 282 194 285 194 328C194 381 244 413 300 413C342 413 369 400 382 375C360 371 337 352 337 327C337 306 348 295 371 295C402 295 420 323 420 354Z"></path></g><g data-mml-node="mi" data-latex="p" transform="translate(1889,0)"><path data-c="1D45D" d="M355 442C311 442 269 419 228 373C217 419 186 442 137 442C96 442 66 409 45 344C35 311 30 292 30 286C30 277 35 272 46 272C51 272 54 273 57 275C62 284 65 291 66 298C84 374 107 412 134 412C152 412 161 398 161 371C161 356 159 339 154 321L44-118C35-151 34-155-5-155C-23-155-32-163-32-178C-32-189-26-194-15-194C0-194 52-191 67-191C86-191 146-194 165-194C180-194 187-186 187-170C187-160 178-155 159-155C141-155 114-156 114-144C114-131 155 26 159 43C179 6 209-13 249-13C314-13 371 20 421 87C467 148 490 213 490 280C490 367 438 442 355 442M352 412C391 412 411 382 411 323C411 296 405 260 394 215C371 128 342 71 307 42C286 25 267 16 248 16C219 16 199 29 188 56C179 77 174 92 174 100L225 309C230 331 248 354 276 377C304 400 329 412 352 412Z"></path></g><g data-mml-node="mi" data-latex="\_" transform="translate(2392,0)"><path data-c="5F" d="M0-140L333-140L333-100L0-100Z"></path></g><g data-mml-node="mi" data-latex="t" transform="translate(2725,0)"><path data-c="1D461" d="M330 419C330 428 320 433 299 433L218 433C244 537 257 591 257 595C257 616 246 626 225 626C202 626 188 613 182 587L145 433L56 433C34 433 23 432 23 411C23 400 33 395 54 395L135 395C86 200 62 97 62 84C62 28 100-11 156-11C194-11 227 6 256 41C280 70 297 98 308 125C312 136 314 142 314 145C314 154 309 159 299 159C291 159 285 154 281 143C247 60 206 19 157 19C140 19 131 33 131 60C131 75 133 91 137 107L208 395L297 395C323 395 330 397 330 419Z"></path></g><g data-mml-node="mi" data-latex="o" transform="translate(3086,0)"><path data-c="1D45C" d="M308 442C239 442 176 412 122 353C68 294 41 229 41 159C41 63 106-11 202-11C272-11 334 19 388 78C442 137 469 201 469 272C469 369 405 442 308 442M389 310C389 287 384 255 374 213C353 130 319 73 272 42C248 26 225 18 203 18C149 18 121 65 121 122C121 180 155 288 178 324C216 383 259 413 307 413C361 413 389 367 389 310Z"></path></g><g data-mml-node="mi" data-latex="\_" transform="translate(3571,0)"><path data-c="5F" d="M0-140L333-140L333-100L0-100Z"></path></g><g data-mml-node="mi" data-latex="o" transform="translate(3904,0)"><path data-c="1D45C" d="M308 442C239 442 176 412 122 353C68 294 41 229 41 159C41 63 106-11 202-11C272-11 334 19 388 78C442 137 469 201 469 272C469 369 405 442 308 442M389 310C389 287 384 255 374 213C353 130 319 73 272 42C248 26 225 18 203 18C149 18 121 65 121 122C121 180 155 288 178 324C216 383 259 413 307 413C361 413 389 367 389 310Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(4389,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g><g data-mml-node="mi" data-latex="t" transform="translate(4840,0)"><path data-c="1D461" d="M330 419C330 428 320 433 299 433L218 433C244 537 257 591 257 595C257 616 246 626 225 626C202 626 188 613 182 587L145 433L56 433C34 433 23 432 23 411C23 400 33 395 54 395L135 395C86 200 62 97 62 84C62 28 100-11 156-11C194-11 227 6 256 41C280 70 297 98 308 125C312 136 314 142 314 145C314 154 309 159 299 159C291 159 285 154 281 143C247 60 206 19 157 19C140 19 131 33 131 60C131 75 133 91 137 107L208 395L297 395C323 395 330 397 330 419Z"></path></g><g data-mml-node="mi" data-latex="h" transform="translate(5201,0)"><path data-c="210E" d="M512 138C489 59 457 19 415 19C402 19 395 28 395 47C395 62 401 85 413 116C453 223 473 296 473 335C473 406 427 445 356 445C303 445 257 423 218 380L291 679C289 688 287 694 274 694C241 694 168 685 155 684C140 682 132 675 132 660C132 650 141 645 159 645C180 645 203 646 205 632L59 43C56 32 55 25 55 21C55 0 66-11 87-11C107-11 121-1 128 18L168 182C180 231 189 268 196 293C199 300 207 314 220 334C256 388 300 415 353 415C386 415 402 393 402 350C402 309 382 236 342 130C333 107 329 89 329 74C329 26 365-11 413-11C457-11 492 14 517 65C536 105 546 132 546 145C546 154 541 159 530 159C527 159 512 150 512 138Z"></path></g><g data-mml-node="mi" data-latex="o" transform="translate(5777,0)"><path data-c="1D45C" d="M308 442C239 442 176 412 122 353C68 294 41 229 41 159C41 63 106-11 202-11C272-11 334 19 388 78C442 137 469 201 469 272C469 369 405 442 308 442M389 310C389 287 384 255 374 213C353 130 319 73 272 42C248 26 225 18 203 18C149 18 121 65 121 122C121 180 155 288 178 324C216 383 259 413 307 413C361 413 389 367 389 310Z"></path></g></g></g></g></g></svg></mjx-container> 变换后：</p><p>  <mjx-container class="MathJax" jax="SVG" overflow="overflow" display="true"><svg style="vertical-align: -5.317ex;" xmlns="http://www.w3.org/2000/svg" width="68.428ex" height="11.765ex" role="img" focusable="false" viewBox="0 -2850 30245.3 5200"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="  P_{mid}’ = M_{persp\_to\_ortho} \cdot P_{mid} =  \begin{pmatrix}  x_{P} \cdot zNear \\  y_{P} \cdot zNear \\  z_{mid}(zNear + zFar) - zNear \cdot zFar \\  z_{mid}  \end{pmatrix}  "><g data-mml-node="msubsup" data-latex="P_{m i d}"><g data-mml-node="mi" data-latex="P"><path data-c="1D443" d="M555 683L235 683C212 683 201 682 201 660C201 649 212 644 234 644C254 644 294 647 294 631C294 629 293 623 290 613L158 82C152 60 142 47 128 42C121 40 103 39 72 39C50 39 40 37 40 16C40 5 46 0 59 0L184 3L248 2C259 2 299 0 312 0C328 0 336 8 336 24C336 34 325 39 304 39C264 39 244 43 244 52C244 52 245 55 247 68L307 312L472 312C537 312 599 332 657 371C722 414 754 467 754 530C754 629 660 683 555 683M524 644C611 644 654 614 654 554C654 498 626 423 597 397C559 363 509 346 447 346L313 346L379 610C387 644 387 644 429 644Z"></path></g><g data-mml-node="mo" transform="translate(842.6,413) scale(0.707)" data-latex="’"><path data-c="2032" d="M284 549C259 549 242 539 233 518L65 96L110 96L332 463C337 472 340 482 340 493C340 523 314 549 284 549Z"></path></g><g data-mml-node="TeXAtom" transform="translate(675,-247) scale(0.707)" data-latex="{m i d}" data-mjx-texclass="ORD"><g data-mml-node="mi" data-latex="m"><path data-c="1D45A" d="M657 442C596 442 543 412 498 353C489 412 451 442 383 442C324 442 273 416 231 363C223 407 188 442 137 442C96 442 66 409 45 344C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 66 299C84 375 107 413 134 413C152 413 161 399 161 371C161 358 156 331 145 290L88 63C84 51 79 25 79 19C79-1 90-11 111-11C131-11 145-1 152 19C153 24 160 49 171 92L192 181L222 295C233 318 250 341 272 365C301 397 337 413 380 413C413 413 429 391 429 348C429 335 424 308 414 267L387 153C380 124 364 64 356 32C355 25 354 21 354 19C354-1 365-11 387-11C398-11 406-8 413-1C428 14 429 21 435 48L494 285C497 298 511 321 535 353C565 393 605 413 654 413C687 413 703 391 703 348C703 309 683 236 642 129C633 106 629 87 629 74C629 25 666-11 714-11C759-11 793 14 818 64C838 104 848 131 848 144C848 153 843 158 832 158C825 157 818 148 813 137C791 58 759 18 716 18C703 18 696 28 696 47C696 62 702 84 714 115C755 222 775 295 775 333C775 404 728 442 657 442Z"></path></g><g data-mml-node="mi" data-latex="i" transform="translate(878,0)"><path data-c="1D456" d="M284 621C284 648 271 661 244 661C216 661 188 633 188 605C188 578 202 565 229 565C257 565 284 593 284 621M259 138C237 59 205 19 164 19C151 19 144 28 144 47C144 64 173 150 232 306C240 329 244 347 244 360C244 409 210 445 161 445C118 445 84 420 59 369C39 328 29 301 29 288C29 279 34 275 45 275C58 275 60 281 64 295C87 375 118 415 158 415C171 415 178 406 178 387C178 373 175 357 168 338C145 275 121 208 101 155C86 115 78 88 78 74C78 25 114-11 162-11C205-11 239 14 264 64C283 103 293 130 293 145C293 154 288 159 277 159C274 159 259 150 259 138Z"></path></g><g data-mml-node="mi" data-latex="d" transform="translate(1223,0)"><path data-c="1D451" d="M429 632L370 389C349 426 320 445 281 445C216 445 159 412 109 345C63 283 40 218 40 151C40 63 91-11 175-11C218-11 260 12 300 59C311 21 345-11 392-11C461-11 483 71 498 145C498 154 493 159 483 159C474 159 468 152 465 138C445 59 421 19 394 19C377 19 368 33 368 60C368 75 370 91 374 107L516 679L516 683C513 690 507 694 499 694C476 694 434 690 374 683C363 682 357 674 357 660C357 650 366 645 384 645C403 645 429 646 429 632M341 376C351 355 356 341 356 332C355 328 354 323 353 316L304 122C301 111 294 99 285 87C248 42 212 19 177 19C138 19 118 49 118 108C118 132 124 168 136 216C157 301 187 359 224 390C244 407 263 415 282 415C309 415 329 402 341 376Z"></path></g></g></g><g data-mml-node="mo" data-latex="=" transform="translate(2235.3,0)"><path data-c="3D" d="M698 367L80 367C64 367 56 359 56 344C56 329 64 321 80 321L698 321C714 321 722 329 722 344C722 356 711 367 698 367M698 179L80 179C64 179 56 171 56 156C56 141 64 133 80 133L698 133C714 133 722 141 722 156C722 169 711 179 698 179Z"></path></g><g data-mml-node="msub" data-latex="M_{p e r s p\_t o\_o r t h o}" transform="translate(3291,0)"><g data-mml-node="mi" data-latex="M"><path data-c="1D440" d="M594 16C594 5 600 0 613 0L736 3C759 4 840 0 859 0C874 0 882 8 882 24C882 34 872 39 851 39C810 39 790 43 790 52C790 55 792 62 795 75L927 602C932 623 942 636 955 641C961 643 979 644 1008 644C1033 644 1044 645 1044 668C1044 678 1034 683 1013 683L882 683C853 683 853 681 840 662L484 108L408 657C404 682 402 683 373 683L237 683C215 683 204 682 204 660C204 649 215 644 236 644C256 644 297 647 297 631C297 629 296 623 293 613L167 110C158 72 135 49 100 42C75 39 42 43 42 16C42 5 48 0 60 0C78 0 141 3 159 3C178 3 242 0 261 0C276 0 283 8 283 24C283 33 276 38 261 39C219 39 198 52 198 78C198 82 199 89 202 100L332 621L415 26C418 9 424 0 434 0C442 0 450 7 459 20L848 627L712 82C706 60 696 47 681 42C675 40 656 39 625 39C604 39 594 37 594 16Z"></path></g><g data-mml-node="TeXAtom" transform="translate(1003,-150) scale(0.707)" data-latex="{p e r s p\_t o\_o r t h o}" data-mjx-texclass="ORD"><g data-mml-node="mi" data-latex="p"><path data-c="1D45D" d="M355 442C311 442 269 419 228 373C217 419 186 442 137 442C96 442 66 409 45 344C35 311 30 292 30 286C30 277 35 272 46 272C51 272 54 273 57 275C62 284 65 291 66 298C84 374 107 412 134 412C152 412 161 398 161 371C161 356 159 339 154 321L44-118C35-151 34-155-5-155C-23-155-32-163-32-178C-32-189-26-194-15-194C0-194 52-191 67-191C86-191 146-194 165-194C180-194 187-186 187-170C187-160 178-155 159-155C141-155 114-156 114-144C114-131 155 26 159 43C179 6 209-13 249-13C314-13 371 20 421 87C467 148 490 213 490 280C490 367 438 442 355 442M352 412C391 412 411 382 411 323C411 296 405 260 394 215C371 128 342 71 307 42C286 25 267 16 248 16C219 16 199 29 188 56C179 77 174 92 174 100L225 309C230 331 248 354 276 377C304 400 329 412 352 412Z"></path></g><g data-mml-node="mi" data-latex="e" transform="translate(503,0)"><path data-c="1D452" d="M124 129C124 153 129 186 139 227L188 227C253 227 303 235 339 250C372 264 394 284 405 309C412 326 415 342 415 355C415 410 363 442 307 442C268 442 229 432 190 412C113 372 46 281 46 171C46 69 105-11 204-11C257-11 304 2 345 27C379 48 404 69 420 90C427 99 430 106 430 109C430 120 425 126 414 126C409 126 404 122 398 114C365 70 324 42 277 30C246 22 223 18 206 18C149 18 124 72 124 129M375 355C375 289 311 256 182 256L147 256C166 322 194 366 232 387C262 404 287 413 307 413C343 413 375 391 375 355Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(969,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g><g data-mml-node="mi" data-latex="s" transform="translate(1420,0)"><path data-c="1D460" d="M420 354C420 411 362 442 300 442C237 442 192 423 165 385C142 352 130 322 130 295C130 242 165 208 234 193C263 188 285 181 302 173C323 164 333 147 333 123C333 105 325 85 308 62C287 33 250 18 197 18C143 18 108 33 92 62C124 61 151 87 151 119C151 144 138 157 111 157C75 157 52 124 52 88C52 22 124-11 196-11C271-11 325 11 357 56C384 93 397 126 397 156C397 199 376 231 335 252C304 263 280 270 265 273C230 282 194 285 194 328C194 381 244 413 300 413C342 413 369 400 382 375C360 371 337 352 337 327C337 306 348 295 371 295C402 295 420 323 420 354Z"></path></g><g data-mml-node="mi" data-latex="p" transform="translate(1889,0)"><path data-c="1D45D" d="M355 442C311 442 269 419 228 373C217 419 186 442 137 442C96 442 66 409 45 344C35 311 30 292 30 286C30 277 35 272 46 272C51 272 54 273 57 275C62 284 65 291 66 298C84 374 107 412 134 412C152 412 161 398 161 371C161 356 159 339 154 321L44-118C35-151 34-155-5-155C-23-155-32-163-32-178C-32-189-26-194-15-194C0-194 52-191 67-191C86-191 146-194 165-194C180-194 187-186 187-170C187-160 178-155 159-155C141-155 114-156 114-144C114-131 155 26 159 43C179 6 209-13 249-13C314-13 371 20 421 87C467 148 490 213 490 280C490 367 438 442 355 442M352 412C391 412 411 382 411 323C411 296 405 260 394 215C371 128 342 71 307 42C286 25 267 16 248 16C219 16 199 29 188 56C179 77 174 92 174 100L225 309C230 331 248 354 276 377C304 400 329 412 352 412Z"></path></g><g data-mml-node="mi" data-latex="\_" transform="translate(2392,0)"><path data-c="5F" d="M0-140L333-140L333-100L0-100Z"></path></g><g data-mml-node="mi" data-latex="t" transform="translate(2725,0)"><path data-c="1D461" d="M330 419C330 428 320 433 299 433L218 433C244 537 257 591 257 595C257 616 246 626 225 626C202 626 188 613 182 587L145 433L56 433C34 433 23 432 23 411C23 400 33 395 54 395L135 395C86 200 62 97 62 84C62 28 100-11 156-11C194-11 227 6 256 41C280 70 297 98 308 125C312 136 314 142 314 145C314 154 309 159 299 159C291 159 285 154 281 143C247 60 206 19 157 19C140 19 131 33 131 60C131 75 133 91 137 107L208 395L297 395C323 395 330 397 330 419Z"></path></g><g data-mml-node="mi" data-latex="o" transform="translate(3086,0)"><path data-c="1D45C" d="M308 442C239 442 176 412 122 353C68 294 41 229 41 159C41 63 106-11 202-11C272-11 334 19 388 78C442 137 469 201 469 272C469 369 405 442 308 442M389 310C389 287 384 255 374 213C353 130 319 73 272 42C248 26 225 18 203 18C149 18 121 65 121 122C121 180 155 288 178 324C216 383 259 413 307 413C361 413 389 367 389 310Z"></path></g><g data-mml-node="mi" data-latex="\_" transform="translate(3571,0)"><path data-c="5F" d="M0-140L333-140L333-100L0-100Z"></path></g><g data-mml-node="mi" data-latex="o" transform="translate(3904,0)"><path data-c="1D45C" d="M308 442C239 442 176 412 122 353C68 294 41 229 41 159C41 63 106-11 202-11C272-11 334 19 388 78C442 137 469 201 469 272C469 369 405 442 308 442M389 310C389 287 384 255 374 213C353 130 319 73 272 42C248 26 225 18 203 18C149 18 121 65 121 122C121 180 155 288 178 324C216 383 259 413 307 413C361 413 389 367 389 310Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(4389,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g><g data-mml-node="mi" data-latex="t" transform="translate(4840,0)"><path data-c="1D461" d="M330 419C330 428 320 433 299 433L218 433C244 537 257 591 257 595C257 616 246 626 225 626C202 626 188 613 182 587L145 433L56 433C34 433 23 432 23 411C23 400 33 395 54 395L135 395C86 200 62 97 62 84C62 28 100-11 156-11C194-11 227 6 256 41C280 70 297 98 308 125C312 136 314 142 314 145C314 154 309 159 299 159C291 159 285 154 281 143C247 60 206 19 157 19C140 19 131 33 131 60C131 75 133 91 137 107L208 395L297 395C323 395 330 397 330 419Z"></path></g><g data-mml-node="mi" data-latex="h" transform="translate(5201,0)"><path data-c="210E" d="M512 138C489 59 457 19 415 19C402 19 395 28 395 47C395 62 401 85 413 116C453 223 473 296 473 335C473 406 427 445 356 445C303 445 257 423 218 380L291 679C289 688 287 694 274 694C241 694 168 685 155 684C140 682 132 675 132 660C132 650 141 645 159 645C180 645 203 646 205 632L59 43C56 32 55 25 55 21C55 0 66-11 87-11C107-11 121-1 128 18L168 182C180 231 189 268 196 293C199 300 207 314 220 334C256 388 300 415 353 415C386 415 402 393 402 350C402 309 382 236 342 130C333 107 329 89 329 74C329 26 365-11 413-11C457-11 492 14 517 65C536 105 546 132 546 145C546 154 541 159 530 159C527 159 512 150 512 138Z"></path></g><g data-mml-node="mi" data-latex="o" transform="translate(5777,0)"><path data-c="1D45C" d="M308 442C239 442 176 412 122 353C68 294 41 229 41 159C41 63 106-11 202-11C272-11 334 19 388 78C442 137 469 201 469 272C469 369 405 442 308 442M389 310C389 287 384 255 374 213C353 130 319 73 272 42C248 26 225 18 203 18C149 18 121 65 121 122C121 180 155 288 178 324C216 383 259 413 307 413C361 413 389 367 389 310Z"></path></g></g></g><g data-mml-node="mo" data-latex="\cdot" transform="translate(8994.2,0)"><path data-c="22C5" d="M192 250C192 279 168 303 139 303C110 303 86 279 86 250C86 221 110 197 139 197C168 197 192 221 192 250Z"></path></g><g data-mml-node="msub" data-latex="P_{m i d}" transform="translate(9494.4,0)"><g data-mml-node="mi" data-latex="P"><path data-c="1D443" d="M555 683L235 683C212 683 201 682 201 660C201 649 212 644 234 644C254 644 294 647 294 631C294 629 293 623 290 613L158 82C152 60 142 47 128 42C121 40 103 39 72 39C50 39 40 37 40 16C40 5 46 0 59 0L184 3L248 2C259 2 299 0 312 0C328 0 336 8 336 24C336 34 325 39 304 39C264 39 244 43 244 52C244 52 245 55 247 68L307 312L472 312C537 312 599 332 657 371C722 414 754 467 754 530C754 629 660 683 555 683M524 644C611 644 654 614 654 554C654 498 626 423 597 397C559 363 509 346 447 346L313 346L379 610C387 644 387 644 429 644Z"></path></g><g data-mml-node="TeXAtom" transform="translate(675,-150) scale(0.707)" data-latex="{m i d}" data-mjx-texclass="ORD"><g data-mml-node="mi" data-latex="m"><path data-c="1D45A" d="M657 442C596 442 543 412 498 353C489 412 451 442 383 442C324 442 273 416 231 363C223 407 188 442 137 442C96 442 66 409 45 344C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 66 299C84 375 107 413 134 413C152 413 161 399 161 371C161 358 156 331 145 290L88 63C84 51 79 25 79 19C79-1 90-11 111-11C131-11 145-1 152 19C153 24 160 49 171 92L192 181L222 295C233 318 250 341 272 365C301 397 337 413 380 413C413 413 429 391 429 348C429 335 424 308 414 267L387 153C380 124 364 64 356 32C355 25 354 21 354 19C354-1 365-11 387-11C398-11 406-8 413-1C428 14 429 21 435 48L494 285C497 298 511 321 535 353C565 393 605 413 654 413C687 413 703 391 703 348C703 309 683 236 642 129C633 106 629 87 629 74C629 25 666-11 714-11C759-11 793 14 818 64C838 104 848 131 848 144C848 153 843 158 832 158C825 157 818 148 813 137C791 58 759 18 716 18C703 18 696 28 696 47C696 62 702 84 714 115C755 222 775 295 775 333C775 404 728 442 657 442Z"></path></g><g data-mml-node="mi" data-latex="i" transform="translate(878,0)"><path data-c="1D456" d="M284 621C284 648 271 661 244 661C216 661 188 633 188 605C188 578 202 565 229 565C257 565 284 593 284 621M259 138C237 59 205 19 164 19C151 19 144 28 144 47C144 64 173 150 232 306C240 329 244 347 244 360C244 409 210 445 161 445C118 445 84 420 59 369C39 328 29 301 29 288C29 279 34 275 45 275C58 275 60 281 64 295C87 375 118 415 158 415C171 415 178 406 178 387C178 373 175 357 168 338C145 275 121 208 101 155C86 115 78 88 78 74C78 25 114-11 162-11C205-11 239 14 264 64C283 103 293 130 293 145C293 154 288 159 277 159C274 159 259 150 259 138Z"></path></g><g data-mml-node="mi" data-latex="d" transform="translate(1223,0)"><path data-c="1D451" d="M429 632L370 389C349 426 320 445 281 445C216 445 159 412 109 345C63 283 40 218 40 151C40 63 91-11 175-11C218-11 260 12 300 59C311 21 345-11 392-11C461-11 483 71 498 145C498 154 493 159 483 159C474 159 468 152 465 138C445 59 421 19 394 19C377 19 368 33 368 60C368 75 370 91 374 107L516 679L516 683C513 690 507 694 499 694C476 694 434 690 374 683C363 682 357 674 357 660C357 650 366 645 384 645C403 645 429 646 429 632M341 376C351 355 356 341 356 332C355 328 354 323 353 316L304 122C301 111 294 99 285 87C248 42 212 19 177 19C138 19 118 49 118 108C118 132 124 168 136 216C157 301 187 359 224 390C244 407 263 415 282 415C309 415 329 402 341 376Z"></path></g></g></g><g data-mml-node="mo" data-latex="=" transform="translate(11729.7,0)"><path data-c="3D" d="M698 367L80 367C64 367 56 359 56 344C56 329 64 321 80 321L698 321C714 321 722 329 722 344C722 356 711 367 698 367M698 179L80 179C64 179 56 171 56 156C56 141 64 133 80 133L698 133C714 133 722 141 722 156C722 169 711 179 698 179Z"></path></g><g data-mml-node="mrow" data-latex="{pmatrix}" transform="translate(12785.4,0)"><g data-mml-node="mo"><path data-c="239B" d="M813 1450C820 1455 823 1462 823 1470C823 1487 815 1495 798 1495C793 1495 788 1493 784 1490C697 1423 614 1324 536 1192C399 956 277 603 277 253L277 0L385 0L385 253C385 407 403 562 438 719C500 999 630 1313 813 1450Z" transform="translate(0,1355)"></path><path data-c="239D" d="M798 0C815 0 823 8 823 25C823 34 819 40 812 44C731 106 658 202 592 334C474 569 385 903 385 1242L385 1495L277 1495L277 1242C277 914 388 575 512 345C594 193 685 80 784 5C788 2 793 0 798 0Z" transform="translate(0,-2350)"></path><svg width="875" height="2350" y="-925" x="0" viewBox="0 587.5 875 2350"><path data-c="239C" d="M277 0L385 0L385 498L277 498Z" transform="scale(1,7.078)"></path></svg></g><g data-mml-node="mtable" transform="translate(875,0)"><g data-mml-node="mtr" transform="translate(0,2100)"><g data-mml-node="mtd" transform="translate(5502.6,0)"><g data-mml-node="msub" data-latex="x_{P}"><g data-mml-node="mi" data-latex="x"><path data-c="1D465" d="M527 373C527 419 482 442 432 442C389 442 355 419 329 373C308 419 273 442 222 442C173 442 133 419 101 374C74 335 60 306 60 287C60 278 65 273 75 273C84 273 90 278 92 287C111 345 153 413 220 413C253 413 269 392 269 351C269 330 251 252 216 118C199 51 169 18 126 18C112 18 99 21 88 26C114 36 127 54 127 80C127 106 114 119 87 119C54 119 29 91 29 58C29 12 76-11 125-11C167-11 201 12 228 58C247 12 283-11 335-11C383-11 423 12 455 57C482 96 496 125 496 144C496 153 491 158 481 158C472 158 467 153 464 144C447 87 402 18 337 18C304 18 287 38 287 79C287 92 292 120 303 165L337 300C356 375 387 413 431 413C445 413 458 410 469 405C442 396 429 378 429 351C429 325 443 312 470 312C502 312 527 341 527 373Z"></path></g><g data-mml-node="TeXAtom" transform="translate(605,-150) scale(0.707)" data-latex="{P}" data-mjx-texclass="ORD"><g data-mml-node="mi" data-latex="P"><path data-c="1D443" d="M555 683L235 683C212 683 201 682 201 660C201 649 212 644 234 644C254 644 294 647 294 631C294 629 293 623 290 613L158 82C152 60 142 47 128 42C121 40 103 39 72 39C50 39 40 37 40 16C40 5 46 0 59 0L184 3L248 2C259 2 299 0 312 0C328 0 336 8 336 24C336 34 325 39 304 39C264 39 244 43 244 52C244 52 245 55 247 68L307 312L472 312C537 312 599 332 657 371C722 414 754 467 754 530C754 629 660 683 555 683M524 644C611 644 654 614 654 554C654 498 626 423 597 397C559 363 509 346 447 346L313 346L379 610C387 644 387 644 429 644Z"></path></g></g></g><g data-mml-node="mo" data-latex="\cdot" transform="translate(1410.4,0)"><path data-c="22C5" d="M192 250C192 279 168 303 139 303C110 303 86 279 86 250C86 221 110 197 139 197C168 197 192 221 192 250Z"></path></g><g data-mml-node="mi" data-latex="z" transform="translate(1910.6,0)"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="mi" data-latex="N" transform="translate(2377.6,0)"><path data-c="1D441" d="M864 683C845 683 783 680 764 680C745 680 682 683 663 683C648 683 641 675 641 659C641 650 648 645 663 644C705 644 726 631 726 605C726 599 725 592 724 585L616 157L401 662C393 681 391 683 366 683L233 683C209 683 200 681 200 659C200 649 211 644 232 644C274 644 295 643 296 640L163 110C154 71 131 49 95 42C69 39 39 43 39 15C39 5 45 0 56 0C74 0 136 3 155 3C174 3 238 0 257 0C272 0 279 8 279 24C279 33 271 38 255 39C214 40 194 53 194 78C194 83 195 90 197 100L326 611L576 21C582 7 590 0 599 0C608 0 614 8 618 24L757 574C770 625 798 643 860 644C874 645 881 653 881 669C878 678 877 683 864 683Z"></path></g><g data-mml-node="mi" data-latex="e" transform="translate(3258.6,0)"><path data-c="1D452" d="M124 129C124 153 129 186 139 227L188 227C253 227 303 235 339 250C372 264 394 284 405 309C412 326 415 342 415 355C415 410 363 442 307 442C268 442 229 432 190 412C113 372 46 281 46 171C46 69 105-11 204-11C257-11 304 2 345 27C379 48 404 69 420 90C427 99 430 106 430 109C430 120 425 126 414 126C409 126 404 122 398 114C365 70 324 42 277 30C246 22 223 18 206 18C149 18 124 72 124 129M375 355C375 289 311 256 182 256L147 256C166 322 194 366 232 387C262 404 287 413 307 413C343 413 375 391 375 355Z"></path></g><g data-mml-node="mi" data-latex="a" transform="translate(3724.6,0)"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(4253.6,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g></g></g><g data-mml-node="mtr" transform="translate(0,700)"><g data-mml-node="mtd" transform="translate(5543.6,0)"><g data-mml-node="msub" data-latex="y_{P}"><g data-mml-node="mi" data-latex="y"><path data-c="1D466" d="M163 442C118 442 83 417 58 367C39 328 29 301 29 286C29 277 34 272 45 272C59 272 60 278 64 293C87 372 119 412 160 412C173 412 180 403 180 385C180 369 175 346 164 317C126 214 107 145 107 108C107 32 154-13 231-13C264-13 295-1 323 23C288-109 233-175 158-175C124-175 101-164 89-142C129-140 149-121 149-85C149-60 136-47 109-47C72-47 50-78 50-115C50-170 100-205 158-205C273-205 367-99 392-1L486 377C489 388 490 396 490 401C490 421 479 431 458 431C442 431 429 423 420 408C414 387 409 369 406 354L342 97C332 61 279 16 234 16C196 16 177 41 177 92C177 134 194 198 227 284C240 319 247 343 247 357C247 406 212 442 163 442Z"></path></g><g data-mml-node="TeXAtom" transform="translate(523,-150) scale(0.707)" data-latex="{P}" data-mjx-texclass="ORD"><g data-mml-node="mi" data-latex="P"><path data-c="1D443" d="M555 683L235 683C212 683 201 682 201 660C201 649 212 644 234 644C254 644 294 647 294 631C294 629 293 623 290 613L158 82C152 60 142 47 128 42C121 40 103 39 72 39C50 39 40 37 40 16C40 5 46 0 59 0L184 3L248 2C259 2 299 0 312 0C328 0 336 8 336 24C336 34 325 39 304 39C264 39 244 43 244 52C244 52 245 55 247 68L307 312L472 312C537 312 599 332 657 371C722 414 754 467 754 530C754 629 660 683 555 683M524 644C611 644 654 614 654 554C654 498 626 423 597 397C559 363 509 346 447 346L313 346L379 610C387 644 387 644 429 644Z"></path></g></g></g><g data-mml-node="mo" data-latex="\cdot" transform="translate(1328.4,0)"><path data-c="22C5" d="M192 250C192 279 168 303 139 303C110 303 86 279 86 250C86 221 110 197 139 197C168 197 192 221 192 250Z"></path></g><g data-mml-node="mi" data-latex="z" transform="translate(1828.6,0)"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="mi" data-latex="N" transform="translate(2295.6,0)"><path data-c="1D441" d="M864 683C845 683 783 680 764 680C745 680 682 683 663 683C648 683 641 675 641 659C641 650 648 645 663 644C705 644 726 631 726 605C726 599 725 592 724 585L616 157L401 662C393 681 391 683 366 683L233 683C209 683 200 681 200 659C200 649 211 644 232 644C274 644 295 643 296 640L163 110C154 71 131 49 95 42C69 39 39 43 39 15C39 5 45 0 56 0C74 0 136 3 155 3C174 3 238 0 257 0C272 0 279 8 279 24C279 33 271 38 255 39C214 40 194 53 194 78C194 83 195 90 197 100L326 611L576 21C582 7 590 0 599 0C608 0 614 8 618 24L757 574C770 625 798 643 860 644C874 645 881 653 881 669C878 678 877 683 864 683Z"></path></g><g data-mml-node="mi" data-latex="e" transform="translate(3176.6,0)"><path data-c="1D452" d="M124 129C124 153 129 186 139 227L188 227C253 227 303 235 339 250C372 264 394 284 405 309C412 326 415 342 415 355C415 410 363 442 307 442C268 442 229 432 190 412C113 372 46 281 46 171C46 69 105-11 204-11C257-11 304 2 345 27C379 48 404 69 420 90C427 99 430 106 430 109C430 120 425 126 414 126C409 126 404 122 398 114C365 70 324 42 277 30C246 22 223 18 206 18C149 18 124 72 124 129M375 355C375 289 311 256 182 256L147 256C166 322 194 366 232 387C262 404 287 413 307 413C343 413 375 391 375 355Z"></path></g><g data-mml-node="mi" data-latex="a" transform="translate(3642.6,0)"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(4171.6,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g></g></g><g data-mml-node="mtr" transform="translate(0,-700)"><g data-mml-node="mtd"><g data-mml-node="msub" data-latex="z_{m i d}"><g data-mml-node="mi" data-latex="z"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="TeXAtom" transform="translate(498,-150) scale(0.707)" data-latex="{m i d}" data-mjx-texclass="ORD"><g data-mml-node="mi" data-latex="m"><path data-c="1D45A" d="M657 442C596 442 543 412 498 353C489 412 451 442 383 442C324 442 273 416 231 363C223 407 188 442 137 442C96 442 66 409 45 344C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 66 299C84 375 107 413 134 413C152 413 161 399 161 371C161 358 156 331 145 290L88 63C84 51 79 25 79 19C79-1 90-11 111-11C131-11 145-1 152 19C153 24 160 49 171 92L192 181L222 295C233 318 250 341 272 365C301 397 337 413 380 413C413 413 429 391 429 348C429 335 424 308 414 267L387 153C380 124 364 64 356 32C355 25 354 21 354 19C354-1 365-11 387-11C398-11 406-8 413-1C428 14 429 21 435 48L494 285C497 298 511 321 535 353C565 393 605 413 654 413C687 413 703 391 703 348C703 309 683 236 642 129C633 106 629 87 629 74C629 25 666-11 714-11C759-11 793 14 818 64C838 104 848 131 848 144C848 153 843 158 832 158C825 157 818 148 813 137C791 58 759 18 716 18C703 18 696 28 696 47C696 62 702 84 714 115C755 222 775 295 775 333C775 404 728 442 657 442Z"></path></g><g data-mml-node="mi" data-latex="i" transform="translate(878,0)"><path data-c="1D456" d="M284 621C284 648 271 661 244 661C216 661 188 633 188 605C188 578 202 565 229 565C257 565 284 593 284 621M259 138C237 59 205 19 164 19C151 19 144 28 144 47C144 64 173 150 232 306C240 329 244 347 244 360C244 409 210 445 161 445C118 445 84 420 59 369C39 328 29 301 29 288C29 279 34 275 45 275C58 275 60 281 64 295C87 375 118 415 158 415C171 415 178 406 178 387C178 373 175 357 168 338C145 275 121 208 101 155C86 115 78 88 78 74C78 25 114-11 162-11C205-11 239 14 264 64C283 103 293 130 293 145C293 154 288 159 277 159C274 159 259 150 259 138Z"></path></g><g data-mml-node="mi" data-latex="d" transform="translate(1223,0)"><path data-c="1D451" d="M429 632L370 389C349 426 320 445 281 445C216 445 159 412 109 345C63 283 40 218 40 151C40 63 91-11 175-11C218-11 260 12 300 59C311 21 345-11 392-11C461-11 483 71 498 145C498 154 493 159 483 159C474 159 468 152 465 138C445 59 421 19 394 19C377 19 368 33 368 60C368 75 370 91 374 107L516 679L516 683C513 690 507 694 499 694C476 694 434 690 374 683C363 682 357 674 357 660C357 650 366 645 384 645C403 645 429 646 429 632M341 376C351 355 356 341 356 332C355 328 354 323 353 316L304 122C301 111 294 99 285 87C248 42 212 19 177 19C138 19 118 49 118 108C118 132 124 168 136 216C157 301 187 359 224 390C244 407 263 415 282 415C309 415 329 402 341 376Z"></path></g></g></g><g data-mml-node="mo" data-latex="(" transform="translate(1780.5,0)"><path data-c="28" d="M318-248C327-248 332-243 332-234C332-231 330-227 327-223C275-183 233-117 202-26C175 53 161 131 161 208L161 292C161 369 175 447 202 526C233 617 275 683 327 723C330 726 332 730 332 734C332 743 327 748 318 748C317 748 314 747 311 745C251 699 201 631 160 540C121 453 101 371 101 292L101 208C101 129 121 47 160-40C201-131 251-199 311-245C314-247 317-248 318-248Z"></path></g><g data-mml-node="mi" data-latex="z" transform="translate(2169.5,0)"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="mi" data-latex="N" transform="translate(2636.5,0)"><path data-c="1D441" d="M864 683C845 683 783 680 764 680C745 680 682 683 663 683C648 683 641 675 641 659C641 650 648 645 663 644C705 644 726 631 726 605C726 599 725 592 724 585L616 157L401 662C393 681 391 683 366 683L233 683C209 683 200 681 200 659C200 649 211 644 232 644C274 644 295 643 296 640L163 110C154 71 131 49 95 42C69 39 39 43 39 15C39 5 45 0 56 0C74 0 136 3 155 3C174 3 238 0 257 0C272 0 279 8 279 24C279 33 271 38 255 39C214 40 194 53 194 78C194 83 195 90 197 100L326 611L576 21C582 7 590 0 599 0C608 0 614 8 618 24L757 574C770 625 798 643 860 644C874 645 881 653 881 669C878 678 877 683 864 683Z"></path></g><g data-mml-node="mi" data-latex="e" transform="translate(3517.5,0)"><path data-c="1D452" d="M124 129C124 153 129 186 139 227L188 227C253 227 303 235 339 250C372 264 394 284 405 309C412 326 415 342 415 355C415 410 363 442 307 442C268 442 229 432 190 412C113 372 46 281 46 171C46 69 105-11 204-11C257-11 304 2 345 27C379 48 404 69 420 90C427 99 430 106 430 109C430 120 425 126 414 126C409 126 404 122 398 114C365 70 324 42 277 30C246 22 223 18 206 18C149 18 124 72 124 129M375 355C375 289 311 256 182 256L147 256C166 322 194 366 232 387C262 404 287 413 307 413C343 413 375 391 375 355Z"></path></g><g data-mml-node="mi" data-latex="a" transform="translate(3983.5,0)"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(4512.5,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g><g data-mml-node="mo" data-latex="+" transform="translate(5185.7,0)"><path data-c="2B" d="M698 274L413 274L413 559C413 575 405 583 389 583C373 583 365 575 365 559L365 274L80 274C64 274 56 266 56 250C56 234 64 226 80 226L365 226L365-59C365-75 373-83 389-83C405-83 413-75 413-59L413 226L698 226C714 226 722 234 722 250C722 263 711 274 698 274Z"></path></g><g data-mml-node="mi" data-latex="z" transform="translate(6185.9,0)"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="mi" data-latex="F" transform="translate(6652.9,0)"><path data-c="1D439" d="M199 656C199 646 210 641 231 641C271 641 291 637 291 628C291 625 289 618 286 605L156 82C150 60 140 47 126 42C119 40 101 39 70 39C48 39 38 37 38 16C38 5 44 0 57 0L187 3L335 0C351 0 359 8 359 23C359 40 348 39 322 39C278 39 253 41 247 46C244 47 243 51 243 56L307 321L400 321C446 321 478 319 478 281C478 268 476 252 471 233C470 230 469 226 468 222C468 211 473 206 484 206C489 207 496 214 503 229L557 444C559 452 560 458 560 461C557 470 551 475 544 475C536 475 530 467 526 452C516 414 502 390 486 378C470 366 442 360 402 360L317 360L379 606C387 640 387 641 429 641L559 641C656 641 700 626 700 537C700 517 699 499 697 484C696 473 695 467 695 466C695 455 700 450 710 450C720 450 726 459 728 478L748 649C751 677 744 680 717 680L233 680C210 680 199 679 199 656Z"></path></g><g data-mml-node="mi" data-latex="a" transform="translate(7403.9,0)"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(7932.9,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g><g data-mml-node="mo" data-latex=")" transform="translate(8383.9,0)"><path data-c="29" d="M78-245C138-199 188-131 229-40C268 47 288 129 288 208L288 292C288 371 268 453 229 540C188 631 138 699 78 745C75 747 72 748 71 748C62 748 57 743 57 734C57 730 59 726 62 723C114 683 156 617 187 526C214 447 228 369 228 292L228 208C228 131 214 53 187-26C156-117 114-183 62-223C59-227 57-231 57-234C57-243 62-248 71-248C72-248 75-247 78-245Z"></path></g><g data-mml-node="mo" data-latex="-" transform="translate(8995.2,0)"><path data-c="2212" d="M698 270L80 270C64 270 56 263 56 250C56 237 64 230 80 230L698 230C714 230 722 237 722 250C722 262 710 270 698 270Z"></path></g><g data-mml-node="mi" data-latex="z" transform="translate(9995.4,0)"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="mi" data-latex="N" transform="translate(10462.4,0)"><path data-c="1D441" d="M864 683C845 683 783 680 764 680C745 680 682 683 663 683C648 683 641 675 641 659C641 650 648 645 663 644C705 644 726 631 726 605C726 599 725 592 724 585L616 157L401 662C393 681 391 683 366 683L233 683C209 683 200 681 200 659C200 649 211 644 232 644C274 644 295 643 296 640L163 110C154 71 131 49 95 42C69 39 39 43 39 15C39 5 45 0 56 0C74 0 136 3 155 3C174 3 238 0 257 0C272 0 279 8 279 24C279 33 271 38 255 39C214 40 194 53 194 78C194 83 195 90 197 100L326 611L576 21C582 7 590 0 599 0C608 0 614 8 618 24L757 574C770 625 798 643 860 644C874 645 881 653 881 669C878 678 877 683 864 683Z"></path></g><g data-mml-node="mi" data-latex="e" transform="translate(11343.4,0)"><path data-c="1D452" d="M124 129C124 153 129 186 139 227L188 227C253 227 303 235 339 250C372 264 394 284 405 309C412 326 415 342 415 355C415 410 363 442 307 442C268 442 229 432 190 412C113 372 46 281 46 171C46 69 105-11 204-11C257-11 304 2 345 27C379 48 404 69 420 90C427 99 430 106 430 109C430 120 425 126 414 126C409 126 404 122 398 114C365 70 324 42 277 30C246 22 223 18 206 18C149 18 124 72 124 129M375 355C375 289 311 256 182 256L147 256C166 322 194 366 232 387C262 404 287 413 307 413C343 413 375 391 375 355Z"></path></g><g data-mml-node="mi" data-latex="a" transform="translate(11809.4,0)"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(12338.4,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g><g data-mml-node="mo" data-latex="\cdot" transform="translate(13011.6,0)"><path data-c="22C5" d="M192 250C192 279 168 303 139 303C110 303 86 279 86 250C86 221 110 197 139 197C168 197 192 221 192 250Z"></path></g><g data-mml-node="mi" data-latex="z" transform="translate(13511.8,0)"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="mi" data-latex="F" transform="translate(13978.8,0)"><path data-c="1D439" d="M199 656C199 646 210 641 231 641C271 641 291 637 291 628C291 625 289 618 286 605L156 82C150 60 140 47 126 42C119 40 101 39 70 39C48 39 38 37 38 16C38 5 44 0 57 0L187 3L335 0C351 0 359 8 359 23C359 40 348 39 322 39C278 39 253 41 247 46C244 47 243 51 243 56L307 321L400 321C446 321 478 319 478 281C478 268 476 252 471 233C470 230 469 226 468 222C468 211 473 206 484 206C489 207 496 214 503 229L557 444C559 452 560 458 560 461C557 470 551 475 544 475C536 475 530 467 526 452C516 414 502 390 486 378C470 366 442 360 402 360L317 360L379 606C387 640 387 641 429 641L559 641C656 641 700 626 700 537C700 517 699 499 697 484C696 473 695 467 695 466C695 455 700 450 710 450C720 450 726 459 728 478L748 649C751 677 744 680 717 680L233 680C210 680 199 679 199 656Z"></path></g><g data-mml-node="mi" data-latex="a" transform="translate(14729.8,0)"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(15258.8,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g></g></g><g data-mml-node="mtr" transform="translate(0,-2100)"><g data-mml-node="mtd" transform="translate(6964.7,0)"><g data-mml-node="msub" data-latex="z_{m i d}"><g data-mml-node="mi" data-latex="z"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="TeXAtom" transform="translate(498,-150) scale(0.707)" data-latex="{m i d}" data-mjx-texclass="ORD"><g data-mml-node="mi" data-latex="m"><path data-c="1D45A" d="M657 442C596 442 543 412 498 353C489 412 451 442 383 442C324 442 273 416 231 363C223 407 188 442 137 442C96 442 66 409 45 344C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 66 299C84 375 107 413 134 413C152 413 161 399 161 371C161 358 156 331 145 290L88 63C84 51 79 25 79 19C79-1 90-11 111-11C131-11 145-1 152 19C153 24 160 49 171 92L192 181L222 295C233 318 250 341 272 365C301 397 337 413 380 413C413 413 429 391 429 348C429 335 424 308 414 267L387 153C380 124 364 64 356 32C355 25 354 21 354 19C354-1 365-11 387-11C398-11 406-8 413-1C428 14 429 21 435 48L494 285C497 298 511 321 535 353C565 393 605 413 654 413C687 413 703 391 703 348C703 309 683 236 642 129C633 106 629 87 629 74C629 25 666-11 714-11C759-11 793 14 818 64C838 104 848 131 848 144C848 153 843 158 832 158C825 157 818 148 813 137C791 58 759 18 716 18C703 18 696 28 696 47C696 62 702 84 714 115C755 222 775 295 775 333C775 404 728 442 657 442Z"></path></g><g data-mml-node="mi" data-latex="i" transform="translate(878,0)"><path data-c="1D456" d="M284 621C284 648 271 661 244 661C216 661 188 633 188 605C188 578 202 565 229 565C257 565 284 593 284 621M259 138C237 59 205 19 164 19C151 19 144 28 144 47C144 64 173 150 232 306C240 329 244 347 244 360C244 409 210 445 161 445C118 445 84 420 59 369C39 328 29 301 29 288C29 279 34 275 45 275C58 275 60 281 64 295C87 375 118 415 158 415C171 415 178 406 178 387C178 373 175 357 168 338C145 275 121 208 101 155C86 115 78 88 78 74C78 25 114-11 162-11C205-11 239 14 264 64C283 103 293 130 293 145C293 154 288 159 277 159C274 159 259 150 259 138Z"></path></g><g data-mml-node="mi" data-latex="d" transform="translate(1223,0)"><path data-c="1D451" d="M429 632L370 389C349 426 320 445 281 445C216 445 159 412 109 345C63 283 40 218 40 151C40 63 91-11 175-11C218-11 260 12 300 59C311 21 345-11 392-11C461-11 483 71 498 145C498 154 493 159 483 159C474 159 468 152 465 138C445 59 421 19 394 19C377 19 368 33 368 60C368 75 370 91 374 107L516 679L516 683C513 690 507 694 499 694C476 694 434 690 374 683C363 682 357 674 357 660C357 650 366 645 384 645C403 645 429 646 429 632M341 376C351 355 356 341 356 332C355 328 354 323 353 316L304 122C301 111 294 99 285 87C248 42 212 19 177 19C138 19 118 49 118 108C118 132 124 168 136 216C157 301 187 359 224 390C244 407 263 415 282 415C309 415 329 402 341 376Z"></path></g></g></g></g></g></g><g data-mml-node="mo" transform="translate(16584.8,0)"><path data-c="239E" d="M490 0L598 0L598 253C598 581 487 920 363 1150C281 1301 190 1415 91 1490C87 1493 82 1495 77 1495C60 1495 52 1487 52 1470C52 1462 55 1455 62 1450C143 1389 216 1292 283 1160C402 924 490 593 490 253Z" transform="translate(0,1355)"></path><path data-c="23A0" d="M598 1242L598 1495L490 1495L490 1242C490 1088 472 933 437 776C375 494 246 184 63 44C56 40 52 34 52 25C52 8 60 0 77 0C82 0 87 2 91 5C178 71 261 170 339 303C477 539 598 892 598 1242Z" transform="translate(0,-2350)"></path><svg width="875" height="2350" y="-925" x="0" viewBox="0 587.5 875 2350"><path data-c="239F" d="M490 0L598 0L598 498L490 498Z" transform="scale(1,7.078)"></path></svg></g></g></g></g></svg></mjx-container></p></li><li><p>齐次除法：</p><p>  <mjx-container class="MathJax" jax="SVG" overflow="overflow" display="true"><svg style="vertical-align: -6.449ex;" xmlns="http://www.w3.org/2000/svg" width="30.211ex" height="14.028ex" role="img" focusable="false" viewBox="0 -3350.3 13353.3 6200.6"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="  \begin{pmatrix}  x_{P} \cdot \frac{zNear}{z_{mid}} \\  y_{P} \cdot \frac{zNear}{z_{mid}} \\  zNear + zFar - \frac{zNear \cdot zFar}{z_{mid}} \\  1  \end{pmatrix}  "><g data-mml-node="mrow" data-latex="\begin{pmatrix}  x_{P} \cdot \frac{zNear}{z_{mid}} \\  y_{P} \cdot \frac{zNear}{z_{mid}} \\  zNear + zFar - \frac{zNear \cdot zFar}{z_{mid}} \\  1  \end{pmatrix}"><g data-mml-node="mo"><path data-c="239B" d="M813 1450C820 1455 823 1462 823 1470C823 1487 815 1495 798 1495C793 1495 788 1493 784 1490C697 1423 614 1324 536 1192C399 956 277 603 277 253L277 0L385 0L385 253C385 407 403 562 438 719C500 999 630 1313 813 1450Z" transform="translate(0,1855.3)"></path><path data-c="239D" d="M798 0C815 0 823 8 823 25C823 34 819 40 812 44C731 106 658 202 592 334C474 569 385 903 385 1242L385 1495L277 1495L277 1242C277 914 388 575 512 345C594 193 685 80 784 5C788 2 793 0 798 0Z" transform="translate(0,-2850.3)"></path><svg width="875" height="3350.6" y="-1425.3" x="0" viewBox="0 837.6 875 3350.6"><path data-c="239C" d="M277 0L385 0L385 498L277 498Z" transform="scale(1,10.092)"></path></svg></g><g data-mml-node="mtable" transform="translate(875,0)"><g data-mml-node="mtr" transform="translate(0,2473.3)"><g data-mml-node="mtd" transform="translate(3638.5,0)"><g data-mml-node="msub" data-latex="x_{P}"><g data-mml-node="mi" data-latex="x"><path data-c="1D465" d="M527 373C527 419 482 442 432 442C389 442 355 419 329 373C308 419 273 442 222 442C173 442 133 419 101 374C74 335 60 306 60 287C60 278 65 273 75 273C84 273 90 278 92 287C111 345 153 413 220 413C253 413 269 392 269 351C269 330 251 252 216 118C199 51 169 18 126 18C112 18 99 21 88 26C114 36 127 54 127 80C127 106 114 119 87 119C54 119 29 91 29 58C29 12 76-11 125-11C167-11 201 12 228 58C247 12 283-11 335-11C383-11 423 12 455 57C482 96 496 125 496 144C496 153 491 158 481 158C472 158 467 153 464 144C447 87 402 18 337 18C304 18 287 38 287 79C287 92 292 120 303 165L337 300C356 375 387 413 431 413C445 413 458 410 469 405C442 396 429 378 429 351C429 325 443 312 470 312C502 312 527 341 527 373Z"></path></g><g data-mml-node="TeXAtom" transform="translate(605,-150) scale(0.707)" data-latex="{P}" data-mjx-texclass="ORD"><g data-mml-node="mi" data-latex="P"><path data-c="1D443" d="M555 683L235 683C212 683 201 682 201 660C201 649 212 644 234 644C254 644 294 647 294 631C294 629 293 623 290 613L158 82C152 60 142 47 128 42C121 40 103 39 72 39C50 39 40 37 40 16C40 5 46 0 59 0L184 3L248 2C259 2 299 0 312 0C328 0 336 8 336 24C336 34 325 39 304 39C264 39 244 43 244 52C244 52 245 55 247 68L307 312L472 312C537 312 599 332 657 371C722 414 754 467 754 530C754 629 660 683 555 683M524 644C611 644 654 614 654 554C654 498 626 423 597 397C559 363 509 346 447 346L313 346L379 610C387 644 387 644 429 644Z"></path></g></g></g><g data-mml-node="mo" data-latex="\cdot" transform="translate(1410.4,0)"><path data-c="22C5" d="M192 250C192 279 168 303 139 303C110 303 86 279 86 250C86 221 110 197 139 197C168 197 192 221 192 250Z"></path></g><g data-mml-node="mfrac" data-latex="\frac{zNear}{z_{mid}}" transform="translate(1910.6,0)"><g data-mml-node="mrow" transform="translate(220,394) scale(0.707)" data-latex="zNear"><g data-mml-node="mi" data-latex="z"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="mi" data-latex="N" transform="translate(467,0)"><path data-c="1D441" d="M864 683C845 683 783 680 764 680C745 680 682 683 663 683C648 683 641 675 641 659C641 650 648 645 663 644C705 644 726 631 726 605C726 599 725 592 724 585L616 157L401 662C393 681 391 683 366 683L233 683C209 683 200 681 200 659C200 649 211 644 232 644C274 644 295 643 296 640L163 110C154 71 131 49 95 42C69 39 39 43 39 15C39 5 45 0 56 0C74 0 136 3 155 3C174 3 238 0 257 0C272 0 279 8 279 24C279 33 271 38 255 39C214 40 194 53 194 78C194 83 195 90 197 100L326 611L576 21C582 7 590 0 599 0C608 0 614 8 618 24L757 574C770 625 798 643 860 644C874 645 881 653 881 669C878 678 877 683 864 683Z"></path></g><g data-mml-node="mi" data-latex="e" transform="translate(1348,0)"><path data-c="1D452" d="M124 129C124 153 129 186 139 227L188 227C253 227 303 235 339 250C372 264 394 284 405 309C412 326 415 342 415 355C415 410 363 442 307 442C268 442 229 432 190 412C113 372 46 281 46 171C46 69 105-11 204-11C257-11 304 2 345 27C379 48 404 69 420 90C427 99 430 106 430 109C430 120 425 126 414 126C409 126 404 122 398 114C365 70 324 42 277 30C246 22 223 18 206 18C149 18 124 72 124 129M375 355C375 289 311 256 182 256L147 256C166 322 194 366 232 387C262 404 287 413 307 413C343 413 375 391 375 355Z"></path></g><g data-mml-node="mi" data-latex="a" transform="translate(1814,0)"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(2343,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g></g><g data-mml-node="msub" transform="translate(578.3,-345) scale(0.707)" data-latex="z_{mid}"><g data-mml-node="mi" data-latex="z"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="TeXAtom" transform="translate(498,-150) scale(0.707)" data-latex="{m i d}" data-mjx-texclass="ORD"><g data-mml-node="mi" data-latex="m"><path data-c="1D45A" d="M657 442C596 442 543 412 498 353C489 412 451 442 383 442C324 442 273 416 231 363C223 407 188 442 137 442C96 442 66 409 45 344C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 66 299C84 375 107 413 134 413C152 413 161 399 161 371C161 358 156 331 145 290L88 63C84 51 79 25 79 19C79-1 90-11 111-11C131-11 145-1 152 19C153 24 160 49 171 92L192 181L222 295C233 318 250 341 272 365C301 397 337 413 380 413C413 413 429 391 429 348C429 335 424 308 414 267L387 153C380 124 364 64 356 32C355 25 354 21 354 19C354-1 365-11 387-11C398-11 406-8 413-1C428 14 429 21 435 48L494 285C497 298 511 321 535 353C565 393 605 413 654 413C687 413 703 391 703 348C703 309 683 236 642 129C633 106 629 87 629 74C629 25 666-11 714-11C759-11 793 14 818 64C838 104 848 131 848 144C848 153 843 158 832 158C825 157 818 148 813 137C791 58 759 18 716 18C703 18 696 28 696 47C696 62 702 84 714 115C755 222 775 295 775 333C775 404 728 442 657 442Z"></path></g><g data-mml-node="mi" data-latex="i" transform="translate(878,0)"><path data-c="1D456" d="M284 621C284 648 271 661 244 661C216 661 188 633 188 605C188 578 202 565 229 565C257 565 284 593 284 621M259 138C237 59 205 19 164 19C151 19 144 28 144 47C144 64 173 150 232 306C240 329 244 347 244 360C244 409 210 445 161 445C118 445 84 420 59 369C39 328 29 301 29 288C29 279 34 275 45 275C58 275 60 281 64 295C87 375 118 415 158 415C171 415 178 406 178 387C178 373 175 357 168 338C145 275 121 208 101 155C86 115 78 88 78 74C78 25 114-11 162-11C205-11 239 14 264 64C283 103 293 130 293 145C293 154 288 159 277 159C274 159 259 150 259 138Z"></path></g><g data-mml-node="mi" data-latex="d" transform="translate(1223,0)"><path data-c="1D451" d="M429 632L370 389C349 426 320 445 281 445C216 445 159 412 109 345C63 283 40 218 40 151C40 63 91-11 175-11C218-11 260 12 300 59C311 21 345-11 392-11C461-11 483 71 498 145C498 154 493 159 483 159C474 159 468 152 465 138C445 59 421 19 394 19C377 19 368 33 368 60C368 75 370 91 374 107L516 679L516 683C513 690 507 694 499 694C476 694 434 690 374 683C363 682 357 674 357 660C357 650 366 645 384 645C403 645 429 646 429 632M341 376C351 355 356 341 356 332C355 328 354 323 353 316L304 122C301 111 294 99 285 87C248 42 212 19 177 19C138 19 118 49 118 108C118 132 124 168 136 216C157 301 187 359 224 390C244 407 263 415 282 415C309 415 329 402 341 376Z"></path></g></g></g><rect width="2175.7" height="60" x="120" y="220"></rect></g></g></g><g data-mml-node="mtr" transform="translate(0,739.8)"><g data-mml-node="mtd" transform="translate(3679.5,0)"><g data-mml-node="msub" data-latex="y_{P}"><g data-mml-node="mi" data-latex="y"><path data-c="1D466" d="M163 442C118 442 83 417 58 367C39 328 29 301 29 286C29 277 34 272 45 272C59 272 60 278 64 293C87 372 119 412 160 412C173 412 180 403 180 385C180 369 175 346 164 317C126 214 107 145 107 108C107 32 154-13 231-13C264-13 295-1 323 23C288-109 233-175 158-175C124-175 101-164 89-142C129-140 149-121 149-85C149-60 136-47 109-47C72-47 50-78 50-115C50-170 100-205 158-205C273-205 367-99 392-1L486 377C489 388 490 396 490 401C490 421 479 431 458 431C442 431 429 423 420 408C414 387 409 369 406 354L342 97C332 61 279 16 234 16C196 16 177 41 177 92C177 134 194 198 227 284C240 319 247 343 247 357C247 406 212 442 163 442Z"></path></g><g data-mml-node="TeXAtom" transform="translate(523,-150) scale(0.707)" data-latex="{P}" data-mjx-texclass="ORD"><g data-mml-node="mi" data-latex="P"><path data-c="1D443" d="M555 683L235 683C212 683 201 682 201 660C201 649 212 644 234 644C254 644 294 647 294 631C294 629 293 623 290 613L158 82C152 60 142 47 128 42C121 40 103 39 72 39C50 39 40 37 40 16C40 5 46 0 59 0L184 3L248 2C259 2 299 0 312 0C328 0 336 8 336 24C336 34 325 39 304 39C264 39 244 43 244 52C244 52 245 55 247 68L307 312L472 312C537 312 599 332 657 371C722 414 754 467 754 530C754 629 660 683 555 683M524 644C611 644 654 614 654 554C654 498 626 423 597 397C559 363 509 346 447 346L313 346L379 610C387 644 387 644 429 644Z"></path></g></g></g><g data-mml-node="mo" data-latex="\cdot" transform="translate(1328.4,0)"><path data-c="22C5" d="M192 250C192 279 168 303 139 303C110 303 86 279 86 250C86 221 110 197 139 197C168 197 192 221 192 250Z"></path></g><g data-mml-node="mfrac" data-latex="\frac{zNear}{z_{mid}}" transform="translate(1828.6,0)"><g data-mml-node="mrow" transform="translate(220,394) scale(0.707)" data-latex="zNear"><g data-mml-node="mi" data-latex="z"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="mi" data-latex="N" transform="translate(467,0)"><path data-c="1D441" d="M864 683C845 683 783 680 764 680C745 680 682 683 663 683C648 683 641 675 641 659C641 650 648 645 663 644C705 644 726 631 726 605C726 599 725 592 724 585L616 157L401 662C393 681 391 683 366 683L233 683C209 683 200 681 200 659C200 649 211 644 232 644C274 644 295 643 296 640L163 110C154 71 131 49 95 42C69 39 39 43 39 15C39 5 45 0 56 0C74 0 136 3 155 3C174 3 238 0 257 0C272 0 279 8 279 24C279 33 271 38 255 39C214 40 194 53 194 78C194 83 195 90 197 100L326 611L576 21C582 7 590 0 599 0C608 0 614 8 618 24L757 574C770 625 798 643 860 644C874 645 881 653 881 669C878 678 877 683 864 683Z"></path></g><g data-mml-node="mi" data-latex="e" transform="translate(1348,0)"><path data-c="1D452" d="M124 129C124 153 129 186 139 227L188 227C253 227 303 235 339 250C372 264 394 284 405 309C412 326 415 342 415 355C415 410 363 442 307 442C268 442 229 432 190 412C113 372 46 281 46 171C46 69 105-11 204-11C257-11 304 2 345 27C379 48 404 69 420 90C427 99 430 106 430 109C430 120 425 126 414 126C409 126 404 122 398 114C365 70 324 42 277 30C246 22 223 18 206 18C149 18 124 72 124 129M375 355C375 289 311 256 182 256L147 256C166 322 194 366 232 387C262 404 287 413 307 413C343 413 375 391 375 355Z"></path></g><g data-mml-node="mi" data-latex="a" transform="translate(1814,0)"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(2343,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g></g><g data-mml-node="msub" transform="translate(578.3,-345) scale(0.707)" data-latex="z_{mid}"><g data-mml-node="mi" data-latex="z"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="TeXAtom" transform="translate(498,-150) scale(0.707)" data-latex="{m i d}" data-mjx-texclass="ORD"><g data-mml-node="mi" data-latex="m"><path data-c="1D45A" d="M657 442C596 442 543 412 498 353C489 412 451 442 383 442C324 442 273 416 231 363C223 407 188 442 137 442C96 442 66 409 45 344C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 66 299C84 375 107 413 134 413C152 413 161 399 161 371C161 358 156 331 145 290L88 63C84 51 79 25 79 19C79-1 90-11 111-11C131-11 145-1 152 19C153 24 160 49 171 92L192 181L222 295C233 318 250 341 272 365C301 397 337 413 380 413C413 413 429 391 429 348C429 335 424 308 414 267L387 153C380 124 364 64 356 32C355 25 354 21 354 19C354-1 365-11 387-11C398-11 406-8 413-1C428 14 429 21 435 48L494 285C497 298 511 321 535 353C565 393 605 413 654 413C687 413 703 391 703 348C703 309 683 236 642 129C633 106 629 87 629 74C629 25 666-11 714-11C759-11 793 14 818 64C838 104 848 131 848 144C848 153 843 158 832 158C825 157 818 148 813 137C791 58 759 18 716 18C703 18 696 28 696 47C696 62 702 84 714 115C755 222 775 295 775 333C775 404 728 442 657 442Z"></path></g><g data-mml-node="mi" data-latex="i" transform="translate(878,0)"><path data-c="1D456" d="M284 621C284 648 271 661 244 661C216 661 188 633 188 605C188 578 202 565 229 565C257 565 284 593 284 621M259 138C237 59 205 19 164 19C151 19 144 28 144 47C144 64 173 150 232 306C240 329 244 347 244 360C244 409 210 445 161 445C118 445 84 420 59 369C39 328 29 301 29 288C29 279 34 275 45 275C58 275 60 281 64 295C87 375 118 415 158 415C171 415 178 406 178 387C178 373 175 357 168 338C145 275 121 208 101 155C86 115 78 88 78 74C78 25 114-11 162-11C205-11 239 14 264 64C283 103 293 130 293 145C293 154 288 159 277 159C274 159 259 150 259 138Z"></path></g><g data-mml-node="mi" data-latex="d" transform="translate(1223,0)"><path data-c="1D451" d="M429 632L370 389C349 426 320 445 281 445C216 445 159 412 109 345C63 283 40 218 40 151C40 63 91-11 175-11C218-11 260 12 300 59C311 21 345-11 392-11C461-11 483 71 498 145C498 154 493 159 483 159C474 159 468 152 465 138C445 59 421 19 394 19C377 19 368 33 368 60C368 75 370 91 374 107L516 679L516 683C513 690 507 694 499 694C476 694 434 690 374 683C363 682 357 674 357 660C357 650 366 645 384 645C403 645 429 646 429 632M341 376C351 355 356 341 356 332C355 328 354 323 353 316L304 122C301 111 294 99 285 87C248 42 212 19 177 19C138 19 118 49 118 108C118 132 124 168 136 216C157 301 187 359 224 390C244 407 263 415 282 415C309 415 329 402 341 376Z"></path></g></g></g><rect width="2175.7" height="60" x="120" y="220"></rect></g></g></g><g data-mml-node="mtr" transform="translate(0,-993.7)"><g data-mml-node="mtd"><g data-mml-node="mi" data-latex="z"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="mi" data-latex="N" transform="translate(467,0)"><path data-c="1D441" d="M864 683C845 683 783 680 764 680C745 680 682 683 663 683C648 683 641 675 641 659C641 650 648 645 663 644C705 644 726 631 726 605C726 599 725 592 724 585L616 157L401 662C393 681 391 683 366 683L233 683C209 683 200 681 200 659C200 649 211 644 232 644C274 644 295 643 296 640L163 110C154 71 131 49 95 42C69 39 39 43 39 15C39 5 45 0 56 0C74 0 136 3 155 3C174 3 238 0 257 0C272 0 279 8 279 24C279 33 271 38 255 39C214 40 194 53 194 78C194 83 195 90 197 100L326 611L576 21C582 7 590 0 599 0C608 0 614 8 618 24L757 574C770 625 798 643 860 644C874 645 881 653 881 669C878 678 877 683 864 683Z"></path></g><g data-mml-node="mi" data-latex="e" transform="translate(1348,0)"><path data-c="1D452" d="M124 129C124 153 129 186 139 227L188 227C253 227 303 235 339 250C372 264 394 284 405 309C412 326 415 342 415 355C415 410 363 442 307 442C268 442 229 432 190 412C113 372 46 281 46 171C46 69 105-11 204-11C257-11 304 2 345 27C379 48 404 69 420 90C427 99 430 106 430 109C430 120 425 126 414 126C409 126 404 122 398 114C365 70 324 42 277 30C246 22 223 18 206 18C149 18 124 72 124 129M375 355C375 289 311 256 182 256L147 256C166 322 194 366 232 387C262 404 287 413 307 413C343 413 375 391 375 355Z"></path></g><g data-mml-node="mi" data-latex="a" transform="translate(1814,0)"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(2343,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g><g data-mml-node="mo" data-latex="+" transform="translate(3016.2,0)"><path data-c="2B" d="M698 274L413 274L413 559C413 575 405 583 389 583C373 583 365 575 365 559L365 274L80 274C64 274 56 266 56 250C56 234 64 226 80 226L365 226L365-59C365-75 373-83 389-83C405-83 413-75 413-59L413 226L698 226C714 226 722 234 722 250C722 263 711 274 698 274Z"></path></g><g data-mml-node="mi" data-latex="z" transform="translate(4016.4,0)"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="mi" data-latex="F" transform="translate(4483.4,0)"><path data-c="1D439" d="M199 656C199 646 210 641 231 641C271 641 291 637 291 628C291 625 289 618 286 605L156 82C150 60 140 47 126 42C119 40 101 39 70 39C48 39 38 37 38 16C38 5 44 0 57 0L187 3L335 0C351 0 359 8 359 23C359 40 348 39 322 39C278 39 253 41 247 46C244 47 243 51 243 56L307 321L400 321C446 321 478 319 478 281C478 268 476 252 471 233C470 230 469 226 468 222C468 211 473 206 484 206C489 207 496 214 503 229L557 444C559 452 560 458 560 461C557 470 551 475 544 475C536 475 530 467 526 452C516 414 502 390 486 378C470 366 442 360 402 360L317 360L379 606C387 640 387 641 429 641L559 641C656 641 700 626 700 537C700 517 699 499 697 484C696 473 695 467 695 466C695 455 700 450 710 450C720 450 726 459 728 478L748 649C751 677 744 680 717 680L233 680C210 680 199 679 199 656Z"></path></g><g data-mml-node="mi" data-latex="a" transform="translate(5234.4,0)"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(5763.4,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g><g data-mml-node="mo" data-latex="-" transform="translate(6436.7,0)"><path data-c="2212" d="M698 270L80 270C64 270 56 263 56 250C56 237 64 230 80 230L698 230C714 230 722 237 722 250C722 262 710 270 698 270Z"></path></g><g data-mml-node="mfrac" data-latex="\frac{zNear \cdot zFar}{z_{mid}}" transform="translate(7436.9,0)"><g data-mml-node="mrow" transform="translate(220,394) scale(0.707)" data-latex="zNear \cdot zFar"><g data-mml-node="mi" data-latex="z"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="mi" data-latex="N" transform="translate(467,0)"><path data-c="1D441" d="M864 683C845 683 783 680 764 680C745 680 682 683 663 683C648 683 641 675 641 659C641 650 648 645 663 644C705 644 726 631 726 605C726 599 725 592 724 585L616 157L401 662C393 681 391 683 366 683L233 683C209 683 200 681 200 659C200 649 211 644 232 644C274 644 295 643 296 640L163 110C154 71 131 49 95 42C69 39 39 43 39 15C39 5 45 0 56 0C74 0 136 3 155 3C174 3 238 0 257 0C272 0 279 8 279 24C279 33 271 38 255 39C214 40 194 53 194 78C194 83 195 90 197 100L326 611L576 21C582 7 590 0 599 0C608 0 614 8 618 24L757 574C770 625 798 643 860 644C874 645 881 653 881 669C878 678 877 683 864 683Z"></path></g><g data-mml-node="mi" data-latex="e" transform="translate(1348,0)"><path data-c="1D452" d="M124 129C124 153 129 186 139 227L188 227C253 227 303 235 339 250C372 264 394 284 405 309C412 326 415 342 415 355C415 410 363 442 307 442C268 442 229 432 190 412C113 372 46 281 46 171C46 69 105-11 204-11C257-11 304 2 345 27C379 48 404 69 420 90C427 99 430 106 430 109C430 120 425 126 414 126C409 126 404 122 398 114C365 70 324 42 277 30C246 22 223 18 206 18C149 18 124 72 124 129M375 355C375 289 311 256 182 256L147 256C166 322 194 366 232 387C262 404 287 413 307 413C343 413 375 391 375 355Z"></path></g><g data-mml-node="mi" data-latex="a" transform="translate(1814,0)"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(2343,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g><g data-mml-node="mo" data-latex="\cdot" transform="translate(2794,0)"><path data-c="22C5" d="M192 250C192 279 168 303 139 303C110 303 86 279 86 250C86 221 110 197 139 197C168 197 192 221 192 250Z"></path></g><g data-mml-node="mi" data-latex="z" transform="translate(3072,0)"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="mi" data-latex="F" transform="translate(3539,0)"><path data-c="1D439" d="M199 656C199 646 210 641 231 641C271 641 291 637 291 628C291 625 289 618 286 605L156 82C150 60 140 47 126 42C119 40 101 39 70 39C48 39 38 37 38 16C38 5 44 0 57 0L187 3L335 0C351 0 359 8 359 23C359 40 348 39 322 39C278 39 253 41 247 46C244 47 243 51 243 56L307 321L400 321C446 321 478 319 478 281C478 268 476 252 471 233C470 230 469 226 468 222C468 211 473 206 484 206C489 207 496 214 503 229L557 444C559 452 560 458 560 461C557 470 551 475 544 475C536 475 530 467 526 452C516 414 502 390 486 378C470 366 442 360 402 360L317 360L379 606C387 640 387 641 429 641L559 641C656 641 700 626 700 537C700 517 699 499 697 484C696 473 695 467 695 466C695 455 700 450 710 450C720 450 726 459 728 478L748 649C751 677 744 680 717 680L233 680C210 680 199 679 199 656Z"></path></g><g data-mml-node="mi" data-latex="a" transform="translate(4290,0)"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(4819,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g></g><g data-mml-node="msub" transform="translate(1453.7,-345) scale(0.707)" data-latex="z_{mid}"><g data-mml-node="mi" data-latex="z"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="TeXAtom" transform="translate(498,-150) scale(0.707)" data-latex="{m i d}" data-mjx-texclass="ORD"><g data-mml-node="mi" data-latex="m"><path data-c="1D45A" d="M657 442C596 442 543 412 498 353C489 412 451 442 383 442C324 442 273 416 231 363C223 407 188 442 137 442C96 442 66 409 45 344C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 66 299C84 375 107 413 134 413C152 413 161 399 161 371C161 358 156 331 145 290L88 63C84 51 79 25 79 19C79-1 90-11 111-11C131-11 145-1 152 19C153 24 160 49 171 92L192 181L222 295C233 318 250 341 272 365C301 397 337 413 380 413C413 413 429 391 429 348C429 335 424 308 414 267L387 153C380 124 364 64 356 32C355 25 354 21 354 19C354-1 365-11 387-11C398-11 406-8 413-1C428 14 429 21 435 48L494 285C497 298 511 321 535 353C565 393 605 413 654 413C687 413 703 391 703 348C703 309 683 236 642 129C633 106 629 87 629 74C629 25 666-11 714-11C759-11 793 14 818 64C838 104 848 131 848 144C848 153 843 158 832 158C825 157 818 148 813 137C791 58 759 18 716 18C703 18 696 28 696 47C696 62 702 84 714 115C755 222 775 295 775 333C775 404 728 442 657 442Z"></path></g><g data-mml-node="mi" data-latex="i" transform="translate(878,0)"><path data-c="1D456" d="M284 621C284 648 271 661 244 661C216 661 188 633 188 605C188 578 202 565 229 565C257 565 284 593 284 621M259 138C237 59 205 19 164 19C151 19 144 28 144 47C144 64 173 150 232 306C240 329 244 347 244 360C244 409 210 445 161 445C118 445 84 420 59 369C39 328 29 301 29 288C29 279 34 275 45 275C58 275 60 281 64 295C87 375 118 415 158 415C171 415 178 406 178 387C178 373 175 357 168 338C145 275 121 208 101 155C86 115 78 88 78 74C78 25 114-11 162-11C205-11 239 14 264 64C283 103 293 130 293 145C293 154 288 159 277 159C274 159 259 150 259 138Z"></path></g><g data-mml-node="mi" data-latex="d" transform="translate(1223,0)"><path data-c="1D451" d="M429 632L370 389C349 426 320 445 281 445C216 445 159 412 109 345C63 283 40 218 40 151C40 63 91-11 175-11C218-11 260 12 300 59C311 21 345-11 392-11C461-11 483 71 498 145C498 154 493 159 483 159C474 159 468 152 465 138C445 59 421 19 394 19C377 19 368 33 368 60C368 75 370 91 374 107L516 679L516 683C513 690 507 694 499 694C476 694 434 690 374 683C363 682 357 674 357 660C357 650 366 645 384 645C403 645 429 646 429 632M341 376C351 355 356 341 356 332C355 328 354 323 353 316L304 122C301 111 294 99 285 87C248 42 212 19 177 19C138 19 118 49 118 108C118 132 124 168 136 216C157 301 187 359 224 390C244 407 263 415 282 415C309 415 329 402 341 376Z"></path></g></g></g><rect width="3926.5" height="60" x="120" y="220"></rect></g></g></g><g data-mml-node="mtr" transform="translate(0,-2600.3)"><g data-mml-node="mtd" transform="translate(5551.7,0)"><g data-mml-node="mn" data-latex="1"><path data-c="31" d="M269 666C228 624 168 603 89 603L89 564C141 564 184 572 217 588L217 82C217 64 213 52 204 47C195 42 170 39 130 39L95 39L95 0C120 2 174 3 257 3C340 3 394 2 419 0L419 39L384 39C343 39 318 42 310 47C302 52 297 64 297 82L297 636C297 660 295 666 269 666Z"></path></g></g></g></g><g data-mml-node="mo" transform="translate(12478.3,0)"><path data-c="239E" d="M490 0L598 0L598 253C598 581 487 920 363 1150C281 1301 190 1415 91 1490C87 1493 82 1495 77 1495C60 1495 52 1487 52 1470C52 1462 55 1455 62 1450C143 1389 216 1292 283 1160C402 924 490 593 490 253Z" transform="translate(0,1855.3)"></path><path data-c="23A0" d="M598 1242L598 1495L490 1495L490 1242C490 1088 472 933 437 776C375 494 246 184 63 44C56 40 52 34 52 25C52 8 60 0 77 0C82 0 87 2 91 5C178 71 261 170 339 303C477 539 598 892 598 1242Z" transform="translate(0,-2850.3)"></path><svg width="875" height="3350.6" y="-1425.3" x="0" viewBox="0 837.6 875 3350.6"><path data-c="239F" d="M490 0L598 0L598 498L490 498Z" transform="scale(1,10.092)"></path></svg></g></g></g></g></svg></mjx-container></p></li><li><p>得到新的深度 <mjx-container class="MathJax" jax="SVG" overflow="overflow"><svg style="vertical-align: -0.576ex;" xmlns="http://www.w3.org/2000/svg" width="4.028ex" height="2.276ex" role="img" focusable="false" viewBox="0 -751.2 1780.5 1006"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="z_{mid}’ = zNear + zFar - \frac{zNear \cdot zFar}{z_{mid}}"><g data-mml-node="msubsup" data-latex="z_{m i d}"><g data-mml-node="mi" data-latex="z"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="mo" transform="translate(550.1,363) scale(0.707)" data-latex="’"><path data-c="2032" d="M284 549C259 549 242 539 233 518L65 96L110 96L332 463C337 472 340 482 340 493C340 523 314 549 284 549Z"></path></g><g data-mml-node="TeXAtom" transform="translate(498,-247) scale(0.707)" data-latex="{m i d}" data-mjx-texclass="ORD"><g data-mml-node="mi" data-latex="m"><path data-c="1D45A" d="M657 442C596 442 543 412 498 353C489 412 451 442 383 442C324 442 273 416 231 363C223 407 188 442 137 442C96 442 66 409 45 344C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 66 299C84 375 107 413 134 413C152 413 161 399 161 371C161 358 156 331 145 290L88 63C84 51 79 25 79 19C79-1 90-11 111-11C131-11 145-1 152 19C153 24 160 49 171 92L192 181L222 295C233 318 250 341 272 365C301 397 337 413 380 413C413 413 429 391 429 348C429 335 424 308 414 267L387 153C380 124 364 64 356 32C355 25 354 21 354 19C354-1 365-11 387-11C398-11 406-8 413-1C428 14 429 21 435 48L494 285C497 298 511 321 535 353C565 393 605 413 654 413C687 413 703 391 703 348C703 309 683 236 642 129C633 106 629 87 629 74C629 25 666-11 714-11C759-11 793 14 818 64C838 104 848 131 848 144C848 153 843 158 832 158C825 157 818 148 813 137C791 58 759 18 716 18C703 18 696 28 696 47C696 62 702 84 714 115C755 222 775 295 775 333C775 404 728 442 657 442Z"></path></g><g data-mml-node="mi" data-latex="i" transform="translate(878,0)"><path data-c="1D456" d="M284 621C284 648 271 661 244 661C216 661 188 633 188 605C188 578 202 565 229 565C257 565 284 593 284 621M259 138C237 59 205 19 164 19C151 19 144 28 144 47C144 64 173 150 232 306C240 329 244 347 244 360C244 409 210 445 161 445C118 445 84 420 59 369C39 328 29 301 29 288C29 279 34 275 45 275C58 275 60 281 64 295C87 375 118 415 158 415C171 415 178 406 178 387C178 373 175 357 168 338C145 275 121 208 101 155C86 115 78 88 78 74C78 25 114-11 162-11C205-11 239 14 264 64C283 103 293 130 293 145C293 154 288 159 277 159C274 159 259 150 259 138Z"></path></g><g data-mml-node="mi" data-latex="d" transform="translate(1223,0)"><path data-c="1D451" d="M429 632L370 389C349 426 320 445 281 445C216 445 159 412 109 345C63 283 40 218 40 151C40 63 91-11 175-11C218-11 260 12 300 59C311 21 345-11 392-11C461-11 483 71 498 145C498 154 493 159 483 159C474 159 468 152 465 138C445 59 421 19 394 19C377 19 368 33 368 60C368 75 370 91 374 107L516 679L516 683C513 690 507 694 499 694C476 694 434 690 374 683C363 682 357 674 357 660C357 650 366 645 384 645C403 645 429 646 429 632M341 376C351 355 356 341 356 332C355 328 354 323 353 316L304 122C301 111 294 99 285 87C248 42 212 19 177 19C138 19 118 49 118 108C118 132 124 168 136 216C157 301 187 359 224 390C244 407 263 415 282 415C309 415 329 402 341 376Z"></path></g></g></g></g></g></svg><mjx-break size="4"> </mjx-break><svg style="vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="8.71ex" height="2.262ex" role="img" focusable="false" viewBox="0 -750 3849.8 1000"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="z_{mid}’ = zNear + zFar - \frac{zNear \cdot zFar}{z_{mid}}"><g data-mml-node="mo" data-latex="="><path data-c="3D" d="M698 367L80 367C64 367 56 359 56 344C56 329 64 321 80 321L698 321C714 321 722 329 722 344C722 356 711 367 698 367M698 179L80 179C64 179 56 171 56 156C56 141 64 133 80 133L698 133C714 133 722 141 722 156C722 169 711 179 698 179Z"></path></g><g data-mml-node="mi" data-latex="z" transform="translate(1055.8,0)"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="mi" data-latex="N" transform="translate(1522.8,0)"><path data-c="1D441" d="M864 683C845 683 783 680 764 680C745 680 682 683 663 683C648 683 641 675 641 659C641 650 648 645 663 644C705 644 726 631 726 605C726 599 725 592 724 585L616 157L401 662C393 681 391 683 366 683L233 683C209 683 200 681 200 659C200 649 211 644 232 644C274 644 295 643 296 640L163 110C154 71 131 49 95 42C69 39 39 43 39 15C39 5 45 0 56 0C74 0 136 3 155 3C174 3 238 0 257 0C272 0 279 8 279 24C279 33 271 38 255 39C214 40 194 53 194 78C194 83 195 90 197 100L326 611L576 21C582 7 590 0 599 0C608 0 614 8 618 24L757 574C770 625 798 643 860 644C874 645 881 653 881 669C878 678 877 683 864 683Z"></path></g><g data-mml-node="mi" data-latex="e" transform="translate(2403.8,0)"><path data-c="1D452" d="M124 129C124 153 129 186 139 227L188 227C253 227 303 235 339 250C372 264 394 284 405 309C412 326 415 342 415 355C415 410 363 442 307 442C268 442 229 432 190 412C113 372 46 281 46 171C46 69 105-11 204-11C257-11 304 2 345 27C379 48 404 69 420 90C427 99 430 106 430 109C430 120 425 126 414 126C409 126 404 122 398 114C365 70 324 42 277 30C246 22 223 18 206 18C149 18 124 72 124 129M375 355C375 289 311 256 182 256L147 256C166 322 194 366 232 387C262 404 287 413 307 413C343 413 375 391 375 355Z"></path></g><g data-mml-node="mi" data-latex="a" transform="translate(2869.8,0)"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(3398.8,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g></g></g></svg><mjx-break size="3"> </mjx-break><svg style="vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="7.236ex" height="2.262ex" role="img" focusable="false" viewBox="0 -750 3198.2 1000"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="z_{mid}’ = zNear + zFar - \frac{zNear \cdot zFar}{z_{mid}}"><g data-mml-node="mo" data-latex="+"><path data-c="2B" d="M698 274L413 274L413 559C413 575 405 583 389 583C373 583 365 575 365 559L365 274L80 274C64 274 56 266 56 250C56 234 64 226 80 226L365 226L365-59C365-75 373-83 389-83C405-83 413-75 413-59L413 226L698 226C714 226 722 234 722 250C722 263 711 274 698 274Z"></path></g><g data-mml-node="mi" data-latex="z" transform="translate(1000.2,0)"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="mi" data-latex="F" transform="translate(1467.2,0)"><path data-c="1D439" d="M199 656C199 646 210 641 231 641C271 641 291 637 291 628C291 625 289 618 286 605L156 82C150 60 140 47 126 42C119 40 101 39 70 39C48 39 38 37 38 16C38 5 44 0 57 0L187 3L335 0C351 0 359 8 359 23C359 40 348 39 322 39C278 39 253 41 247 46C244 47 243 51 243 56L307 321L400 321C446 321 478 319 478 281C478 268 476 252 471 233C470 230 469 226 468 222C468 211 473 206 484 206C489 207 496 214 503 229L557 444C559 452 560 458 560 461C557 470 551 475 544 475C536 475 530 467 526 452C516 414 502 390 486 378C470 366 442 360 402 360L317 360L379 606C387 640 387 641 429 641L559 641C656 641 700 626 700 537C700 517 699 499 697 484C696 473 695 467 695 466C695 455 700 450 710 450C720 450 726 459 728 478L748 649C751 677 744 680 717 680L233 680C210 680 199 679 199 656Z"></path></g><g data-mml-node="mi" data-latex="a" transform="translate(2218.2,0)"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(2747.2,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g></g></g></svg><mjx-break size="3"> </mjx-break><svg style="vertical-align: -1.033ex;" xmlns="http://www.w3.org/2000/svg" width="11.689ex" height="3.017ex" role="img" focusable="false" viewBox="0 -877 5166.7 1333.5"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="z_{mid}’ = zNear + zFar - \frac{zNear \cdot zFar}{z_{mid}}"><g data-mml-node="mo" data-latex="-"><path data-c="2212" d="M698 270L80 270C64 270 56 263 56 250C56 237 64 230 80 230L698 230C714 230 722 237 722 250C722 262 710 270 698 270Z"></path></g><g data-mml-node="mfrac" data-latex="\frac{zNear \cdot zFar}{z_{mid}}" transform="translate(1000.2,0)"><g data-mml-node="mrow" transform="translate(220,394) scale(0.707)" data-latex="zNear \cdot zFar"><g data-mml-node="mi" data-latex="z"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="mi" data-latex="N" transform="translate(467,0)"><path data-c="1D441" d="M864 683C845 683 783 680 764 680C745 680 682 683 663 683C648 683 641 675 641 659C641 650 648 645 663 644C705 644 726 631 726 605C726 599 725 592 724 585L616 157L401 662C393 681 391 683 366 683L233 683C209 683 200 681 200 659C200 649 211 644 232 644C274 644 295 643 296 640L163 110C154 71 131 49 95 42C69 39 39 43 39 15C39 5 45 0 56 0C74 0 136 3 155 3C174 3 238 0 257 0C272 0 279 8 279 24C279 33 271 38 255 39C214 40 194 53 194 78C194 83 195 90 197 100L326 611L576 21C582 7 590 0 599 0C608 0 614 8 618 24L757 574C770 625 798 643 860 644C874 645 881 653 881 669C878 678 877 683 864 683Z"></path></g><g data-mml-node="mi" data-latex="e" transform="translate(1348,0)"><path data-c="1D452" d="M124 129C124 153 129 186 139 227L188 227C253 227 303 235 339 250C372 264 394 284 405 309C412 326 415 342 415 355C415 410 363 442 307 442C268 442 229 432 190 412C113 372 46 281 46 171C46 69 105-11 204-11C257-11 304 2 345 27C379 48 404 69 420 90C427 99 430 106 430 109C430 120 425 126 414 126C409 126 404 122 398 114C365 70 324 42 277 30C246 22 223 18 206 18C149 18 124 72 124 129M375 355C375 289 311 256 182 256L147 256C166 322 194 366 232 387C262 404 287 413 307 413C343 413 375 391 375 355Z"></path></g><g data-mml-node="mi" data-latex="a" transform="translate(1814,0)"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(2343,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g><g data-mml-node="mo" data-latex="\cdot" transform="translate(2794,0)"><path data-c="22C5" d="M192 250C192 279 168 303 139 303C110 303 86 279 86 250C86 221 110 197 139 197C168 197 192 221 192 250Z"></path></g><g data-mml-node="mi" data-latex="z" transform="translate(3072,0)"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="mi" data-latex="F" transform="translate(3539,0)"><path data-c="1D439" d="M199 656C199 646 210 641 231 641C271 641 291 637 291 628C291 625 289 618 286 605L156 82C150 60 140 47 126 42C119 40 101 39 70 39C48 39 38 37 38 16C38 5 44 0 57 0L187 3L335 0C351 0 359 8 359 23C359 40 348 39 322 39C278 39 253 41 247 46C244 47 243 51 243 56L307 321L400 321C446 321 478 319 478 281C478 268 476 252 471 233C470 230 469 226 468 222C468 211 473 206 484 206C489 207 496 214 503 229L557 444C559 452 560 458 560 461C557 470 551 475 544 475C536 475 530 467 526 452C516 414 502 390 486 378C470 366 442 360 402 360L317 360L379 606C387 640 387 641 429 641L559 641C656 641 700 626 700 537C700 517 699 499 697 484C696 473 695 467 695 466C695 455 700 450 710 450C720 450 726 459 728 478L748 649C751 677 744 680 717 680L233 680C210 680 199 679 199 656Z"></path></g><g data-mml-node="mi" data-latex="a" transform="translate(4290,0)"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(4819,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g></g><g data-mml-node="msub" transform="translate(1453.7,-345) scale(0.707)" data-latex="z_{mid}"><g data-mml-node="mi" data-latex="z"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="TeXAtom" transform="translate(498,-150) scale(0.707)" data-latex="{m i d}" data-mjx-texclass="ORD"><g data-mml-node="mi" data-latex="m"><path data-c="1D45A" d="M657 442C596 442 543 412 498 353C489 412 451 442 383 442C324 442 273 416 231 363C223 407 188 442 137 442C96 442 66 409 45 344C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 66 299C84 375 107 413 134 413C152 413 161 399 161 371C161 358 156 331 145 290L88 63C84 51 79 25 79 19C79-1 90-11 111-11C131-11 145-1 152 19C153 24 160 49 171 92L192 181L222 295C233 318 250 341 272 365C301 397 337 413 380 413C413 413 429 391 429 348C429 335 424 308 414 267L387 153C380 124 364 64 356 32C355 25 354 21 354 19C354-1 365-11 387-11C398-11 406-8 413-1C428 14 429 21 435 48L494 285C497 298 511 321 535 353C565 393 605 413 654 413C687 413 703 391 703 348C703 309 683 236 642 129C633 106 629 87 629 74C629 25 666-11 714-11C759-11 793 14 818 64C838 104 848 131 848 144C848 153 843 158 832 158C825 157 818 148 813 137C791 58 759 18 716 18C703 18 696 28 696 47C696 62 702 84 714 115C755 222 775 295 775 333C775 404 728 442 657 442Z"></path></g><g data-mml-node="mi" data-latex="i" transform="translate(878,0)"><path data-c="1D456" d="M284 621C284 648 271 661 244 661C216 661 188 633 188 605C188 578 202 565 229 565C257 565 284 593 284 621M259 138C237 59 205 19 164 19C151 19 144 28 144 47C144 64 173 150 232 306C240 329 244 347 244 360C244 409 210 445 161 445C118 445 84 420 59 369C39 328 29 301 29 288C29 279 34 275 45 275C58 275 60 281 64 295C87 375 118 415 158 415C171 415 178 406 178 387C178 373 175 357 168 338C145 275 121 208 101 155C86 115 78 88 78 74C78 25 114-11 162-11C205-11 239 14 264 64C283 103 293 130 293 145C293 154 288 159 277 159C274 159 259 150 259 138Z"></path></g><g data-mml-node="mi" data-latex="d" transform="translate(1223,0)"><path data-c="1D451" d="M429 632L370 389C349 426 320 445 281 445C216 445 159 412 109 345C63 283 40 218 40 151C40 63 91-11 175-11C218-11 260 12 300 59C311 21 345-11 392-11C461-11 483 71 498 145C498 154 493 159 483 159C474 159 468 152 465 138C445 59 421 19 394 19C377 19 368 33 368 60C368 75 370 91 374 107L516 679L516 683C513 690 507 694 499 694C476 694 434 690 374 683C363 682 357 674 357 660C357 650 366 645 384 645C403 645 429 646 429 632M341 376C351 355 356 341 356 332C355 328 354 323 353 316L304 122C301 111 294 99 285 87C248 42 212 19 177 19C138 19 118 49 118 108C118 132 124 168 136 216C157 301 187 359 224 390C244 407 263 415 282 415C309 415 329 402 341 376Z"></path></g></g></g><rect width="3926.5" height="60" x="120" y="220"></rect></g></g></g></svg></mjx-container>，与 <mjx-container class="MathJax" jax="SVG" overflow="overflow"><svg style="vertical-align: -0.357ex;" xmlns="http://www.w3.org/2000/svg" width="4.028ex" height="1.357ex" role="img" focusable="false" viewBox="0 -442 1780.5 599.8"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="z_{mid}"><g data-mml-node="msub" data-latex="z_{mid}"><g data-mml-node="mi" data-latex="z"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="TeXAtom" transform="translate(498,-150) scale(0.707)" data-latex="{m i d}" data-mjx-texclass="ORD"><g data-mml-node="mi" data-latex="m"><path data-c="1D45A" d="M657 442C596 442 543 412 498 353C489 412 451 442 383 442C324 442 273 416 231 363C223 407 188 442 137 442C96 442 66 409 45 344C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 66 299C84 375 107 413 134 413C152 413 161 399 161 371C161 358 156 331 145 290L88 63C84 51 79 25 79 19C79-1 90-11 111-11C131-11 145-1 152 19C153 24 160 49 171 92L192 181L222 295C233 318 250 341 272 365C301 397 337 413 380 413C413 413 429 391 429 348C429 335 424 308 414 267L387 153C380 124 364 64 356 32C355 25 354 21 354 19C354-1 365-11 387-11C398-11 406-8 413-1C428 14 429 21 435 48L494 285C497 298 511 321 535 353C565 393 605 413 654 413C687 413 703 391 703 348C703 309 683 236 642 129C633 106 629 87 629 74C629 25 666-11 714-11C759-11 793 14 818 64C838 104 848 131 848 144C848 153 843 158 832 158C825 157 818 148 813 137C791 58 759 18 716 18C703 18 696 28 696 47C696 62 702 84 714 115C755 222 775 295 775 333C775 404 728 442 657 442Z"></path></g><g data-mml-node="mi" data-latex="i" transform="translate(878,0)"><path data-c="1D456" d="M284 621C284 648 271 661 244 661C216 661 188 633 188 605C188 578 202 565 229 565C257 565 284 593 284 621M259 138C237 59 205 19 164 19C151 19 144 28 144 47C144 64 173 150 232 306C240 329 244 347 244 360C244 409 210 445 161 445C118 445 84 420 59 369C39 328 29 301 29 288C29 279 34 275 45 275C58 275 60 281 64 295C87 375 118 415 158 415C171 415 178 406 178 387C178 373 175 357 168 338C145 275 121 208 101 155C86 115 78 88 78 74C78 25 114-11 162-11C205-11 239 14 264 64C283 103 293 130 293 145C293 154 288 159 277 159C274 159 259 150 259 138Z"></path></g><g data-mml-node="mi" data-latex="d" transform="translate(1223,0)"><path data-c="1D451" d="M429 632L370 389C349 426 320 445 281 445C216 445 159 412 109 345C63 283 40 218 40 151C40 63 91-11 175-11C218-11 260 12 300 59C311 21 345-11 392-11C461-11 483 71 498 145C498 154 493 159 483 159C474 159 468 152 465 138C445 59 421 19 394 19C377 19 368 33 368 60C368 75 370 91 374 107L516 679L516 683C513 690 507 694 499 694C476 694 434 690 374 683C363 682 357 674 357 660C357 650 366 645 384 645C403 645 429 646 429 632M341 376C351 355 356 341 356 332C355 328 354 323 353 316L304 122C301 111 294 99 285 87C248 42 212 19 177 19C138 19 118 49 118 108C118 132 124 168 136 216C157 301 187 359 224 390C244 407 263 415 282 415C309 415 329 402 341 376Z"></path></g></g></g></g></g></svg></mjx-container> 相减：</p><p>  <mjx-container class="MathJax" jax="SVG" overflow="overflow" display="true"><svg style="vertical-align: -2.163ex;" xmlns="http://www.w3.org/2000/svg" width="34.352ex" height="5.651ex" role="img" focusable="false" viewBox="0 -1541.9 15183.6 2497.9"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="  z_{P}’ - z_{mid} = \frac{(zNear - zFar)^{2}}{2(zNear + zFar)} < 0  "><g data-mml-node="msubsup" data-latex="z_{P}"><g data-mml-node="mi" data-latex="z"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="mo" transform="translate(550.1,413) scale(0.707)" data-latex="’"><path data-c="2032" d="M284 549C259 549 242 539 233 518L65 96L110 96L332 463C337 472 340 482 340 493C340 523 314 549 284 549Z"></path></g><g data-mml-node="TeXAtom" transform="translate(498,-247) scale(0.707)" data-latex="{P}" data-mjx-texclass="ORD"><g data-mml-node="mi" data-latex="P"><path data-c="1D443" d="M555 683L235 683C212 683 201 682 201 660C201 649 212 644 234 644C254 644 294 647 294 631C294 629 293 623 290 613L158 82C152 60 142 47 128 42C121 40 103 39 72 39C50 39 40 37 40 16C40 5 46 0 59 0L184 3L248 2C259 2 299 0 312 0C328 0 336 8 336 24C336 34 325 39 304 39C264 39 244 43 244 52C244 52 245 55 247 68L307 312L472 312C537 312 599 332 657 371C722 414 754 467 754 530C754 629 660 683 555 683M524 644C611 644 654 614 654 554C654 498 626 423 597 397C559 363 509 346 447 346L313 346L379 610C387 644 387 644 429 644Z"></path></g></g></g><g data-mml-node="mo" data-latex="-" transform="translate(1303.4,0)"><path data-c="2212" d="M698 270L80 270C64 270 56 263 56 250C56 237 64 230 80 230L698 230C714 230 722 237 722 250C722 262 710 270 698 270Z"></path></g><g data-mml-node="msub" data-latex="z_{m i d}" transform="translate(2303.6,0)"><g data-mml-node="mi" data-latex="z"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="TeXAtom" transform="translate(498,-150) scale(0.707)" data-latex="{m i d}" data-mjx-texclass="ORD"><g data-mml-node="mi" data-latex="m"><path data-c="1D45A" d="M657 442C596 442 543 412 498 353C489 412 451 442 383 442C324 442 273 416 231 363C223 407 188 442 137 442C96 442 66 409 45 344C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 66 299C84 375 107 413 134 413C152 413 161 399 161 371C161 358 156 331 145 290L88 63C84 51 79 25 79 19C79-1 90-11 111-11C131-11 145-1 152 19C153 24 160 49 171 92L192 181L222 295C233 318 250 341 272 365C301 397 337 413 380 413C413 413 429 391 429 348C429 335 424 308 414 267L387 153C380 124 364 64 356 32C355 25 354 21 354 19C354-1 365-11 387-11C398-11 406-8 413-1C428 14 429 21 435 48L494 285C497 298 511 321 535 353C565 393 605 413 654 413C687 413 703 391 703 348C703 309 683 236 642 129C633 106 629 87 629 74C629 25 666-11 714-11C759-11 793 14 818 64C838 104 848 131 848 144C848 153 843 158 832 158C825 157 818 148 813 137C791 58 759 18 716 18C703 18 696 28 696 47C696 62 702 84 714 115C755 222 775 295 775 333C775 404 728 442 657 442Z"></path></g><g data-mml-node="mi" data-latex="i" transform="translate(878,0)"><path data-c="1D456" d="M284 621C284 648 271 661 244 661C216 661 188 633 188 605C188 578 202 565 229 565C257 565 284 593 284 621M259 138C237 59 205 19 164 19C151 19 144 28 144 47C144 64 173 150 232 306C240 329 244 347 244 360C244 409 210 445 161 445C118 445 84 420 59 369C39 328 29 301 29 288C29 279 34 275 45 275C58 275 60 281 64 295C87 375 118 415 158 415C171 415 178 406 178 387C178 373 175 357 168 338C145 275 121 208 101 155C86 115 78 88 78 74C78 25 114-11 162-11C205-11 239 14 264 64C283 103 293 130 293 145C293 154 288 159 277 159C274 159 259 150 259 138Z"></path></g><g data-mml-node="mi" data-latex="d" transform="translate(1223,0)"><path data-c="1D451" d="M429 632L370 389C349 426 320 445 281 445C216 445 159 412 109 345C63 283 40 218 40 151C40 63 91-11 175-11C218-11 260 12 300 59C311 21 345-11 392-11C461-11 483 71 498 145C498 154 493 159 483 159C474 159 468 152 465 138C445 59 421 19 394 19C377 19 368 33 368 60C368 75 370 91 374 107L516 679L516 683C513 690 507 694 499 694C476 694 434 690 374 683C363 682 357 674 357 660C357 650 366 645 384 645C403 645 429 646 429 632M341 376C351 355 356 341 356 332C355 328 354 323 353 316L304 122C301 111 294 99 285 87C248 42 212 19 177 19C138 19 118 49 118 108C118 132 124 168 136 216C157 301 187 359 224 390C244 407 263 415 282 415C309 415 329 402 341 376Z"></path></g></g></g><g data-mml-node="mo" data-latex="=" transform="translate(4361.9,0)"><path data-c="3D" d="M698 367L80 367C64 367 56 359 56 344C56 329 64 321 80 321L698 321C714 321 722 329 722 344C722 356 711 367 698 367M698 179L80 179C64 179 56 171 56 156C56 141 64 133 80 133L698 133C714 133 722 141 722 156C722 169 711 179 698 179Z"></path></g><g data-mml-node="mfrac" data-latex="\frac{(zNear - zFar)^{2}}{2(zNear + zFar)}" transform="translate(5417.6,0)"><g data-mml-node="mrow" data-latex="(zNear - zFar)^{2}" transform="translate(251.7,708)"><g data-mml-node="mo" data-latex="("><path data-c="28" d="M318-248C327-248 332-243 332-234C332-231 330-227 327-223C275-183 233-117 202-26C175 53 161 131 161 208L161 292C161 369 175 447 202 526C233 617 275 683 327 723C330 726 332 730 332 734C332 743 327 748 318 748C317 748 314 747 311 745C251 699 201 631 160 540C121 453 101 371 101 292L101 208C101 129 121 47 160-40C201-131 251-199 311-245C314-247 317-248 318-248Z"></path></g><g data-mml-node="mi" data-latex="z" transform="translate(389,0)"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="mi" data-latex="N" transform="translate(856,0)"><path data-c="1D441" d="M864 683C845 683 783 680 764 680C745 680 682 683 663 683C648 683 641 675 641 659C641 650 648 645 663 644C705 644 726 631 726 605C726 599 725 592 724 585L616 157L401 662C393 681 391 683 366 683L233 683C209 683 200 681 200 659C200 649 211 644 232 644C274 644 295 643 296 640L163 110C154 71 131 49 95 42C69 39 39 43 39 15C39 5 45 0 56 0C74 0 136 3 155 3C174 3 238 0 257 0C272 0 279 8 279 24C279 33 271 38 255 39C214 40 194 53 194 78C194 83 195 90 197 100L326 611L576 21C582 7 590 0 599 0C608 0 614 8 618 24L757 574C770 625 798 643 860 644C874 645 881 653 881 669C878 678 877 683 864 683Z"></path></g><g data-mml-node="mi" data-latex="e" transform="translate(1737,0)"><path data-c="1D452" d="M124 129C124 153 129 186 139 227L188 227C253 227 303 235 339 250C372 264 394 284 405 309C412 326 415 342 415 355C415 410 363 442 307 442C268 442 229 432 190 412C113 372 46 281 46 171C46 69 105-11 204-11C257-11 304 2 345 27C379 48 404 69 420 90C427 99 430 106 430 109C430 120 425 126 414 126C409 126 404 122 398 114C365 70 324 42 277 30C246 22 223 18 206 18C149 18 124 72 124 129M375 355C375 289 311 256 182 256L147 256C166 322 194 366 232 387C262 404 287 413 307 413C343 413 375 391 375 355Z"></path></g><g data-mml-node="mi" data-latex="a" transform="translate(2203,0)"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(2732,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g><g data-mml-node="mo" data-latex="-" transform="translate(3405.2,0)"><path data-c="2212" d="M698 270L80 270C64 270 56 263 56 250C56 237 64 230 80 230L698 230C714 230 722 237 722 250C722 262 710 270 698 270Z"></path></g><g data-mml-node="mi" data-latex="z" transform="translate(4405.4,0)"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="mi" data-latex="F" transform="translate(4872.4,0)"><path data-c="1D439" d="M199 656C199 646 210 641 231 641C271 641 291 637 291 628C291 625 289 618 286 605L156 82C150 60 140 47 126 42C119 40 101 39 70 39C48 39 38 37 38 16C38 5 44 0 57 0L187 3L335 0C351 0 359 8 359 23C359 40 348 39 322 39C278 39 253 41 247 46C244 47 243 51 243 56L307 321L400 321C446 321 478 319 478 281C478 268 476 252 471 233C470 230 469 226 468 222C468 211 473 206 484 206C489 207 496 214 503 229L557 444C559 452 560 458 560 461C557 470 551 475 544 475C536 475 530 467 526 452C516 414 502 390 486 378C470 366 442 360 402 360L317 360L379 606C387 640 387 641 429 641L559 641C656 641 700 626 700 537C700 517 699 499 697 484C696 473 695 467 695 466C695 455 700 450 710 450C720 450 726 459 728 478L748 649C751 677 744 680 717 680L233 680C210 680 199 679 199 656Z"></path></g><g data-mml-node="mi" data-latex="a" transform="translate(5623.4,0)"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(6152.4,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g><g data-mml-node="msup" data-latex=")^{2}" transform="translate(6603.4,0)"><g data-mml-node="mo" data-latex=")"><path data-c="29" d="M78-245C138-199 188-131 229-40C268 47 288 129 288 208L288 292C288 371 268 453 229 540C188 631 138 699 78 745C75 747 72 748 71 748C62 748 57 743 57 734C57 730 59 726 62 723C114 683 156 617 187 526C214 447 228 369 228 292L228 208C228 131 214 53 187-26C156-117 114-183 62-223C59-227 57-231 57-234C57-243 62-248 71-248C72-248 75-247 78-245Z"></path></g><g data-mml-node="TeXAtom" transform="translate(422,363) scale(0.707)" data-latex="{2}" data-mjx-texclass="ORD"><g data-mml-node="mn" data-latex="2"><path data-c="32" d="M237 666C186 666 143 648 106 612C69 576 50 534 50 483C50 449 75 424 106 424C136 424 161 450 161 480C161 513 137 536 105 536C102 536 100 536 98 535C117 584 161 627 224 627C306 627 352 556 352 470C352 403 318 331 250 255L62 43C49 28 50 29 50 0L421 0L450 180L417 180C409 129 402 100 396 91C391 86 361 84 306 84L139 84L236 179C304 243 390 312 419 365C439 400 449 435 449 470C449 588 357 666 237 666Z"></path></g></g></g></g><g data-mml-node="mrow" data-latex="2(zNear + zFar)" transform="translate(220,-708)"><g data-mml-node="mn" data-latex="2"><path data-c="32" d="M237 666C186 666 143 648 106 612C69 576 50 534 50 483C50 449 75 424 106 424C136 424 161 450 161 480C161 513 137 536 105 536C102 536 100 536 98 535C117 584 161 627 224 627C306 627 352 556 352 470C352 403 318 331 250 255L62 43C49 28 50 29 50 0L421 0L450 180L417 180C409 129 402 100 396 91C391 86 361 84 306 84L139 84L236 179C304 243 390 312 419 365C439 400 449 435 449 470C449 588 357 666 237 666Z"></path></g><g data-mml-node="mo" data-latex="(" transform="translate(500,0)"><path data-c="28" d="M318-248C327-248 332-243 332-234C332-231 330-227 327-223C275-183 233-117 202-26C175 53 161 131 161 208L161 292C161 369 175 447 202 526C233 617 275 683 327 723C330 726 332 730 332 734C332 743 327 748 318 748C317 748 314 747 311 745C251 699 201 631 160 540C121 453 101 371 101 292L101 208C101 129 121 47 160-40C201-131 251-199 311-245C314-247 317-248 318-248Z"></path></g><g data-mml-node="mi" data-latex="z" transform="translate(889,0)"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="mi" data-latex="N" transform="translate(1356,0)"><path data-c="1D441" d="M864 683C845 683 783 680 764 680C745 680 682 683 663 683C648 683 641 675 641 659C641 650 648 645 663 644C705 644 726 631 726 605C726 599 725 592 724 585L616 157L401 662C393 681 391 683 366 683L233 683C209 683 200 681 200 659C200 649 211 644 232 644C274 644 295 643 296 640L163 110C154 71 131 49 95 42C69 39 39 43 39 15C39 5 45 0 56 0C74 0 136 3 155 3C174 3 238 0 257 0C272 0 279 8 279 24C279 33 271 38 255 39C214 40 194 53 194 78C194 83 195 90 197 100L326 611L576 21C582 7 590 0 599 0C608 0 614 8 618 24L757 574C770 625 798 643 860 644C874 645 881 653 881 669C878 678 877 683 864 683Z"></path></g><g data-mml-node="mi" data-latex="e" transform="translate(2237,0)"><path data-c="1D452" d="M124 129C124 153 129 186 139 227L188 227C253 227 303 235 339 250C372 264 394 284 405 309C412 326 415 342 415 355C415 410 363 442 307 442C268 442 229 432 190 412C113 372 46 281 46 171C46 69 105-11 204-11C257-11 304 2 345 27C379 48 404 69 420 90C427 99 430 106 430 109C430 120 425 126 414 126C409 126 404 122 398 114C365 70 324 42 277 30C246 22 223 18 206 18C149 18 124 72 124 129M375 355C375 289 311 256 182 256L147 256C166 322 194 366 232 387C262 404 287 413 307 413C343 413 375 391 375 355Z"></path></g><g data-mml-node="mi" data-latex="a" transform="translate(2703,0)"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(3232,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g><g data-mml-node="mo" data-latex="+" transform="translate(3905.2,0)"><path data-c="2B" d="M698 274L413 274L413 559C413 575 405 583 389 583C373 583 365 575 365 559L365 274L80 274C64 274 56 266 56 250C56 234 64 226 80 226L365 226L365-59C365-75 373-83 389-83C405-83 413-75 413-59L413 226L698 226C714 226 722 234 722 250C722 263 711 274 698 274Z"></path></g><g data-mml-node="mi" data-latex="z" transform="translate(4905.4,0)"><path data-c="1D467" d="M162 92L145 90C193 137 230 171 255 194L351 283C374 304 398 330 421 359C452 397 467 420 467 428C467 437 462 442 452 442C445 442 439 438 434 429C409 388 386 368 364 368C342 368 326 386 317 398C293 427 269 442 246 442C220 442 193 430 165 404C137 378 123 352 123 326C123 316 128 311 139 311C146 311 152 316 156 325C167 354 194 368 235 368C249 368 269 363 296 354C320 345 343 340 364 339C308 284 265 244 234 217L145 134C130 119 111 99 90 74C59 35 43 12 43 3C43-6 48-11 59-11C65-11 71-6 78 4C103 43 130 63 158 63C174 63 192 51 212 26C232 1 255-11 278-11C312-11 346 7 382 42C418 77 436 111 436 144C436 153 431 158 420 158C413 158 407 153 402 143C387 100 344 63 288 63C264 63 186 92 162 92Z"></path></g><g data-mml-node="mi" data-latex="F" transform="translate(5372.4,0)"><path data-c="1D439" d="M199 656C199 646 210 641 231 641C271 641 291 637 291 628C291 625 289 618 286 605L156 82C150 60 140 47 126 42C119 40 101 39 70 39C48 39 38 37 38 16C38 5 44 0 57 0L187 3L335 0C351 0 359 8 359 23C359 40 348 39 322 39C278 39 253 41 247 46C244 47 243 51 243 56L307 321L400 321C446 321 478 319 478 281C478 268 476 252 471 233C470 230 469 226 468 222C468 211 473 206 484 206C489 207 496 214 503 229L557 444C559 452 560 458 560 461C557 470 551 475 544 475C536 475 530 467 526 452C516 414 502 390 486 378C470 366 442 360 402 360L317 360L379 606C387 640 387 641 429 641L559 641C656 641 700 626 700 537C700 517 699 499 697 484C696 473 695 467 695 466C695 455 700 450 710 450C720 450 726 459 728 478L748 649C751 677 744 680 717 680L233 680C210 680 199 679 199 656Z"></path></g><g data-mml-node="mi" data-latex="a" transform="translate(6123.4,0)"><path data-c="1D44E" d="M498 144C498 153 493 158 482 158C474 158 468 151 465 137C445 58 421 18 394 18C377 18 368 32 368 60C368 73 372 97 381 132L438 357C443 376 445 387 445 392C445 412 434 422 412 422C391 422 377 410 370 387C349 424 319 442 281 442C216 442 159 409 109 343C63 281 40 217 40 150C40 63 91-11 175-11C218-11 260 12 300 58C311 20 345-11 392-11C461-11 482 70 498 144M341 374C350 353 355 339 355 330C355 326 354 321 353 314L304 122C301 111 294 99 285 87C248 41 212 18 177 18C138 18 118 48 118 107C118 131 124 167 136 215C157 300 187 357 224 388C244 405 263 413 282 413C309 413 329 400 341 374Z"></path></g><g data-mml-node="mi" data-latex="r" transform="translate(6652.4,0)"><path data-c="1D45F" d="M436 374C436 416 395 442 351 442C302 442 261 419 227 372C217 411 183 442 136 442C95 442 65 410 44 345C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 65 299C83 375 106 413 133 413C150 413 159 399 159 371C159 358 154 331 144 290L87 63C84 50 78 24 78 19C78-1 89-11 110-11C130-11 143-1 150 19L169 91C180 134 187 162 190 175L221 303C223 311 231 324 244 343C271 381 302 413 351 413C363 413 373 411 382 406C352 397 337 378 337 351C337 325 351 312 378 312C411 312 436 341 436 374Z"></path></g><g data-mml-node="mo" data-latex=")" transform="translate(7103.4,0)"><path data-c="29" d="M78-245C138-199 188-131 229-40C268 47 288 129 288 208L288 292C288 371 268 453 229 540C188 631 138 699 78 745C75 747 72 748 71 748C62 748 57 743 57 734C57 730 59 726 62 723C114 683 156 617 187 526C214 447 228 369 228 292L228 208C228 131 214 53 187-26C156-117 114-183 62-223C59-227 57-231 57-234C57-243 62-248 71-248C72-248 75-247 78-245Z"></path></g></g><rect width="7692.4" height="60" x="120" y="220"></rect></g><g data-mml-node="mo" data-latex="<" transform="translate(13627.9,0)"><path data-c="3C" d="M666-45C683-52 701-39 701-23C701-13 696-6 687-2L153 250L687 502C696 506 701 513 701 522C701 539 693 547 677 547C673 547 669 546 666 545L92 273C82 268 77 261 77 250C77 239 82 232 92 227Z"></path></g><g data-mml-node="mn" data-latex="0" transform="translate(14683.6,0)"><path data-c="30" d="M249-22C390-22 460 92 460 320C460 473 428 575 365 625C330 652 291 666 250 666C109 666 39 551 39 320C39 136 88-22 249-22M361 524C368 489 371 425 371 332C371 240 367 172 360 128C347 48 310 8 249 8C226 8 203 17 182 34C155 57 139 104 132 176C129 201 128 253 128 332C128 419 131 480 136 513C145 568 163 603 191 618C213 630 232 636 249 636C314 636 350 583 361 524Z"></path></g></g></g></svg></mjx-container></p></li><li><p>可知：<mjx-container class="MathJax" jax="SVG" overflow="overflow"><svg style="vertical-align: -0.357ex;" xmlns="http://www.w3.org/2000/svg" width="4.429ex" height="1.902ex" role="img" focusable="false" viewBox="0 -683 1957.5 840.8"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="P_{mid}"><g data-mml-node="msub" data-latex="P_{mid}"><g data-mml-node="mi" data-latex="P"><path data-c="1D443" d="M555 683L235 683C212 683 201 682 201 660C201 649 212 644 234 644C254 644 294 647 294 631C294 629 293 623 290 613L158 82C152 60 142 47 128 42C121 40 103 39 72 39C50 39 40 37 40 16C40 5 46 0 59 0L184 3L248 2C259 2 299 0 312 0C328 0 336 8 336 24C336 34 325 39 304 39C264 39 244 43 244 52C244 52 245 55 247 68L307 312L472 312C537 312 599 332 657 371C722 414 754 467 754 530C754 629 660 683 555 683M524 644C611 644 654 614 654 554C654 498 626 423 597 397C559 363 509 346 447 346L313 346L379 610C387 644 387 644 429 644Z"></path></g><g data-mml-node="TeXAtom" transform="translate(675,-150) scale(0.707)" data-latex="{m i d}" data-mjx-texclass="ORD"><g data-mml-node="mi" data-latex="m"><path data-c="1D45A" d="M657 442C596 442 543 412 498 353C489 412 451 442 383 442C324 442 273 416 231 363C223 407 188 442 137 442C96 442 66 409 45 344C34 312 29 293 29 287C29 278 34 273 45 273C50 273 53 274 56 276C61 285 64 292 66 299C84 375 107 413 134 413C152 413 161 399 161 371C161 358 156 331 145 290L88 63C84 51 79 25 79 19C79-1 90-11 111-11C131-11 145-1 152 19C153 24 160 49 171 92L192 181L222 295C233 318 250 341 272 365C301 397 337 413 380 413C413 413 429 391 429 348C429 335 424 308 414 267L387 153C380 124 364 64 356 32C355 25 354 21 354 19C354-1 365-11 387-11C398-11 406-8 413-1C428 14 429 21 435 48L494 285C497 298 511 321 535 353C565 393 605 413 654 413C687 413 703 391 703 348C703 309 683 236 642 129C633 106 629 87 629 74C629 25 666-11 714-11C759-11 793 14 818 64C838 104 848 131 848 144C848 153 843 158 832 158C825 157 818 148 813 137C791 58 759 18 716 18C703 18 696 28 696 47C696 62 702 84 714 115C755 222 775 295 775 333C775 404 728 442 657 442Z"></path></g><g data-mml-node="mi" data-latex="i" transform="translate(878,0)"><path data-c="1D456" d="M284 621C284 648 271 661 244 661C216 661 188 633 188 605C188 578 202 565 229 565C257 565 284 593 284 621M259 138C237 59 205 19 164 19C151 19 144 28 144 47C144 64 173 150 232 306C240 329 244 347 244 360C244 409 210 445 161 445C118 445 84 420 59 369C39 328 29 301 29 288C29 279 34 275 45 275C58 275 60 281 64 295C87 375 118 415 158 415C171 415 178 406 178 387C178 373 175 357 168 338C145 275 121 208 101 155C86 115 78 88 78 74C78 25 114-11 162-11C205-11 239 14 264 64C283 103 293 130 293 145C293 154 288 159 277 159C274 159 259 150 259 138Z"></path></g><g data-mml-node="mi" data-latex="d" transform="translate(1223,0)"><path data-c="1D451" d="M429 632L370 389C349 426 320 445 281 445C216 445 159 412 109 345C63 283 40 218 40 151C40 63 91-11 175-11C218-11 260 12 300 59C311 21 345-11 392-11C461-11 483 71 498 145C498 154 493 159 483 159C474 159 468 152 465 138C445 59 421 19 394 19C377 19 368 33 368 60C368 75 370 91 374 107L516 679L516 683C513 690 507 694 499 694C476 694 434 690 374 683C363 682 357 674 357 660C357 650 366 645 384 645C403 645 429 646 429 632M341 376C351 355 356 341 356 332C355 328 354 323 353 316L304 122C301 111 294 99 285 87C248 42 212 19 177 19C138 19 118 49 118 108C118 132 124 168 136 216C157 301 187 359 224 390C244 407 263 415 282 415C309 415 329 402 341 376Z"></path></g></g></g></g></g></svg></mjx-container> 在变换后，其相距坐标原点的距离增大，即摄像机可视区域中的点集在变换后，被整体推向远平面挤压。</p></li></ul><h1 id="End"><a href="#End" class="headerlink" title="End"></a>End</h1>]]>
    </content>
    <id>https://blog.imlast.top/2026/08/22/games101-1/</id>
    <link href="https://blog.imlast.top/2026/08/22/games101-1/"/>
    <published>2026-08-22T04:13:24.000Z</published>
    <summary>GAMES101 图形学中的基础变换和投影</summary>
    <title>
      <![CDATA[GAMES101 [1] Affine Transformation & Projection]]>
    </title>
    <updated>2026-08-22T04:13:24.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>Last</name>
    </author>
    <category term="笔记" scheme="https://blog.imlast.top/categories/%E7%AC%94%E8%AE%B0/"/>
    <category term="c" scheme="https://blog.imlast.top/tags/c/"/>
    <category term="cmu15213" scheme="https://blog.imlast.top/tags/cmu15213/"/>
    <category term="asm" scheme="https://blog.imlast.top/tags/asm/"/>
    <content>
      <![CDATA[<h1 id="Bomb-Lab"><a href="#Bomb-Lab" class="headerlink" title="Bomb Lab"></a>Bomb Lab</h1><ul><li><p>This is the second lab of course CMU 15-213. I have to say that, unlike datalab, this lab is fairly ‘logical’ and fun to play with. The idea of looking into assembly code to get a fundamental understanding of how programs actually got compiled into machine level language is absolutely effective and genius in teaching.</p></li><li><p><strong>Make sure you’ve solved the puzzles by yourself before checking my solutions!</strong></p></li><li><p>If you find any mistakes in this blog, you’re most welcome to leave a comment on it.</p></li></ul><h1 id="Records"><a href="#Records" class="headerlink" title="Records"></a>Records</h1><ul><li>Disassemble the executable file into assembly code by:  <div class="code-container" data-rel="Bash"><figure class="iseeu highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">objdump -D bomb &gt; bomb.s</span><br></pre></td></tr></table></figure></div></li></ul><h2 id="Phase-1"><a href="#Phase-1" class="headerlink" title="Phase 1"></a>Phase 1</h2><ul><li><p>Obviously we gotta look into the assembly code of <code>phase_1</code>:</p>  <div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">0000000000400ee0 &lt;phase_1&gt;:</span><br><span class="line">400ee0:448 83 ec 08          sub    $0x8,%rsp</span><br><span class="line">400ee4:4be 00 24 40 00       mov    $0x402400,%esi</span><br><span class="line">400ee9:4e8 4a 04 00 00       call   401338 &lt;strings_not_equal&gt;</span><br><span class="line">400eee:485 c0                test   %eax,%eax</span><br><span class="line">400ef0:474 05                je     400ef7 &lt;phase_1+0x17&gt;</span><br><span class="line">400ef2:4e8 43 05 00 00       call   40143a &lt;explode_bomb&gt;</span><br><span class="line">400ef7:448 83 c4 08          add    $0x8,%rsp</span><br><span class="line">400efb:4c3                   ret</span><br></pre></td></tr></table></figure></div></li><li><p>Even more obvious we should take a look into function <code>&lt;strings_not_equal&gt;</code>:</p>  <div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br></pre></td><td class="code"><pre><span class="line">0000000000401338 &lt;strings_not_equal&gt;:</span><br><span class="line">401338:441 54                push   %r12</span><br><span class="line">40133a:455                   push   %rbp</span><br><span class="line">40133b:453                   push   %rbx</span><br><span class="line">40133c:448 89 fb             mov    %rdi,%rbx</span><br><span class="line">40133f:448 89 f5             mov    %rsi,%rbp</span><br><span class="line">401342:4e8 d4 ff ff ff       call   40131b &lt;string_length&gt;</span><br><span class="line">401347:441 89 c4             mov    %eax,%r12d</span><br><span class="line">40134a:448 89 ef             mov    %rbp,%rdi</span><br><span class="line">40134d:4e8 c9 ff ff ff       call   40131b &lt;string_length&gt;</span><br><span class="line">401352:4ba 01 00 00 00       mov    $0x1,%edx</span><br><span class="line">401357:441 39 c4             cmp    %eax,%r12d</span><br><span class="line">40135a:475 3f                jne    40139b &lt;strings_not_equal+0x63&gt;</span><br><span class="line">40135c:40f b6 03             movzbl (%rbx),%eax</span><br><span class="line">40135f:484 c0                test   %al,%al</span><br><span class="line">401361:474 25                je     401388 &lt;strings_not_equal+0x50&gt;</span><br><span class="line">401363:43a 45 00             cmp    0x0(%rbp),%al</span><br><span class="line">401366:474 0a                je     401372 &lt;strings_not_equal+0x3a&gt;</span><br><span class="line">401368:4eb 25                jmp    40138f &lt;strings_not_equal+0x57&gt;</span><br><span class="line">40136a:43a 45 00             cmp    0x0(%rbp),%al</span><br><span class="line">40136d:40f 1f 00             nopl   (%rax)</span><br><span class="line">401370:475 24                jne    401396 &lt;strings_not_equal+0x5e&gt;</span><br><span class="line">401372:448 83 c3 01          add    $0x1,%rbx</span><br><span class="line">401376:448 83 c5 01          add    $0x1,%rbp</span><br><span class="line">40137a:40f b6 03             movzbl (%rbx),%eax</span><br><span class="line">40137d:484 c0                test   %al,%al</span><br><span class="line">40137f:475 e9                jne    40136a &lt;strings_not_equal+0x32&gt;</span><br><span class="line">401381:4ba 00 00 00 00       mov    $0x0,%edx</span><br><span class="line">401386:4eb 13                jmp    40139b &lt;strings_not_equal+0x63&gt;</span><br><span class="line">401388:4ba 00 00 00 00       mov    $0x0,%edx</span><br><span class="line">40138d:4eb 0c                jmp    40139b &lt;strings_not_equal+0x63&gt;</span><br><span class="line">40138f:4ba 01 00 00 00       mov    $0x1,%edx</span><br><span class="line">401394:4eb 05                jmp    40139b &lt;strings_not_equal+0x63&gt;</span><br><span class="line">401396:4ba 01 00 00 00       mov    $0x1,%edx</span><br><span class="line">40139b:489 d0                mov    %edx,%eax</span><br><span class="line">40139d:45b                   pop    %rbx</span><br><span class="line">40139e:45d                   pop    %rbp</span><br><span class="line">40139f:441 5c                pop    %r12</span><br><span class="line">4013a1:4c3                   ret</span><br></pre></td></tr></table></figure></div></li><li><p>From the code we can see that the funcion first compares the length of the two strings and then compares each character.</p></li><li><p>If we type in <code>hello</code> as a ‘test’ input for this phase, we can find out that it is the first call for <code>string_length</code> that calculates the length of our input string, for <code>%eax</code> is set to <code>5</code>(as the length of <code>hello</code>) after it returns. (With the help of gdb)</p><ul><li><p>Then this <code>5</code> is moved into <code>%r12</code> at:</p>  <div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">401347:441 89 c4             mov    %eax,%r12d</span><br></pre></td></tr></table></figure></div></li><li><p>Then compared with the second length calculated at:</p>  <div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">401357:441 39 c4             cmp    %eax,%r12d</span><br><span class="line">40135a:475 3f                jne    40139b &lt;strings_not_equal+0x63&gt;</span><br></pre></td></tr></table></figure></div></li></ul></li><li><p>So the idea is simple: just step into the second <code>string_length</code> and see what is at the memory address stored in the register corresponding to the first argument of a function call, which is <code>%rdi</code>:</p><p>  <em>Step into the second &lt;string_length&gt;</em></p>  <div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">(gdb) print /x $rdi</span><br><span class="line">$1 = 0x402400</span><br><span class="line">(gdb) print (char *) 0x402400</span><br><span class="line">$2 = 0x402400 &quot;Border relations with Canada have never been better.&quot;</span><br></pre></td></tr></table></figure></div></li><li><p>And we’re done for phase 1.</p></li></ul><h2 id="Phase-2"><a href="#Phase-2" class="headerlink" title="Phase 2"></a>Phase 2</h2><ul><li><p>As usual, assembly:</p>  <div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line">0000000000400efc &lt;phase_2&gt;:</span><br><span class="line">    400efc:455                   push   %rbp</span><br><span class="line">    400efd:453                   push   %rbx</span><br><span class="line">    400efe:448 83 ec 28          sub    $0x28,%rsp</span><br><span class="line">    400f02:448 89 e6             mov    %rsp,%rsi</span><br><span class="line">    400f05:4e8 52 05 00 00       call   40145c &lt;read_six_numbers&gt;</span><br><span class="line">    400f0a:483 3c 24 01          cmpl   $0x1,(%rsp)</span><br><span class="line">    400f0e:474 20                je     400f30 &lt;phase_2+0x34&gt;</span><br><span class="line">    400f10:4e8 25 05 00 00       call   40143a &lt;explode_bomb&gt;</span><br><span class="line">    400f15:4eb 19                jmp    400f30 &lt;phase_2+0x34&gt;</span><br><span class="line">    400f17:48b 43 fc             mov    -0x4(%rbx),%eax</span><br><span class="line">    400f1a:401 c0                add    %eax,%eax</span><br><span class="line">    400f1c:439 03                cmp    %eax,(%rbx)</span><br><span class="line">    400f1e:474 05                je     400f25 &lt;phase_2+0x29&gt;</span><br><span class="line">    400f20:4e8 15 05 00 00       call   40143a &lt;explode_bomb&gt;</span><br><span class="line">    400f25:448 83 c3 04          add    $0x4,%rbx</span><br><span class="line">    400f29:448 39 eb             cmp    %rbp,%rbx</span><br><span class="line">    400f2c:475 e9                jne    400f17 &lt;phase_2+0x1b&gt;</span><br><span class="line">    400f2e:4eb 0c                jmp    400f3c &lt;phase_2+0x40&gt;</span><br><span class="line">    400f30:448 8d 5c 24 04       lea    0x4(%rsp),%rbx</span><br><span class="line">    400f35:448 8d 6c 24 18       lea    0x18(%rsp),%rbp</span><br><span class="line">    400f3a:4eb db                jmp    400f17 &lt;phase_2+0x1b&gt;</span><br><span class="line">    400f3c:448 83 c4 28          add    $0x28,%rsp</span><br><span class="line">    400f40:45b                   pop    %rbx</span><br><span class="line">    400f41:45d                   pop    %rbp</span><br><span class="line">    400f42:4c3                   ret</span><br></pre></td></tr></table></figure></div></li><li><p>Immediately we see this <code>&lt;read_six_numbers&gt;</code>, so <code>1 2 3 4 5 6</code> is an ideal test string we should put in here.</p></li><li><p>Assembly of <code>read_six_numbers</code>:</p>  <div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line">000000000040145c &lt;read_six_numbers&gt;:</span><br><span class="line">    40145c:448 83 ec 18          sub    $0x18,%rsp</span><br><span class="line">    401460:448 89 f2             mov    %rsi,%rdx</span><br><span class="line">    401463:448 8d 4e 04          lea    0x4(%rsi),%rcx</span><br><span class="line">    401467:448 8d 46 14          lea    0x14(%rsi),%rax</span><br><span class="line">    40146b:448 89 44 24 08       mov    %rax,0x8(%rsp)</span><br><span class="line">    401470:448 8d 46 10          lea    0x10(%rsi),%rax</span><br><span class="line">    401474:448 89 04 24          mov    %rax,(%rsp)</span><br><span class="line">    401478:44c 8d 4e 0c          lea    0xc(%rsi),%r9</span><br><span class="line">    40147c:44c 8d 46 08          lea    0x8(%rsi),%r8</span><br><span class="line">    401480:4be c3 25 40 00       mov    $0x4025c3,%esi</span><br><span class="line">    401485:4b8 00 00 00 00       mov    $0x0,%eax</span><br><span class="line">    40148a:4e8 61 f7 ff ff       call   400bf0 &lt;__isoc99_sscanf@plt&gt;</span><br><span class="line">    40148f:483 f8 05             cmp    $0x5,%eax</span><br><span class="line">    401492:47f 05                jg     401499 &lt;read_six_numbers+0x3d&gt;</span><br><span class="line">    401494:4e8 a1 ff ff ff       call   40143a &lt;explode_bomb&gt;</span><br><span class="line">    401499:448 83 c4 18          add    $0x18,%rsp</span><br><span class="line">    40149d:4c3                   ret</span><br></pre></td></tr></table></figure></div><ul><li>We can see from the assembly code that this function does not explicitly use anything stored in <code>%rdi</code> while manipulating <code>%rsi</code> a lot, which is pretty strange at first glance.</li><li>It turns out that the value stored inside <code>%rdi</code> is implicitly passed to <code>sscanf</code> as the address to hold the user input.</li><li>We can trace back to <code>main</code> to see where <code>%rdi</code> is set after <code>read_line</code>:  <div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"># ...Phase 1</span><br><span class="line">400e3f:4e8 80 07 00 00       call   4015c4 &lt;phase_defused&gt;</span><br><span class="line">400e44:4bf a8 23 40 00       mov    $0x4023a8,%edi</span><br><span class="line">400e49:4e8 c2 fc ff ff       call   400b10 &lt;puts@plt&gt;</span><br><span class="line">400e4e:4e8 4b 06 00 00       call   40149e &lt;read_line&gt;</span><br><span class="line">400e53:448 89 c7             mov    %rax,%rdi</span><br><span class="line">400e56:4e8 a1 00 00 00       call   400efc &lt;phase_2&gt;</span><br><span class="line">400e5b:4e8 64 07 00 00       call   4015c4 &lt;phase_defused&gt;</span><br><span class="line"># Phase 3...</span><br></pre></td></tr></table></figure></div></li><li>It is set as the pointer pointing towards the string returned by <code>read_line</code>.</li></ul></li><li><p>There seems to be a lot going on before invoking <code>sscanf</code>, but it’s mainly preparing space for user input on the stack.</p></li><li><p>In short:</p><ul><li><code>%rdi</code> passed all along to <code>sscanf</code> as input string.</li><li><code>%rsi</code> holds the pointer pointing to the address of the buffer which is to store the six numbers parsed by <code>sscanf</code>.</li><li><code>%rdx</code>, <code>%rcx</code>, <code>%r8</code>, <code>%r9</code> holding the first four addresses of each of the target buffer block to hold the parsed numbers, while the rest 2 addresses are placed on the stack.</li><li><code>sscanf</code> then set the values stored in those addresses to the six input numbers.</li><li>After <code>sscanf</code> returns, compare the return value with <code>0x5</code>. If the return value, which represents the number of the values parsed, is less or equal to 5, then explode the bomb.</li><li>Free the stack frame and return.</li></ul></li></ul><div class="callout callout--titled info mb-4 rounded-small shadow-redefine-flat bg-(--callout-bg-color) p-3 pl-1 relative flex flex-row gap-2"><div role="none" class="rounded-full self-stretch w-0.5 bg-(--callout-primary-color) shrink-0 opacity-60"></div><div class="flex flex-col gap-2"><div class="callout__title flex items-center gap-2 font-semibold tracking-tight"><i class="callout__icon fa-solid leading-none text-(--callout-primary-color) text-sm shrink-0"></i> Note:</div><div class="callout__content markdown-body flex-1 min-w-0"><div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">401467:448 8d 46 14          lea    0x14(%rsi),%rax</span><br><span class="line">40146b:448 89 44 24 08       mov    %rax,0x8(%rsp)</span><br><span class="line">401470:448 8d 46 10          lea    0x10(%rsi),%rax</span><br><span class="line">401474:448 89 04 24          mov    %rax,(%rsp)</span><br></pre></td></tr></table></figure></div><ul><li>This is where the last two addresses of the target buffer are placed on the stack, and passed to <code>sscanf</code>.</li></ul></div></div></div><ul><li><p>After reading six numbers from user input, first check whether the first number is <code>0x1</code>:</p>  <div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">400f0a:483 3c 24 01          cmpl   $0x1,(%rsp)</span><br><span class="line">400f0e:474 20                je     400f30 &lt;phase_2+0x34&gt;</span><br></pre></td></tr></table></figure></div></li><li><p>Then there is a loop determining whether the input numbers are of an expected pattern:</p>  <div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">400f17:48b 43 fc             mov    -0x4(%rbx),%eax</span><br><span class="line">400f1a:401 c0                add    %eax,%eax</span><br><span class="line">400f1c:439 03                cmp    %eax,(%rbx)</span><br><span class="line">400f1e:474 05                je     400f25 &lt;phase_2+0x29&gt;</span><br><span class="line">400f20:4e8 15 05 00 00       call   40143a &lt;explode_bomb&gt;</span><br><span class="line">400f25:448 83 c3 04          add    $0x4,%rbx</span><br><span class="line">400f29:448 39 eb             cmp    %rbp,%rbx</span><br><span class="line">400f2c:475 e9                jne    400f17 &lt;phase_2+0x1b&gt;</span><br><span class="line">400f2e:4eb 0c                jmp    400f3c &lt;phase_2+0x40&gt;</span><br><span class="line">400f30:448 8d 5c 24 04       lea    0x4(%rsp),%rbx</span><br><span class="line">400f35:448 8d 6c 24 18       lea    0x18(%rsp),%rbp</span><br><span class="line">400f3a:4eb db                jmp    400f17 &lt;phase_2+0x1b&gt;</span><br></pre></td></tr></table></figure></div></li><li><p>Can be written as pseudocode like:</p>  <div class="code-container" data-rel="C"><figure class="iseeu highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> rax;</span><br><span class="line"><span class="keyword">for</span>(<span class="type">int</span> rbx = <span class="number">0x7fffffffd3d4</span>; rbx != <span class="number">0x7fffffffd3e8</span>; rbx += <span class="number">4</span>) &#123;</span><br><span class="line">    rax = *(rbx - <span class="number">4</span>);</span><br><span class="line">    rax += rax;</span><br><span class="line">    <span class="keyword">if</span> (rax != *rbx) explode_bomb();</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></div></li><li><p>To this stage, the answer can not be more obvious.</p></li></ul><h2 id="Phase-3"><a href="#Phase-3" class="headerlink" title="Phase 3"></a>Phase 3</h2><ul><li><p>Assembly:</p>  <div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br></pre></td><td class="code"><pre><span class="line">0000000000400f43 &lt;phase_3&gt;:</span><br><span class="line">    400f43:448 83 ec 18          sub    $0x18,%rsp</span><br><span class="line">    400f47:448 8d 4c 24 0c       lea    0xc(%rsp),%rcx</span><br><span class="line">    400f4c:448 8d 54 24 08       lea    0x8(%rsp),%rdx</span><br><span class="line">    400f51:4be cf 25 40 00       mov    $0x4025cf,%esi</span><br><span class="line">    400f56:4b8 00 00 00 00       mov    $0x0,%eax</span><br><span class="line">    400f5b:4e8 90 fc ff ff       call   400bf0 &lt;__isoc99_sscanf@plt&gt;</span><br><span class="line">    400f60:483 f8 01             cmp    $0x1,%eax</span><br><span class="line">    400f63:47f 05                jg     400f6a &lt;phase_3+0x27&gt;</span><br><span class="line">    400f65:4e8 d0 04 00 00       call   40143a &lt;explode_bomb&gt;</span><br><span class="line">    400f6a:483 7c 24 08 07       cmpl   $0x7,0x8(%rsp)</span><br><span class="line">    400f6f:477 3c                ja     400fad &lt;phase_3+0x6a&gt;</span><br><span class="line">    400f71:48b 44 24 08          mov    0x8(%rsp),%eax</span><br><span class="line">    400f75:4ff 24 c5 70 24 40 00 jmp    *0x402470(,%rax,8)</span><br><span class="line">    400f7c:4b8 cf 00 00 00       mov    $0xcf,%eax</span><br><span class="line">    400f81:4eb 3b                jmp    400fbe &lt;phase_3+0x7b&gt;</span><br><span class="line">    400f83:4b8 c3 02 00 00       mov    $0x2c3,%eax</span><br><span class="line">    400f88:4eb 34                jmp    400fbe &lt;phase_3+0x7b&gt;</span><br><span class="line">    400f8a:4b8 00 01 00 00       mov    $0x100,%eax</span><br><span class="line">    400f8f:4eb 2d                jmp    400fbe &lt;phase_3+0x7b&gt;</span><br><span class="line">    400f91:4b8 85 01 00 00       mov    $0x185,%eax</span><br><span class="line">    400f96:4eb 26                jmp    400fbe &lt;phase_3+0x7b&gt;</span><br><span class="line">    400f98:4b8 ce 00 00 00       mov    $0xce,%eax</span><br><span class="line">    400f9d:4eb 1f                jmp    400fbe &lt;phase_3+0x7b&gt;</span><br><span class="line">    400f9f:4b8 aa 02 00 00       mov    $0x2aa,%eax</span><br><span class="line">    400fa4:4eb 18                jmp    400fbe &lt;phase_3+0x7b&gt;</span><br><span class="line">    400fa6:4b8 47 01 00 00       mov    $0x147,%eax</span><br><span class="line">    400fab:4eb 11                jmp    400fbe &lt;phase_3+0x7b&gt;</span><br><span class="line">    400fad:4e8 88 04 00 00       call   40143a &lt;explode_bomb&gt;</span><br><span class="line">    400fb2:4b8 00 00 00 00       mov    $0x0,%eax</span><br><span class="line">    400fb7:4eb 05                jmp    400fbe &lt;phase_3+0x7b&gt;</span><br><span class="line">    400fb9:4b8 37 01 00 00       mov    $0x137,%eax</span><br><span class="line">    400fbe:43b 44 24 0c          cmp    0xc(%rsp),%eax</span><br><span class="line">    400fc2:474 05                je     400fc9 &lt;phase_3+0x86&gt;</span><br><span class="line">    400fc4:4e8 71 04 00 00       call   40143a &lt;explode_bomb&gt;</span><br><span class="line">    400fc9:448 83 c4 18          add    $0x18,%rsp</span><br><span class="line">    400fcd:4c3                   ret</span><br></pre></td></tr></table></figure></div></li><li><p>From the judgment towards the return value of <code>sscanf</code>:</p>  <div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">400f5b:4e8 90 fc ff ff       call   400bf0 &lt;__isoc99_sscanf@plt&gt;</span><br><span class="line">400f60:483 f8 01             cmp    $0x1,%eax</span><br><span class="line">400f63:47f 05                jg     400f6a &lt;phase_3+0x27&gt;</span><br><span class="line">400f65:4e8 d0 04 00 00       call   40143a &lt;explode_bomb&gt;</span><br></pre></td></tr></table></figure></div></li><li><p>We can see that the number of the expected user input should be more than 1, also:</p>  <div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">400f6a:483 7c 24 08 07       cmpl   $0x7,0x8(%rsp)</span><br><span class="line">400f6f:477 3c                ja     400fad &lt;phase_3+0x6a&gt;</span><br><span class="line"># ...</span><br><span class="line">400fad:4e8 88 04 00 00       call   40143a &lt;explode_bomb&gt;</span><br></pre></td></tr></table></figure></div></li><li><p>For function <code>sscanf</code>, <code>%rdi</code> holds the address of the raw input, <code>%esi</code> holds the <code>format</code> string, thus <code>rdx</code> and <code>rcx</code> holds the two addresses where the program put the two parsed numbers to.</p></li></ul><div class="callout callout--titled info mb-4 rounded-small shadow-redefine-flat bg-(--callout-bg-color) p-3 pl-1 relative flex flex-row gap-2"><div role="none" class="rounded-full self-stretch w-0.5 bg-(--callout-primary-color) shrink-0 opacity-60"></div><div class="flex flex-col gap-2"><div class="callout__title flex items-center gap-2 font-semibold tracking-tight"><i class="callout__icon fa-solid leading-none text-(--callout-primary-color) text-sm shrink-0"></i> Note:</div><div class="callout__content markdown-body flex-1 min-w-0"><ul><li>The reason why I know the wanted inputs are numbers is that I’ve tried them in cli.</li></ul></div></div></div><ul><li>So, the first input should be less or equal to <code>0x7</code>(also non-negative for <code>ja</code> reads unsigned values comparison result). As a result <code>1 2</code> should be an ideal test input.</li></ul><div class="callout callout--titled info mb-4 rounded-small shadow-redefine-flat bg-(--callout-bg-color) p-3 pl-1 relative flex flex-row gap-2"><div role="none" class="rounded-full self-stretch w-0.5 bg-(--callout-primary-color) shrink-0 opacity-60"></div><div class="flex flex-col gap-2"><div class="callout__title flex items-center gap-2 font-semibold tracking-tight"><i class="callout__icon fa-solid leading-none text-(--callout-primary-color) text-sm shrink-0"></i> Note:</div><div class="callout__content markdown-body flex-1 min-w-0"><ul><li>Like phase 2, <code>%rdi</code> is passed from <code>main</code> function, pointing to the address of user input string.</li></ul></div></div></div><ul><li><p>Then the ‘bomb’ put the second input into <code>%eax</code> and jump to somewhere in a jump table:</p>  <div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">400f71:48b 44 24 08          mov    0x8(%rsp),%eax</span><br><span class="line">400f75:4ff 24 c5 70 24 40 00 jmp    *0x402470(,%rax,8)</span><br></pre></td></tr></table></figure></div></li><li><p>The syntax here in the second line of code means:</p><ul><li>Jump to address <code>0x402470 + 0 + (%rax) * 0x8</code></li></ul></li><li><p>So according to our test input, the value at address stored in <code>%rax</code> should be <code>0x1</code>, Thus the target address of this <code>jmp</code> should be located at <code>0x402470 + 0 + 1 * 0x8 = 0x402478</code>, which is:</p>  <div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">(gdb) x/wx 0x402478</span><br><span class="line">0x402478:   0x00400fb9</span><br></pre></td></tr></table></figure></div><ul><li><p>Which is:</p>  <div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">400fb9:4b8 37 01 00 00       mov    $0x137,%eax</span><br><span class="line">400fbe:43b 44 24 0c          cmp    0xc(%rsp),%eax</span><br><span class="line">400fc2:474 05                je     400fc9 &lt;phase_3+0x86&gt;</span><br><span class="line">400fc4:4e8 71 04 00 00       call   40143a &lt;explode_bomb&gt;</span><br><span class="line">400fc9:448 83 c4 18          add    $0x18,%rsp</span><br><span class="line">400fcd:4c3                   ret</span><br></pre></td></tr></table></figure></div></li><li><p>Which means the correct second input corresponding to <code>0x1</code> as the first input is <code>0x137 = 311</code>.</p></li></ul></li><li><p>We can therefore reverse the whole jump table:</p>  <div class="code-container" data-rel="C"><figure class="iseeu highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> expected;</span><br><span class="line"></span><br><span class="line"><span class="keyword">switch</span> (first_input) &#123;</span><br><span class="line">    <span class="keyword">case</span> <span class="number">0</span>: expected = <span class="number">0xcf</span>;  <span class="keyword">break</span>;</span><br><span class="line">    <span class="keyword">case</span> <span class="number">1</span>: expected = <span class="number">0x137</span>; <span class="keyword">break</span>;</span><br><span class="line">    <span class="keyword">case</span> <span class="number">2</span>: expected = <span class="number">0x2c3</span>; <span class="keyword">break</span>;</span><br><span class="line">    <span class="keyword">case</span> <span class="number">3</span>: expected = <span class="number">0x100</span>; <span class="keyword">break</span>;</span><br><span class="line">    <span class="keyword">case</span> <span class="number">4</span>: expected = <span class="number">0x185</span>; <span class="keyword">break</span>;</span><br><span class="line">    <span class="keyword">case</span> <span class="number">5</span>: expected = <span class="number">0xce</span>;  <span class="keyword">break</span>;</span><br><span class="line">    <span class="keyword">case</span> <span class="number">6</span>: expected = <span class="number">0x2aa</span>; <span class="keyword">break</span>;</span><br><span class="line">    <span class="keyword">case</span> <span class="number">7</span>: expected = <span class="number">0x147</span>; <span class="keyword">break</span>;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">default</span>:</span><br><span class="line">        explode_bomb();</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (second_input != expected)</span><br><span class="line">    explode_bomb();</span><br></pre></td></tr></table></figure></div></li></ul><h2 id="Phase-4"><a href="#Phase-4" class="headerlink" title="Phase 4"></a>Phase 4</h2><ul><li><p>Assembly:</p>  <div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line">000000000040100c &lt;phase_4&gt;:</span><br><span class="line">    40100c:448 83 ec 18          sub    $0x18,%rsp</span><br><span class="line">    401010:448 8d 4c 24 0c       lea    0xc(%rsp),%rcx</span><br><span class="line">    401015:448 8d 54 24 08       lea    0x8(%rsp),%rdx</span><br><span class="line">    40101a:4be cf 25 40 00       mov    $0x4025cf,%esi</span><br><span class="line">    40101f:4b8 00 00 00 00       mov    $0x0,%eax</span><br><span class="line">    401024:4e8 c7 fb ff ff       call   400bf0 &lt;__isoc99_sscanf@plt&gt;</span><br><span class="line">    401029:483 f8 02             cmp    $0x2,%eax</span><br><span class="line">    40102c:475 07                jne    401035 &lt;phase_4+0x29&gt;</span><br><span class="line">    40102e:483 7c 24 08 0e       cmpl   $0xe,0x8(%rsp)</span><br><span class="line">    401033:476 05                jbe    40103a &lt;phase_4+0x2e&gt;</span><br><span class="line">    401035:4e8 00 04 00 00       call   40143a &lt;explode_bomb&gt;</span><br><span class="line">    40103a:4ba 0e 00 00 00       mov    $0xe,%edx</span><br><span class="line">    40103f:4be 00 00 00 00       mov    $0x0,%esi</span><br><span class="line">    401044:48b 7c 24 08          mov    0x8(%rsp),%edi</span><br><span class="line">    401048:4e8 81 ff ff ff       call   400fce &lt;func4&gt;</span><br><span class="line">    40104d:485 c0                test   %eax,%eax</span><br><span class="line">    40104f:475 07                jne    401058 &lt;phase_4+0x4c&gt;</span><br><span class="line">    401051:483 7c 24 0c 00       cmpl   $0x0,0xc(%rsp)</span><br><span class="line">    401056:474 05                je     40105d &lt;phase_4+0x51&gt;</span><br><span class="line">    401058:4e8 dd 03 00 00       call   40143a &lt;explode_bomb&gt;</span><br><span class="line">    40105d:448 83 c4 18          add    $0x18,%rsp</span><br><span class="line">    401061:4c3                   ret</span><br></pre></td></tr></table></figure></div></li><li><p>Easy part:</p><ul><li><code>sscanf</code> user input, write two numbers at address <code>%rsp + 0x8</code> and <code>%rsp + 0xc</code>.</li><li>The first input should be non-negative and less or equal to <code>0xe</code>.</li><li>Set <code>%rdx</code> to <code>0xe</code>. Set <code>%rsi</code> to <code>0x0</code>. Set <code>%rdi</code> to the first user input.</li><li>call <code>&lt;func4&gt;</code>.</li></ul></li><li><p>Let’s take a look into <code>func4</code>:</p>  <div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line">0000000000400fce &lt;func4&gt;:</span><br><span class="line">    400fce:448 83 ec 08          sub    $0x8,%rsp</span><br><span class="line">    400fd2:489 d0                mov    %edx,%eax</span><br><span class="line">    400fd4:429 f0                sub    %esi,%eax</span><br><span class="line">    400fd6:489 c1                mov    %eax,%ecx</span><br><span class="line">    400fd8:4c1 e9 1f             shr    $0x1f,%ecx</span><br><span class="line">    400fdb:401 c8                add    %ecx,%eax</span><br><span class="line">    400fdd:4d1 f8                sar    $1,%eax</span><br><span class="line">    400fdf:48d 0c 30             lea    (%rax,%rsi,1),%ecx</span><br><span class="line">    400fe2:439 f9                cmp    %edi,%ecx</span><br><span class="line">    400fe4:47e 0c                jle    400ff2 &lt;func4+0x24&gt;</span><br><span class="line">    400fe6:48d 51 ff             lea    -0x1(%rcx),%edx</span><br><span class="line">    400fe9:4e8 e0 ff ff ff       call   400fce &lt;func4&gt;</span><br><span class="line">    400fee:401 c0                add    %eax,%eax</span><br><span class="line">    400ff0:4eb 15                jmp    401007 &lt;func4+0x39&gt;</span><br><span class="line">    400ff2:4b8 00 00 00 00       mov    $0x0,%eax</span><br><span class="line">    400ff7:439 f9                cmp    %edi,%ecx</span><br><span class="line">    400ff9:47d 0c                jge    401007 &lt;func4+0x39&gt;</span><br><span class="line">    400ffb:48d 71 01             lea    0x1(%rcx),%esi</span><br><span class="line">    400ffe:4e8 cb ff ff ff       call   400fce &lt;func4&gt;</span><br><span class="line">    401003:48d 44 00 01          lea    0x1(%rax,%rax,1),%eax</span><br><span class="line">    401007:448 83 c4 08          add    $0x8,%rsp</span><br><span class="line">    40100b:4c3                   ret</span><br></pre></td></tr></table></figure></div></li><li><p>We can see that the calculation for <code>%ecx</code> is actually fixed, which means whatever the input numbers are, <code>%ecx</code> will be <code>0x7</code> during the two comparisons:</p>  <div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"># ...</span><br><span class="line">400fe2:439 f9                cmp    %edi,%ecx</span><br><span class="line">400fe4:47e 0c                jle    400ff2 &lt;func4+0x24&gt;</span><br><span class="line">400fe6:48d 51 ff             lea    -0x1(%rcx),%edx</span><br><span class="line">400fe9:4e8 e0 ff ff ff       call   400fce &lt;func4&gt;</span><br><span class="line"># ...</span><br><span class="line">400ff7:439 f9                cmp    %edi,%ecx</span><br><span class="line">400ff9:47d 0c                jge    401007 &lt;func4+0x39&gt;</span><br><span class="line">400ffb:48d 71 01             lea    0x1(%rcx),%esi</span><br><span class="line">400ffe:4e8 cb ff ff ff       call   400fce &lt;func4&gt;</span><br><span class="line"># ...</span><br></pre></td></tr></table></figure></div></li><li><p>Also we notice that each time the function returns from a recursion, it doubles the value in <code>%rax</code> and increments it by 1.</p></li><li><p>As the assembly code we can see after <code>func4</code> returns:</p>  <div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"># ...</span><br><span class="line">40104d:485 c0                test   %eax,%eax</span><br><span class="line">40104f:475 07                jne    401058 &lt;phase_4+0x4c&gt;</span><br><span class="line"># ...</span><br><span class="line">401058:4e8 dd 03 00 00       call   40143a &lt;explode_bomb&gt;</span><br><span class="line"># ...</span><br></pre></td></tr></table></figure></div></li><li><p>We definitely don’t want <code>%rax</code> to be non-zero. As a result, we should pass a value to <code>func4</code> that both <code>jle</code> and <code>jge</code> fires, which means <code>%edi</code> should equal to <code>%ecx</code> at the moment of comparison.</p>  <div class="callout callout--titled warning mb-4 rounded-small shadow-redefine-flat bg-(--callout-bg-color) p-3 pl-1 relative flex flex-row gap-2"><div role="none" class="rounded-full self-stretch w-0.5 bg-(--callout-primary-color) shrink-0 opacity-60"></div><div class="flex flex-col gap-2"><div class="callout__title flex items-center gap-2 font-semibold tracking-tight"><i class="callout__icon fa-solid leading-none text-(--callout-primary-color) text-sm shrink-0"></i> Note:</div><div class="callout__content markdown-body flex-1 min-w-0"><ul><li><p>Turns out <code>func4</code> is doing something similiar to a binary search, while the return value is not the offset&#x2F;index of the target value.</p></li><li><p>So as long as the function goes into this branch:</p>  <div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">400fe4:47e 0c                jle    400ff2 &lt;func4+0x24&gt;</span><br><span class="line">400fe6:48d 51 ff             lea    -0x1(%rcx),%edx</span><br><span class="line">400fe9:4e8 e0 ff ff ff       call   400fce &lt;func4&gt;</span><br><span class="line">400fee:401 c0                add    %eax,%eax</span><br><span class="line">400ff0:4eb 15                jmp    401007 &lt;func4+0x39&gt;</span><br></pre></td></tr></table></figure></div></li><li><p>And get a return value 0 inside the recurrsion, we can keep <code>%rax</code> as 0.</p></li><li><p>Really weird a binary search function does not return an index, hmm.</p></li></ul></div></div></div></li><li><p>Since we’ve already know that <code>%ecx</code> will be a fixed <code>0x7</code> on the first call, the value of <code>%edi</code> is now revealed.</p></li><li><p>The second input is an easy zero:</p>  <div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"># ...</span><br><span class="line">401051:483 7c 24 0c 00       cmpl   $0x0,0xc(%rsp)</span><br><span class="line">401056:474 05                je     40105d &lt;phase_4+0x51&gt;</span><br><span class="line">401058:4e8 dd 03 00 00       call   40143a &lt;explode_bomb&gt;</span><br><span class="line">40105d:448 83 c4 18          add    $0x18,%rsp</span><br><span class="line">401061:4c3                   ret</span><br></pre></td></tr></table></figure></div></li></ul><h2 id="Phase-5"><a href="#Phase-5" class="headerlink" title="Phase 5"></a>Phase 5</h2><ul><li><p>Assembly:</p>  <div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br></pre></td><td class="code"><pre><span class="line">0000000000401062 &lt;phase_5&gt;:</span><br><span class="line">    401062:453                   push   %rbx</span><br><span class="line">    401063:448 83 ec 20          sub    $0x20,%rsp</span><br><span class="line">    401067:448 89 fb             mov    %rdi,%rbx</span><br><span class="line">    40106a:464 48 8b 04 25 28 00 mov    %fs:0x28,%rax</span><br><span class="line">    401071:400 00</span><br><span class="line">    401073:448 89 44 24 18       mov    %rax,0x18(%rsp)</span><br><span class="line">    401078:431 c0                xor    %eax,%eax</span><br><span class="line">    40107a:4e8 9c 02 00 00       call   40131b &lt;string_length&gt;</span><br><span class="line">    40107f:483 f8 06             cmp    $0x6,%eax</span><br><span class="line">    401082:474 4e                je     4010d2 &lt;phase_5+0x70&gt;</span><br><span class="line">    401084:4e8 b1 03 00 00       call   40143a &lt;explode_bomb&gt;</span><br><span class="line">    401089:4eb 47                jmp    4010d2 &lt;phase_5+0x70&gt;</span><br><span class="line">    40108b:40f b6 0c 03          movzbl (%rbx,%rax,1),%ecx</span><br><span class="line">    40108f:488 0c 24             mov    %cl,(%rsp)</span><br><span class="line">    401092:448 8b 14 24          mov    (%rsp),%rdx</span><br><span class="line">    401096:483 e2 0f             and    $0xf,%edx</span><br><span class="line">    401099:40f b6 92 b0 24 40 00 movzbl 0x4024b0(%rdx),%edx</span><br><span class="line">    4010a0:488 54 04 10          mov    %dl,0x10(%rsp,%rax,1)</span><br><span class="line">    4010a4:448 83 c0 01          add    $0x1,%rax</span><br><span class="line">    4010a8:448 83 f8 06          cmp    $0x6,%rax</span><br><span class="line">    4010ac:475 dd                jne    40108b &lt;phase_5+0x29&gt;</span><br><span class="line">    4010ae:4c6 44 24 16 00       movb   $0x0,0x16(%rsp)</span><br><span class="line">    4010b3:4be 5e 24 40 00       mov    $0x40245e,%esi</span><br><span class="line">    4010b8:448 8d 7c 24 10       lea    0x10(%rsp),%rdi</span><br><span class="line">    4010bd:4e8 76 02 00 00       call   401338 &lt;strings_not_equal&gt;</span><br><span class="line">    4010c2:485 c0                test   %eax,%eax</span><br><span class="line">    4010c4:474 13                je     4010d9 &lt;phase_5+0x77&gt;</span><br><span class="line">    4010c6:4e8 6f 03 00 00       call   40143a &lt;explode_bomb&gt;</span><br><span class="line">    4010cb:40f 1f 44 00 00       nopl   0x0(%rax,%rax,1)</span><br><span class="line">    4010d0:4eb 07                jmp    4010d9 &lt;phase_5+0x77&gt;</span><br><span class="line">    4010d2:4b8 00 00 00 00       mov    $0x0,%eax</span><br><span class="line">    4010d7:4eb b2                jmp    40108b &lt;phase_5+0x29&gt;</span><br><span class="line">    4010d9:448 8b 44 24 18       mov    0x18(%rsp),%rax</span><br><span class="line">    4010de:464 48 33 04 25 28 00 xor    %fs:0x28,%rax</span><br><span class="line">    4010e5:400 00</span><br><span class="line">    4010e7:474 05                je     4010ee &lt;phase_5+0x8c&gt;</span><br><span class="line">    4010e9:4e8 42 fa ff ff       call   400b30 &lt;__stack_chk_fail@plt&gt;</span><br><span class="line">    4010ee:448 83 c4 20          add    $0x20,%rsp</span><br><span class="line">    4010f2:45b                   pop    %rbx</span><br><span class="line">    4010f3:4c3                   ret</span><br></pre></td></tr></table></figure></div></li><li><p>Length of the input string should be 6:</p>  <div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">40107a:4e8 9c 02 00 00       call   40131b &lt;string_length&gt;</span><br><span class="line">40107f:483 f8 06             cmp    $0x6,%eax</span><br><span class="line">401082:474 4e                je     4010d2 &lt;phase_5+0x70&gt;</span><br><span class="line">401084:4e8 b1 03 00 00       call   40143a &lt;explode_bomb&gt;</span><br></pre></td></tr></table></figure></div></li><li><p>The core logic of this function is at here:</p>  <div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">40108b:40f b6 0c 03          movzbl (%rbx,%rax,1),%ecx</span><br><span class="line">40108f:488 0c 24             mov    %cl,(%rsp)</span><br><span class="line">401092:448 8b 14 24          mov    (%rsp),%rdx</span><br><span class="line">401096:483 e2 0f             and    $0xf,%edx</span><br><span class="line">401099:40f b6 92 b0 24 40 00 movzbl 0x4024b0(%rdx),%edx</span><br><span class="line">4010a0:488 54 04 10          mov    %dl,0x10(%rsp,%rax,1)</span><br><span class="line">4010a4:448 83 c0 01          add    $0x1,%rax</span><br><span class="line">4010a8:448 83 f8 06          cmp    $0x6,%rax</span><br><span class="line">4010ac:475 dd                jne    40108b &lt;phase_5+0x29&gt;</span><br></pre></td></tr></table></figure></div></li><li><p>What this while-loop is doing is basically pick the latter 4 bits of each character of the input string, and add the number represented by that 4 bits to <code>0x4024b0</code> to get another byte.</p></li><li><p>By the way, the target string wanted is <code>flyers</code>:</p>  <div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">4010b3:4be 5e 24 40 00       mov    $0x40245e,%esi</span><br><span class="line">4010b8:448 8d 7c 24 10       lea    0x10(%rsp),%rdi</span><br><span class="line">4010bd:4e8 76 02 00 00       call   401338 &lt;strings_not_equal&gt;</span><br></pre></td></tr></table></figure></div>  <div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">(gdb) print (char *) 0x40245e</span><br><span class="line">$1 = 0x40245e &quot;flyers&quot;</span><br></pre></td></tr></table></figure></div></li><li><p>So the way to get the target string is to seek the correct letters in the string located at <code>0x4024b0</code>, and prepare the characters with the corresponding last 4 bits.</p></li><li><p>We can print out what exactly is stored at <code>0x4024b0</code>:</p>  <div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">(gdb) x/16c 0x4024b0</span><br><span class="line">0x4024b0 &lt;array.3449&gt;:4109 &#x27;m&#x27;97 &#x27;a&#x27;100 &#x27;d&#x27;117 &#x27;u&#x27;105 &#x27;i&#x27;101 &#x27;e&#x27;114 &#x27;r&#x27;115 &#x27;s&#x27;</span><br><span class="line">0x4024b8 &lt;array.3449+8&gt;:4110 &#x27;n&#x27;102 &#x27;f&#x27;111 &#x27;o&#x27;116 &#x27;t&#x27;118 &#x27;v&#x27;98 &#x27;b&#x27;121 &#x27;y&#x27;108 &#x27;l&#x27;</span><br></pre></td></tr></table></figure></div>  <div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">m a d u i e r s n f o t v b y l</span><br><span class="line">0 1 2 3 4 5 6 7 8 9 a b c d e f</span><br></pre></td></tr></table></figure></div></li><li><p>String <code>flyers</code> would require such serial of index: <code>9 f e 5 6 7</code>. The input should be a string, so we might take a look at the ASCII table:</p>  <details class="relative my-4 border border-border-color bg-second-background-color rounded-md  blue" data-header-exclude><summary class="px-4 py-2 rounded-md shadow-[0_0_2px_0_var(--shadow-color-1)] cursor-pointer not-markdown"><i class="fa-solid fa-chevron-right"></i>ASCII</summary><div class="content p-4 "><table><thead><tr><th>Dec</th><th>Hex</th><th>Binary</th><th>Char</th></tr></thead><tbody><tr><td>69</td><td>45</td><td>01000101</td><td>E</td></tr><tr><td>70</td><td>46</td><td>01000110</td><td>F</td></tr><tr><td>71</td><td>47</td><td>01000111</td><td>G</td></tr><tr><td>72</td><td>48</td><td>01001000</td><td>H</td></tr><tr><td>73</td><td>49</td><td>01001001</td><td>I</td></tr><tr><td>74</td><td>4A</td><td>01001010</td><td>J</td></tr><tr><td>75</td><td>4B</td><td>01001011</td><td>K</td></tr><tr><td>76</td><td>4C</td><td>01001100</td><td>L</td></tr><tr><td>77</td><td>4D</td><td>01001101</td><td>M</td></tr><tr><td>78</td><td>4E</td><td>01001110</td><td>N</td></tr><tr><td>79</td><td>4F</td><td>01001111</td><td>O</td></tr><tr><td>80</td><td>50</td><td>01010000</td><td>P</td></tr><tr><td>81</td><td>51</td><td>01010001</td><td>Q</td></tr><tr><td>82</td><td>52</td><td>01010010</td><td>R</td></tr><tr><td>83</td><td>53</td><td>01010011</td><td>S</td></tr><tr><td>84</td><td>54</td><td>01010100</td><td>T</td></tr><tr><td>85</td><td>55</td><td>01010101</td><td>U</td></tr><tr><td>86</td><td>56</td><td>01010110</td><td>V</td></tr><tr><td>87</td><td>57</td><td>01010111</td><td>W</td></tr><tr><td>88</td><td>58</td><td>01011000</td><td>X</td></tr><tr><td>89</td><td>59</td><td>01011001</td><td>Y</td></tr><tr><td>90</td><td>5A</td><td>01011010</td><td>Z</td></tr><tr><td>91</td><td>5B</td><td>01011011</td><td>[</td></tr><tr><td>92</td><td>5C</td><td>01011100</td><td>\</td></tr><tr><td>93</td><td>5D</td><td>01011101</td><td>]</td></tr><tr><td>94</td><td>5E</td><td>01011110</td><td>^</td></tr><tr><td>95</td><td>5F</td><td>01011111</td><td>_</td></tr><tr><td>96</td><td>60</td><td>01100000</td><td>&#96;</td></tr><tr><td>97</td><td>61</td><td>01100001</td><td>a</td></tr><tr><td>98</td><td>62</td><td>01100010</td><td>b</td></tr><tr><td>99</td><td>63</td><td>01100011</td><td>c</td></tr><tr><td>100</td><td>64</td><td>01100100</td><td>d</td></tr><tr><td>101</td><td>65</td><td>01100101</td><td>e</td></tr><tr><td>102</td><td>66</td><td>01100110</td><td>f</td></tr><tr><td>103</td><td>67</td><td>01100111</td><td>g</td></tr><tr><td>104</td><td>68</td><td>01101000</td><td>h</td></tr><tr><td>105</td><td>69</td><td>01101001</td><td>i</td></tr><tr><td>106</td><td>6A</td><td>01101010</td><td>j</td></tr><tr><td>107</td><td>6B</td><td>01101011</td><td>k</td></tr><tr><td>108</td><td>6C</td><td>01101100</td><td>l</td></tr><tr><td>109</td><td>6D</td><td>01101101</td><td>m</td></tr><tr><td>110</td><td>6E</td><td>01101110</td><td>n</td></tr><tr><td>111</td><td>6F</td><td>01101111</td><td>o</td></tr><tr><td>112</td><td>70</td><td>01110000</td><td>p</td></tr><tr><td>113</td><td>71</td><td>01110001</td><td>q</td></tr><tr><td>114</td><td>72</td><td>01110010</td><td>r</td></tr><tr><td>115</td><td>73</td><td>01110011</td><td>s</td></tr><tr><td>116</td><td>74</td><td>01110100</td><td>t</td></tr><tr><td>117</td><td>75</td><td>01110101</td><td>u</td></tr><tr><td>118</td><td>76</td><td>01110110</td><td>v</td></tr><tr><td>119</td><td>77</td><td>01110111</td><td>w</td></tr><tr><td>120</td><td>78</td><td>01111000</td><td>x</td></tr><tr><td>121</td><td>79</td><td>01111001</td><td>y</td></tr><tr><td>122</td><td>7A</td><td>01111010</td><td>z</td></tr><tr><td>123</td><td>7B</td><td>01111011</td><td>{</td></tr><tr><td>124</td><td>7C</td><td>01111100</td><td>|</td></tr><tr><td>125</td><td>7D</td><td>01111101</td><td>}</td></tr><tr><td>126</td><td>7E</td><td>01111110</td><td>~</td></tr><tr><td>127</td><td>7F</td><td>01111111</td><td>DEL</td></tr></tbody></table></div></details></li><li><p>To get an input with <code>9 f e 5 6 7</code> as the four last bits of each character:</p><ul><li><code>ionefg</code></li><li><code>Y_^UVW</code></li><li>…</li></ul></li></ul><h2 id="Phase-6"><a href="#Phase-6" class="headerlink" title="Phase 6"></a>Phase 6</h2><ul><li><p>Assembly:</p>  <div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br></pre></td><td class="code"><pre><span class="line">00000000004010f4 &lt;phase_6&gt;:</span><br><span class="line">    4010f4:441 56                push   %r14</span><br><span class="line">    4010f6:441 55                push   %r13</span><br><span class="line">    4010f8:441 54                push   %r12</span><br><span class="line">    4010fa:455                   push   %rbp</span><br><span class="line">    4010fb:453                   push   %rbx</span><br><span class="line">    4010fc:448 83 ec 50          sub    $0x50,%rsp</span><br><span class="line">    401100:449 89 e5             mov    %rsp,%r13</span><br><span class="line">    401103:448 89 e6             mov    %rsp,%rsi</span><br><span class="line">    401106:4e8 51 03 00 00       call   40145c &lt;read_six_numbers&gt;</span><br><span class="line">    40110b:449 89 e6             mov    %rsp,%r14</span><br><span class="line">    40110e:441 bc 00 00 00 00    mov    $0x0,%r12d</span><br><span class="line">    401114:44c 89 ed             mov    %r13,%rbp</span><br><span class="line">    401117:441 8b 45 00          mov    0x0(%r13),%eax</span><br><span class="line">    40111b:483 e8 01             sub    $0x1,%eax</span><br><span class="line">    40111e:483 f8 05             cmp    $0x5,%eax</span><br><span class="line">    401121:476 05                jbe    401128 &lt;phase_6+0x34&gt;</span><br><span class="line">    401123:4e8 12 03 00 00       call   40143a &lt;explode_bomb&gt;</span><br><span class="line">    401128:441 83 c4 01          add    $0x1,%r12d</span><br><span class="line">    40112c:441 83 fc 06          cmp    $0x6,%r12d</span><br><span class="line">    401130:474 21                je     401153 &lt;phase_6+0x5f&gt;</span><br><span class="line">    401132:444 89 e3             mov    %r12d,%ebx</span><br><span class="line">    401135:448 63 c3             movslq %ebx,%rax</span><br><span class="line">    401138:48b 04 84             mov    (%rsp,%rax,4),%eax</span><br><span class="line">    40113b:439 45 00             cmp    %eax,0x0(%rbp)</span><br><span class="line">    40113e:475 05                jne    401145 &lt;phase_6+0x51&gt;</span><br><span class="line">    401140:4e8 f5 02 00 00       call   40143a &lt;explode_bomb&gt;</span><br><span class="line">    401145:483 c3 01             add    $0x1,%ebx</span><br><span class="line">    401148:483 fb 05             cmp    $0x5,%ebx</span><br><span class="line">    40114b:47e e8                jle    401135 &lt;phase_6+0x41&gt;</span><br><span class="line">    40114d:449 83 c5 04          add    $0x4,%r13</span><br><span class="line">    401151:4eb c1                jmp    401114 &lt;phase_6+0x20&gt;</span><br><span class="line">    401153:448 8d 74 24 18       lea    0x18(%rsp),%rsi</span><br><span class="line">    401158:44c 89 f0             mov    %r14,%rax</span><br><span class="line">    40115b:4b9 07 00 00 00       mov    $0x7,%ecx</span><br><span class="line">    401160:489 ca                mov    %ecx,%edx</span><br><span class="line">    401162:42b 10                sub    (%rax),%edx</span><br><span class="line">    401164:489 10                mov    %edx,(%rax)</span><br><span class="line">    401166:448 83 c0 04          add    $0x4,%rax</span><br><span class="line">    40116a:448 39 f0             cmp    %rsi,%rax</span><br><span class="line">    40116d:475 f1                jne    401160 &lt;phase_6+0x6c&gt;</span><br><span class="line">    40116f:4be 00 00 00 00       mov    $0x0,%esi</span><br><span class="line">    401174:4eb 21                jmp    401197 &lt;phase_6+0xa3&gt;</span><br><span class="line">    401176:448 8b 52 08          mov    0x8(%rdx),%rdx</span><br><span class="line">    40117a:483 c0 01             add    $0x1,%eax</span><br><span class="line">    40117d:439 c8                cmp    %ecx,%eax</span><br><span class="line">    40117f:475 f5                jne    401176 &lt;phase_6+0x82&gt;</span><br><span class="line">    401181:4eb 05                jmp    401188 &lt;phase_6+0x94&gt;</span><br><span class="line">    401183:4ba d0 32 60 00       mov    $0x6032d0,%edx</span><br><span class="line">    401188:448 89 54 74 20       mov    %rdx,0x20(%rsp,%rsi,2)</span><br><span class="line">    40118d:448 83 c6 04          add    $0x4,%rsi</span><br><span class="line">    401191:448 83 fe 18          cmp    $0x18,%rsi</span><br><span class="line">    401195:474 14                je     4011ab &lt;phase_6+0xb7&gt;</span><br><span class="line">    401197:48b 0c 34             mov    (%rsp,%rsi,1),%ecx</span><br><span class="line">    40119a:483 f9 01             cmp    $0x1,%ecx</span><br><span class="line">    40119d:47e e4                jle    401183 &lt;phase_6+0x8f&gt;</span><br><span class="line">    40119f:4b8 01 00 00 00       mov    $0x1,%eax</span><br><span class="line">    4011a4:4ba d0 32 60 00       mov    $0x6032d0,%edx</span><br><span class="line">    4011a9:4eb cb                jmp    401176 &lt;phase_6+0x82&gt;</span><br><span class="line">    4011ab:448 8b 5c 24 20       mov    0x20(%rsp),%rbx</span><br><span class="line">    4011b0:448 8d 44 24 28       lea    0x28(%rsp),%rax</span><br><span class="line">    4011b5:448 8d 74 24 50       lea    0x50(%rsp),%rsi</span><br><span class="line">    4011ba:448 89 d9             mov    %rbx,%rcx</span><br><span class="line">    4011bd:448 8b 10             mov    (%rax),%rdx</span><br><span class="line">    4011c0:448 89 51 08          mov    %rdx,0x8(%rcx)</span><br><span class="line">    4011c4:448 83 c0 08          add    $0x8,%rax</span><br><span class="line">    4011c8:448 39 f0             cmp    %rsi,%rax</span><br><span class="line">    4011cb:474 05                je     4011d2 &lt;phase_6+0xde&gt;</span><br><span class="line">    4011cd:448 89 d1             mov    %rdx,%rcx</span><br><span class="line">    4011d0:4eb eb                jmp    4011bd &lt;phase_6+0xc9&gt;</span><br><span class="line">    4011d2:448 c7 42 08 00 00 00 movq   $0x0,0x8(%rdx)</span><br><span class="line">    4011d9:400</span><br><span class="line">    4011da:4bd 05 00 00 00       mov    $0x5,%ebp</span><br><span class="line">    4011df:448 8b 43 08          mov    0x8(%rbx),%rax</span><br><span class="line">    4011e3:48b 00                mov    (%rax),%eax</span><br><span class="line">    4011e5:439 03                cmp    %eax,(%rbx)</span><br><span class="line">    4011e7:47d 05                jge    4011ee &lt;phase_6+0xfa&gt;</span><br><span class="line">    4011e9:4e8 4c 02 00 00       call   40143a &lt;explode_bomb&gt;</span><br><span class="line">    4011ee:448 8b 5b 08          mov    0x8(%rbx),%rbx</span><br><span class="line">    4011f2:483 ed 01             sub    $0x1,%ebp</span><br><span class="line">    4011f5:475 e8                jne    4011df &lt;phase_6+0xeb&gt;</span><br><span class="line">    4011f7:448 83 c4 50          add    $0x50,%rsp</span><br><span class="line">    4011fb:45b                   pop    %rbx</span><br><span class="line">    4011fc:45d                   pop    %rbp</span><br><span class="line">    4011fd:441 5c                pop    %r12</span><br><span class="line">    4011ff:441 5d                pop    %r13</span><br><span class="line">    401201:441 5e                pop    %r14</span><br><span class="line">    401203:4c3                   ret</span><br></pre></td></tr></table></figure></div></li><li><p>Holy, that is quite a large piece of code.</p></li><li><p>Well, its core logic can be cut into several parts.</p></li></ul><h4 id="Checking-Input"><a href="#Checking-Input" class="headerlink" title="Checking Input"></a>Checking Input</h4><ul><li><p>The input is parsed by <code>read_six_numbers</code> as the one explained before.</p></li><li><p>Then the function perform a loop in order to check whether any input is less than 6 (and also larger than 0), and to ensure that each number is unique to others:</p>  <div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line">40110e:441 bc 00 00 00 00    mov    $0x0,%r12d</span><br><span class="line">401114:44c 89 ed             mov    %r13,%rbp</span><br><span class="line">401117:441 8b 45 00          mov    0x0(%r13),%eax</span><br><span class="line">40111b:483 e8 01             sub    $0x1,%eax</span><br><span class="line">40111e:483 f8 05             cmp    $0x5,%eax</span><br><span class="line">401121:476 05                jbe    401128 &lt;phase_6+0x34&gt;</span><br><span class="line">401123:4e8 12 03 00 00       call   40143a &lt;explode_bomb&gt;</span><br><span class="line">401128:441 83 c4 01          add    $0x1,%r12d</span><br><span class="line">40112c:441 83 fc 06          cmp    $0x6,%r12d</span><br><span class="line">401130:474 21                je     401153 &lt;phase_6+0x5f&gt;</span><br><span class="line">401132:444 89 e3             mov    %r12d,%ebx</span><br><span class="line">401135:448 63 c3             movslq %ebx,%rax</span><br><span class="line">401138:48b 04 84             mov    (%rsp,%rax,4),%eax</span><br><span class="line">40113b:439 45 00             cmp    %eax,0x0(%rbp)</span><br><span class="line">40113e:475 05                jne    401145 &lt;phase_6+0x51&gt;</span><br><span class="line">401140:4e8 f5 02 00 00       call   40143a &lt;explode_bomb&gt;</span><br><span class="line">401145:483 c3 01             add    $0x1,%ebx</span><br><span class="line">401148:483 fb 05             cmp    $0x5,%ebx</span><br><span class="line">40114b:47e e8                jle    401135 &lt;phase_6+0x41&gt;</span><br><span class="line">40114d:449 83 c5 04          add    $0x4,%r13</span><br><span class="line">401151:4eb c1                jmp    401114 &lt;phase_6+0x20&gt;</span><br></pre></td></tr></table></figure></div><ul><li><p>Pseudocode:</p>  <div class="code-container" data-rel="C"><figure class="iseeu highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// r13 points to the current input number</span></span><br><span class="line"><span class="type">int</span> *r13 = rsp;</span><br><span class="line"><span class="type">int</span> r12 = <span class="number">0</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">while</span> (<span class="number">1</span>) &#123;</span><br><span class="line">    <span class="type">int</span> *rbp = r13;</span><br><span class="line">    <span class="type">int</span> rax = *r13;</span><br><span class="line">    rax -= <span class="number">1</span>;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> (rax &gt; <span class="number">0x5</span>) explode_bomb();</span><br><span class="line"></span><br><span class="line">    r12 += <span class="number">1</span>;</span><br><span class="line">    <span class="keyword">if</span> (r12 == <span class="number">6</span>) <span class="keyword">break</span>;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">for</span> (<span class="type">int</span> rbx = r12; rbx &lt;= <span class="number">0x5</span>; rbx ++) &#123;</span><br><span class="line">        rax = rbx;</span><br><span class="line">        rax = nums[rax];</span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> (rax == *rbp) explode_bomb();</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    r13 += <span class="number">4</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></div></li></ul></li></ul><h4 id="Subtract-Each-Number-From-7"><a href="#Subtract-Each-Number-From-7" class="headerlink" title="Subtract Each Number From 7"></a>Subtract Each Number From 7</h4><ul><li><p>Then the function subtract each of the six input number from 7:</p>  <div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">401153:448 8d 74 24 18       lea    0x18(%rsp),%rsi</span><br><span class="line">401158:44c 89 f0             mov    %r14,%rax</span><br><span class="line">40115b:4b9 07 00 00 00       mov    $0x7,%ecx</span><br><span class="line">401160:489 ca                mov    %ecx,%edx</span><br><span class="line">401162:42b 10                sub    (%rax),%edx</span><br><span class="line">401164:489 10                mov    %edx,(%rax)</span><br><span class="line">401166:448 83 c0 04          add    $0x4,%rax</span><br><span class="line">40116a:448 39 f0             cmp    %rsi,%rax</span><br><span class="line">40116d:475 f1                jne    401160 &lt;phase_6+0x6c&gt;</span><br></pre></td></tr></table></figure></div></li><li><p>Pseudocode:</p>  <div class="code-container" data-rel="C"><figure class="iseeu highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> rcx = <span class="number">7</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> (<span class="type">int</span> rax = <span class="number">0</span>; rax &lt;= <span class="number">5</span>; rax++) &#123;</span><br><span class="line">    <span class="type">int</span> rdx = rcx;</span><br><span class="line">    rdx -= nums[rax];</span><br><span class="line">    nums[rax] = rdx;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></div></li></ul><h4 id="Load-Linked-List"><a href="#Load-Linked-List" class="headerlink" title="Load Linked List"></a>Load Linked List</h4><ul><li><p>After that, the function load six nodes of a linked list onto the stack:</p>  <div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line">40116f:4be 00 00 00 00       mov    $0x0,%esi</span><br><span class="line">401174:4eb 21                jmp    401197 &lt;phase_6+0xa3&gt;</span><br><span class="line">401176:448 8b 52 08          mov    0x8(%rdx),%rdx</span><br><span class="line">40117a:483 c0 01             add    $0x1,%eax</span><br><span class="line">40117d:439 c8                cmp    %ecx,%eax</span><br><span class="line">40117f:475 f5                jne    401176 &lt;phase_6+0x82&gt;</span><br><span class="line">401181:4eb 05                jmp    401188 &lt;phase_6+0x94&gt;</span><br><span class="line">401183:4ba d0 32 60 00       mov    $0x6032d0,%edx</span><br><span class="line">401188:448 89 54 74 20       mov    %rdx,0x20(%rsp,%rsi,2)</span><br><span class="line">40118d:448 83 c6 04          add    $0x4,%rsi</span><br><span class="line">401191:448 83 fe 18          cmp    $0x18,%rsi</span><br><span class="line">401195:474 14                je     4011ab &lt;phase_6+0xb7&gt;</span><br><span class="line">401197:48b 0c 34             mov    (%rsp,%rsi,1),%ecx</span><br><span class="line">40119a:483 f9 01             cmp    $0x1,%ecx</span><br><span class="line">40119d:47e e4                jle    401183 &lt;phase_6+0x8f&gt;</span><br><span class="line">40119f:4b8 01 00 00 00       mov    $0x1,%eax</span><br><span class="line">4011a4:4ba d0 32 60 00       mov    $0x6032d0,%edx</span><br><span class="line">4011a9:4eb cb                jmp    401176 &lt;phase_6+0x82&gt;</span><br></pre></td></tr></table></figure></div></li><li><p>We can see it from memory <code>0x6032d0</code>:</p>  <div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">x/wx 0x6032d0</span><br><span class="line">0x6032d0 &lt;node1&gt;:40x0000014c</span><br><span class="line">(gdb) x/wx 0x6032d0 + 0x4</span><br><span class="line">0x6032d4 &lt;node1+4&gt;:40x00000001</span><br><span class="line">(gdb) x/wx 0x6032d0 + 0x8</span><br><span class="line">0x6032d8 &lt;node1+8&gt;:40x006032e0</span><br><span class="line">(gdb) x/wx 0x6032e0</span><br><span class="line">0x6032e0 &lt;node2&gt;:40x000000a8</span><br></pre></td></tr></table></figure></div></li><li><p>There are six nodes in the linked list, their values are as follow:</p>  <div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">node1: 332</span><br><span class="line">node2: 168</span><br><span class="line">node3: 924</span><br><span class="line">node4: 691</span><br><span class="line">node5: 477</span><br><span class="line">node6: 443</span><br></pre></td></tr></table></figure></div><p>  <em>values are shown as decimal numbers</em></p></li><li><p>They are loaded on to the upper area of the stack:</p>  <div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line">      ┌──────────────┐</span><br><span class="line">+0x48 │ node_addr[5] │</span><br><span class="line">      ├──────────────┤</span><br><span class="line">      │ node_addr[4] │</span><br><span class="line">      ├──────────────┤</span><br><span class="line">      │ node_addr[3] │</span><br><span class="line">      ├──────────────┤</span><br><span class="line">      │ node_addr[2] │</span><br><span class="line">      ├──────────────┤</span><br><span class="line">      │ node_addr[1] │</span><br><span class="line">      ├──────────────┤</span><br><span class="line">+0x20 │ node_addr[0] │</span><br><span class="line">      ├──────────────┤</span><br><span class="line">      │     ...      │</span><br><span class="line">      ├──────────────┤</span><br><span class="line">+0x18 │ int arr[5]   │</span><br><span class="line">      ├──────────────┤</span><br><span class="line">      │ int arr[4]   │</span><br><span class="line">      ├──────────────┤</span><br><span class="line">      │ int arr[3]   │</span><br><span class="line">      ├──────────────┤</span><br><span class="line">      │ int arr[2]   │</span><br><span class="line">      ├──────────────┤</span><br><span class="line">      │ int arr[1]   │</span><br><span class="line">      ├──────────────┤</span><br><span class="line">+0x00 │ int arr[0]   │  &lt;---  %rsp</span><br><span class="line">      └──────────────┘</span><br></pre></td></tr></table></figure></div></li><li><p>The order of the nodes is the same as user input subtracted from 7. For example if the user input <code>6 5 4 3 2 1</code>, then the nodes pointed by the address on the stack is <code>node1 node2 node3 node4 node5 node6</code>, upwards.</p></li></ul><h4 id="Reorder-linked-list"><a href="#Reorder-linked-list" class="headerlink" title="Reorder linked list"></a>Reorder linked list</h4><ul><li><p>Then the function would reorder the linked list, while the old order is a straight from 1 to 6.</p>  <div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">4011ab:448 8b 5c 24 20       mov    0x20(%rsp),%rbx</span><br><span class="line">4011b0:448 8d 44 24 28       lea    0x28(%rsp),%rax</span><br><span class="line">4011b5:448 8d 74 24 50       lea    0x50(%rsp),%rsi</span><br><span class="line">4011ba:448 89 d9             mov    %rbx,%rcx</span><br><span class="line">4011bd:448 8b 10             mov    (%rax),%rdx</span><br><span class="line">4011c0:448 89 51 08          mov    %rdx,0x8(%rcx)</span><br><span class="line">4011c4:448 83 c0 08          add    $0x8,%rax</span><br><span class="line">4011c8:448 39 f0             cmp    %rsi,%rax</span><br><span class="line">4011cb:474 05                je     4011d2 &lt;phase_6+0xde&gt;</span><br><span class="line">4011cd:448 89 d1             mov    %rdx,%rcx</span><br><span class="line">4011d0:4eb eb                jmp    4011bd &lt;phase_6+0xc9&gt;</span><br><span class="line">4011d2:448 c7 42 08 00 00 00 movq   $0x0,0x8(%rdx)</span><br></pre></td></tr></table></figure></div></li><li><p>This would reorder the linked list by the order of the addresses on the stack. The nodes are now pointing upwards after the loop, from the perspective of the addresses on the stack.</p></li></ul><h4 id="Examine-The-Order"><a href="#Examine-The-Order" class="headerlink" title="Examine The Order"></a>Examine The Order</h4><ul><li><p>The final loop would check whether the new order of the linked nodes are <strong>descending</strong> to their values.</p>  <div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">4011da:4bd 05 00 00 00       mov    $0x5,%ebp</span><br><span class="line">4011df:448 8b 43 08          mov    0x8(%rbx),%rax</span><br><span class="line">4011e3:48b 00                mov    (%rax),%eax</span><br><span class="line">4011e5:439 03                cmp    %eax,(%rbx)</span><br><span class="line">4011e7:47d 05                jge    4011ee &lt;phase_6+0xfa&gt;</span><br><span class="line">4011e9:4e8 4c 02 00 00       call   40143a &lt;explode_bomb&gt;</span><br><span class="line">4011ee:448 8b 5b 08          mov    0x8(%rbx),%rbx</span><br><span class="line">4011f2:483 ed 01             sub    $0x1,%ebp</span><br><span class="line">4011f5:475 e8                jne    4011df &lt;phase_6+0xeb&gt;</span><br></pre></td></tr></table></figure></div></li><li><p>A reminder of the linked list:</p>  <div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">node1: 332</span><br><span class="line">node2: 168</span><br><span class="line">node3: 924</span><br><span class="line">node4: 691</span><br><span class="line">node5: 477</span><br><span class="line">node6: 443</span><br></pre></td></tr></table></figure></div></li><li><p>Obviously the expected order is : <code>3 -&gt; 4 -&gt; 5 -&gt; 6 -&gt; 1 -&gt; 2</code>.</p></li></ul><h4 id="Conclusion"><a href="#Conclusion" class="headerlink" title="Conclusion"></a>Conclusion</h4><ul><li><p>From these four parts we can see that the function is basically manipulating the user input, and then examine whether the order is as expected or not.</p></li><li><p>The expected order(nodes &amp; input):</p>  <div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">3 -&gt; 4 -&gt; 5 -&gt; 6 -&gt; 1 -&gt; 2</span><br></pre></td></tr></table></figure></div></li><li><p>The order before reorder(nodes &amp; input):</p>  <div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">3 -&gt; 4 -&gt; 5 -&gt; 6  1 -&gt; 2 ─┐</span><br><span class="line">│                         │</span><br><span class="line">└─────────────────────────┘</span><br></pre></td></tr></table></figure></div></li><li><p>The order before being subtracted from 7 (input):</p>  <div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">4 3 2 1 6 5</span><br></pre></td></tr></table></figure></div></li><li><p>Which is the answer.</p></li></ul><hr><p><em>Phew!</em></p><h1 id="End"><a href="#End" class="headerlink" title="End"></a>End</h1>]]>
    </content>
    <id>https://blog.imlast.top/2026/07/21/cmu15213-bomblab/</id>
    <link href="https://blog.imlast.top/2026/07/21/cmu15213-bomblab/"/>
    <published>2026-07-21T01:17:10.000Z</published>
    <summary>Fun puzzles in bomblab</summary>
    <title>CMU 15-213 Bomb Lab</title>
    <updated>2026-07-21T01:17:10.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>Last</name>
    </author>
    <category term="笔记" scheme="https://blog.imlast.top/categories/%E7%AC%94%E8%AE%B0/"/>
    <category term="c" scheme="https://blog.imlast.top/tags/c/"/>
    <category term="cmu15213" scheme="https://blog.imlast.top/tags/cmu15213/"/>
    <content>
      <![CDATA[<h2 id="x86-64-registers"><a href="#x86-64-registers" class="headerlink" title="x86-64 registers"></a>x86-64 registers</h2><p><img src="https://www.imlast.top/images/x86-64_reg.webp" alt="x86 registers"></p><h3 id="Archeology-Name-Layer"><a href="#Archeology-Name-Layer" class="headerlink" title="Archeology Name Layer"></a>Archeology Name Layer</h3><ul><li><p>One register can have four identities: <code>RAX</code> -&gt; <code>EAX</code> -&gt; <code>AX</code> -&gt; <code>AL</code>. <code>EAX</code> is the lower byte of <code>RAX</code>, <code>AX</code> is the lower byte of <code>EAX</code> and <code>AL</code> is still the lowest 8 bytes.</p><blockquote><p>[!NOTE]<br>Writing the lower 32 bits of a register would clear the higher 32 bits of it.(<code>mov eax, 1</code> would clear the higher 32 bits of <code>rax</code>)</p></blockquote></li><li><p>This is due to Intel’s backward compatability decision, making it impossible to change the names of the registers in their cpu. As a result, they could only extend the names of these registers while reserving the old ones.</p></li></ul><h3 id="Special-Regsiters"><a href="#Special-Regsiters" class="headerlink" title="Special Regsiters"></a>Special Regsiters</h3><ul><li>There are some registers with special purposes:<ul><li><p><code>RSP</code>, representing stack pointer, points to the top of the current stack.</p></li><li><p><code>RBP</code>, representing base pointer, is used for creating stack frame.(Not common for modern compilers)</p></li><li><p><code>RIP</code>, representing instruction pointer, stores the address of the instruction to be executed <strong>next</strong>.</p></li></ul></li></ul><h2 id="Calling-Convention"><a href="#Calling-Convention" class="headerlink" title="Calling Convention"></a>Calling Convention</h2><h3 id="Linux-MacOS-System-V-AMD64-ABI"><a href="#Linux-MacOS-System-V-AMD64-ABI" class="headerlink" title="Linux&#x2F;MacOS: System V AMD64 ABI"></a>Linux&#x2F;MacOS: System V AMD64 ABI</h3><ul><li><p>For a standard function call, 6 of its parameters goes into <code>RDI, RSI, RDX, RCX, R8, R9</code> in order.</p><ul><li>For example, when calling function <code>long f(long a, long b, long c, long d, long e, long f);</code>, the corresponding register for each of the parameters is:<ul><li><code>a</code> -&gt; <code>RDI</code></li><li><code>b</code> -&gt; <code>RSI</code></li><li><code>c</code> -&gt; <code>RDX</code></li><li><code>d</code> -&gt; <code>RCX</code></li><li><code>e</code> -&gt; <code>R8</code></li><li><code>f</code> -&gt; <code>R9</code></li></ul></li></ul></li><li><p>Parameters after the sixth goes to the stack.</p></li></ul><blockquote><p>[!NOTE]<br>Floating point parameters have their own special registers.</p></blockquote><ul><li>Return values are usually stored in <code>RAX</code>. If it’s too big to be stored inside one register, use <code>RAX + RDX</code>.</li></ul><h4 id="Caller-saved-Callee-saved"><a href="#Caller-saved-Callee-saved" class="headerlink" title="Caller-saved &amp; Callee-saved"></a>Caller-saved &amp; Callee-saved</h4><ul><li><p>Sometimes the execution of a funcion might overwrite the value in other registers set by the caller, though the values inside them might still be required for subsequent process. There are two conventions to resolve this problem.</p><ul><li><strong>Caller-saved</strong>: The caller of the function should save the values which are required after the function call on its own.</li><li><strong>Callee-saved</strong>: The funcion that is called should restore the values of the ones it overwrites before return.</li></ul></li><li><p>In System V AMD64 ABI:</p><ul><li>Registers <code>RAX, RCX, RDX, RSI, RDI, R8, R9, R10, R11</code> are caller-saved.</li><li>Registers <code>RBX, RBP, R12, R13, R14, R15</code> are callee-saved.</li></ul></li></ul><h4 id="Stack-Address-Alignment"><a href="#Stack-Address-Alignment" class="headerlink" title="Stack Address Alignment"></a>Stack Address Alignment</h4><ul><li>For historical and performance reason, it is required that the address stored in <code>RSP</code> is 16-byte aligned. However, the caller would push the return address on the stack when calling, so situation becomes <code>%rsp % 16 == 8</code> when the callee arrives.</li></ul><h3 id="Windows-x64-Microsoft-x64-calling-convention-Optional"><a href="#Windows-x64-Microsoft-x64-calling-convention-Optional" class="headerlink" title="Windows x64: Microsoft x64 calling convention (Optional)"></a>Windows x64: Microsoft x64 calling convention <em>(Optional)</em></h3><ul><li><p>Similiar to System V AMD64 ABI, puting the first four parameters to <code>RCX, RDX, R8, R9</code> in order while the rest goes on to the stack.</p></li><li><p>Return values are usually stored in <code>RAX</code>. If it’s too big to be stored inside one register, use <code>RAX + RDX</code>.</p></li></ul>]]>
    </content>
    <id>https://blog.imlast.top/2026/07/13/cmu15213-1/</id>
    <link href="https://blog.imlast.top/2026/07/13/cmu15213-1/"/>
    <published>2026-07-13T01:12:22.000Z</published>
    <summary>Some machine level programming</summary>
    <title>CMU 15-213 [1]</title>
    <updated>2026-07-13T01:12:22.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>Last</name>
    </author>
    <category term="笔记" scheme="https://blog.imlast.top/categories/%E7%AC%94%E8%AE%B0/"/>
    <category term="browser" scheme="https://blog.imlast.top/tags/browser/"/>
    <category term="wxt" scheme="https://blog.imlast.top/tags/wxt/"/>
    <content>
      <![CDATA[<h1 id="textarea-自动伸缩"><a href="#textarea-自动伸缩" class="headerlink" title="textarea 自动伸缩"></a>textarea 自动伸缩</h1><ul><li><p>一个简单的需求：我们希望当用户输入的提示词长度过大时，textarea 的高度能随之伸展，将所有提示词内容显示出来。</p></li><li><p>相关代码：</p>  <div class="code-container" data-rel="Ts"><figure class="iseeu highlight ts"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">function</span> <span class="title function_">adjustUI</span>(<span class="params"></span>) &#123;</span><br><span class="line">    <span class="keyword">if</span> (!textareaRef) &#123;</span><br><span class="line">        logger.<span class="title function_">error</span>(<span class="string">&quot; textareaRef is undefined, unable to reset textarea height. &quot;</span>);</span><br><span class="line">        <span class="keyword">return</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    textareaRef.<span class="property">style</span>.<span class="property">height</span> = <span class="string">&quot;auto&quot;</span>;</span><br><span class="line">    textareaRef.<span class="property">style</span>.<span class="property">height</span> = <span class="string">`<span class="subst">$&#123;textareaRef.scrollHeight &lt;= <span class="number">500</span> ? textareaRef.scrollHeight : <span class="number">500</span>&#125;</span>px`</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></div><ul><li><p>其中，<code>textareaRef</code> 是通过 <code>bind</code> 和 textarea element 绑定在一起的：</p>  <div class="code-container" data-rel="Ts"><figure class="iseeu highlight ts"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">&lt;textarea</span><br><span class="line">    <span class="attr">bind</span>:<span class="variable language_">this</span>=&#123;textareaRef&#125;</span><br><span class="line">    oninput=&#123;adjustUI&#125;</span><br><span class="line">    <span class="comment">// ...</span></span><br><span class="line">&gt;&lt;/textarea&gt;</span><br></pre></td></tr></table></figure></div></li></ul></li><li><p>同时，在用户提交输入之后需要将输入框复原：</p>  <div class="code-container" data-rel="Ts"><figure class="iseeu highlight ts"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">textareaRef.<span class="property">style</span>.<span class="property">height</span> = <span class="string">&quot;auto&quot;</span>;</span><br></pre></td></tr></table></figure></div></li></ul><h1 id="LLM-回复状态层"><a href="#LLM-回复状态层" class="headerlink" title="LLM 回复状态层"></a>LLM 回复状态层</h1><ul><li><p>期初的问题是：如何在用户发送消息之后在 UI 上渲染一个 Skeleton 消息来向用户表示“正在请求回复”。</p></li><li><p>一开始我是直接在消息数组中插入一个假消息作为 placeholder：</p>  <div class="code-container" data-rel="Ts"><figure class="iseeu highlight ts"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">&#123;</span><br><span class="line">    <span class="attr">id</span>: messageId,</span><br><span class="line">    <span class="attr">role</span>: <span class="string">&quot;assistant&quot;</span>,</span><br><span class="line">    <span class="attr">timestamp</span>: <span class="title function_">getCurrentTimestamp</span>(),</span><br><span class="line">    <span class="attr">content</span>: <span class="string">&quot;Fetching response...&quot;</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></div></li><li><p>然后在 <code>Chat.svelte</code> 中判断 <code>messages</code> 的最后一条消息 <code>content</code> 是否为 “Fetching response…”，如果是，那么就将他渲染为 Placeholder 组件。</p></li><li><p>很显然，这是个非常丑陋的方案。我在与 ChatGPT 探讨一番后定下了一个设计：</p>  <div class="code-container" data-rel="Ts"><figure class="iseeu highlight ts"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">export</span> <span class="keyword">type</span> <span class="title class_">LLMResponseState</span> = &#123;</span><br><span class="line">    <span class="attr">messageId</span>: <span class="built_in">string</span>;</span><br><span class="line">    <span class="attr">phase</span>: <span class="string">&quot;idle&quot;</span> | <span class="string">&quot;pending&quot;</span> | <span class="string">&quot;streaming&quot;</span> | <span class="string">&quot;error&quot;</span>;</span><br><span class="line">    <span class="attr">error</span>: <span class="built_in">string</span>;</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure></div></li><li><p>在父组件 <code>App.svelte</code> 中定义一个新的 state 来追踪当前 LLM 的回复状态。这样一来，不只是等待回复中的 UI 提示便于设计，整个插件应用在用户的使用周期中的行为顺序设定也有了一个“抓手”。</p></li></ul><details class="relative my-4 border border-border-color bg-second-background-color rounded-md  green" data-header-exclude><summary class="px-4 py-2 rounded-md shadow-[0_0_2px_0_var(--shadow-color-1)] cursor-pointer not-markdown"><i class="fa-solid fa-chevron-right"></i>一个简单的流程示意图</summary><div class="content p-4 "><pre class="mermaid">flowchart TDA[idle] -->|_user submits prompt_| B[pending]B -->|user message already added \n assistantMessageId reserved \n no assistant MessageFeed yet \n `Chat.svelte` renders visual placeholder| C[streaming: first chunk]C -->| create assistant MessageFeed with reserved id \n content starts as '' \n append first chunk \n Chat now renders the real assistant message | D[streaming: more chunks]D -->|append chunk by messageId| E[idle]</pre></div></details><ul><li><p>此外，<code>callLLM</code> 函数中接受一个 <code>callback</code> 对象：</p>  <div class="code-container" data-rel="Ts"><figure class="iseeu highlight ts"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">export</span> <span class="keyword">type</span> <span class="title class_">LLMCallback</span> = &#123;</span><br><span class="line">    <span class="attr">onStream</span>: <span class="function">(<span class="params"><span class="attr">chunk</span>: <span class="built_in">string</span></span>) =&gt;</span> <span class="built_in">void</span>;</span><br><span class="line">    <span class="attr">onDone</span>: <span class="function">() =&gt;</span> <span class="built_in">void</span>;</span><br><span class="line">    <span class="attr">onError</span>: <span class="function">(<span class="params"><span class="attr">error</span>: <span class="built_in">string</span></span>) =&gt;</span> <span class="built_in">void</span>;</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure></div><ol><li><code>onStream</code> 负责将流式传输获取的 <code>chunk</code> 填入当前接收 LLM 消息输出的 <code>MessageFeed</code>，再籍由 Svelte 5 提供的深度状态机制自动触发 UI 更新</li><li><code>onDone</code> 负责在每条消息传输完成之后将对话内容持久化，即存储到 localStorage</li><li><code>onError</code> 负责触发 error 信息。（ <em>目前还未实现错误处理的 UI</em> ）</li></ol></li><li><p>这样一来，一次请求的周期，以及各自的状态变更和相对应的流程就非常明确了。</p></li></ul><h1 id="对话内容的持久化存储"><a href="#对话内容的持久化存储" class="headerlink" title="对话内容的持久化存储"></a>对话内容的持久化存储</h1><ul><li><p>wxt 提供了一个 <code>storage</code> 模块，可以操作浏览器插件的 <code>browser.storage.local</code>：</p>  <div class="code-container" data-rel="Ts"><figure class="iseeu highlight ts"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> &#123; storage &#125; <span class="keyword">from</span> <span class="string">&quot;wxt/utils/storage&quot;</span>;</span><br></pre></td></tr></table></figure></div></li><li><p>目前插件对于用户创建对话的处理流程是：</p>  <pre class="mermaid">    flowchart TD  A[no conversation] --->|user input| B[add user prompt \n **store conversation**]  B --->|stream llm message| C[stream llm message chunks into messageFeed \n **store conversation**]</pre></li><li><p>可以看到，存储对话信息的时间在 <strong>用户消息发送之后</strong> ，以及 <strong>LLM 消息传输完成之后</strong> 。这意味着如果用户在流式传输的过程中关闭插件侧板，将会导致流式传输中断，并且不会触发保存机制。</p></li><li><p>目前来说，这是预期内行为，因为我感觉将 API 请求和流式传输搬到 <code>background.ts</code> 实在是有些笨重。或许将来会考虑这样做。</p></li></ul><hr><ul><li><p>值得一提的是，浏览器插件的 storage 毕竟不是数据库，并不支持 <em>根据 <code>sessionId</code> 来存取对应的 <code>Conversation</code></em> 这种行为，因此笔者决定采用 Key Prefixing 的方式——直接将 <code>sessionId</code> 当作 <code>key</code> 存在 Storage 中：</p>  <div class="code-container" data-rel="Ts"><figure class="iseeu highlight ts"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">export</span> <span class="keyword">function</span> <span class="title function_">getConversationKey</span>(<span class="params"><span class="attr">sessionId</span>: UUID</span>): <span class="string">`local:<span class="subst">$&#123;<span class="built_in">string</span>&#125;</span>`</span> &#123;</span><br><span class="line">    <span class="keyword">return</span> <span class="string">`local:conversation:<span class="subst">$&#123;sessionId&#125;</span>`</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></div></li><li><p>这样一来就可以在某种程度上实现 <em>根据 <code>sessionId</code> 来存取对应的 <code>Conversation</code></em> 的行为。</p></li></ul><h1 id="Streaming-消息的流式传输"><a href="#Streaming-消息的流式传输" class="headerlink" title="Streaming 消息的流式传输"></a>Streaming 消息的流式传输</h1><ul><li><p>流式传输——这是一个 LLM 应用前端的“典中典”功能，其在 <code>OpenAI</code> 官方提供的第三方库的帮助下，实现意外的简单。</p></li><li><p><code>callback</code> 函数中的 <code>onStream</code> 如下所示：</p>  <div class="code-container" data-rel="Ts"><figure class="iseeu highlight ts"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> messageId the target message feed reserved for LLM response</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> chunk new arrived chunk ready for streaming</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@description</span> update message with id `messageId` in `messageFeed` by adding `chunk` to its content</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">streamMessage</span>(<span class="params"><span class="attr">messageId</span>: UUID, <span class="attr">chunk</span>: <span class="built_in">string</span></span>) &#123;</span><br><span class="line">    <span class="keyword">const</span> index = conversation?.<span class="property">messages</span>.<span class="title function_">findIndex</span>(<span class="function">(<span class="params">m</span>) =&gt;</span> m.<span class="property">id</span> === messageId);</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> (index === -<span class="number">1</span>) &#123;</span><br><span class="line">        logger.<span class="title function_">error</span>(<span class="string">&quot;target messageId does not exist: &quot;</span>, messageId);</span><br><span class="line">        <span class="keyword">return</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    llmResponse.<span class="property">phase</span> = <span class="string">&quot;streaming&quot;</span>;</span><br><span class="line">    <span class="comment">// <span class="doctag">NOTE:</span> requires svelte 5 deep state</span></span><br><span class="line">    conversation.<span class="property">messages</span>[index].<span class="property">content</span> += chunk;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></div></li><li><p>至于 <code>callLLM</code> 中的流式传输逻辑：</p>  <div class="code-container" data-rel="Ts"><figure class="iseeu highlight ts"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// LLM API integration</span></span><br><span class="line"><span class="keyword">try</span> &#123;</span><br><span class="line">    <span class="keyword">const</span> stream = <span class="keyword">await</span> client.<span class="property">chat</span>.<span class="property">completions</span>.<span class="title function_">create</span>(&#123;</span><br><span class="line">        <span class="attr">model</span>: params.<span class="property">modelName</span>,</span><br><span class="line">        <span class="attr">messages</span>: completeContext,</span><br><span class="line">        <span class="attr">stream</span>: <span class="literal">true</span></span><br><span class="line">    &#125;);</span><br><span class="line"></span><br><span class="line">    <span class="comment">// update message with LLM stream response</span></span><br><span class="line">    <span class="keyword">for</span> <span class="keyword">await</span> (<span class="keyword">const</span> chunk <span class="keyword">of</span> stream) &#123;</span><br><span class="line">        <span class="keyword">const</span> chunkContent = chunk.<span class="property">choices</span>[<span class="number">0</span>]?.<span class="property">delta</span>?.<span class="property">content</span> || <span class="string">&quot;&quot;</span>;</span><br><span class="line">        <span class="keyword">if</span> (chunkContent) params.<span class="property">callback</span>.<span class="title function_">onStream</span>(chunkContent);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    params.<span class="property">callback</span>.<span class="title function_">onDone</span>();</span><br><span class="line">&#125; <span class="keyword">catch</span> (error) &#123;</span><br><span class="line">    params.<span class="property">callback</span>.<span class="title function_">onError</span>(<span class="title class_">String</span>(error));</span><br><span class="line">    <span class="keyword">throw</span> error;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></div><p>  <em><code>client</code> 是一个 <code>OpenAI</code> 对象</em></p></li><li><p>我还真是第一次在 js&#x2F;ts 中遇到这种“异步循环” <code>for await</code>，看了一下 <a class="link"   href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for-await...of" >MDN<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a>：</p><blockquote><p>The for <code>await...of</code> statement creates a loop iterating over async iterable objects as well as sync iterables. This statement can only be used in contexts where <code>await</code> can be used, which includes inside an async function body and in a module.</p></blockquote></li><li><p>倘若如此的话，<code>stream</code> 应该是一个 <em>async iterable object</em> ？查看其类型，发现是 <code>Stream&lt;ChatCompletionChunk&gt; &amp; &#123; _request_id?: string | null | undefined &#125;</code>。</p></li><li><p>翻看 <a class="link"   href="https://developers.openai.com/api/reference/resources/completions/methods/create" >OpenAI 文档<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a> 得知参数 <code>stream</code> ：</p><blockquote><p>stream: optional boolean<br>Whether to stream back partial progress. If set, tokens will be sent as data-only <a class="link"   href="https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events#Event_stream_format" >server-sent events<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a> as they become available, with the stream terminated by a <code>data: [DONE]</code> message.</p></blockquote></li><li><p>所以简而言之，<code>client.chat.completions.create</code> 中将 <code>stream</code> 参数设置为 <code>true</code> 即可让其返回在 resolve 后返回一个特殊的 <code>iterable object</code> (<code>Stream&lt;ChatCompletionChunk&gt;</code>) 的 <code>APIPromise</code>；对这个特殊的可迭代对象使用 <code>for-await</code> 循环即可渐进的取得流式传输的输出。</p></li></ul><details class="relative my-4 border border-border-color bg-second-background-color rounded-md  blue" data-header-exclude><summary class="px-4 py-2 rounded-md shadow-[0_0_2px_0_var(--shadow-color-1)] cursor-pointer not-markdown"><i class="fa-solid fa-chevron-right"></i>已严肃学习</summary><div class="content p-4 "><ul><li>瞅了一眼 <code>openai</code> 库源码，发现 <code>Stream</code> 实例对象确实具有一个 <code>iterator</code> 属性：</li></ul><div class="code-container" data-rel="Ts"><figure class="iseeu highlight ts"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">export</span> <span class="keyword">class</span> <span class="title class_">Stream</span>&lt;<span class="title class_">Item</span>&gt; <span class="keyword">implements</span> <span class="title class_">AsyncIterable</span>&lt;<span class="title class_">Item</span>&gt; &#123;</span><br><span class="line"><span class="attr">controller</span>: <span class="title class_">AbortController</span>;</span><br><span class="line">#<span class="attr">client</span>: <span class="title class_">OpenAI</span> | <span class="literal">undefined</span>;</span><br><span class="line"></span><br><span class="line"><span class="title function_">constructor</span>(<span class="params"></span></span><br><span class="line"><span class="params">    <span class="keyword">private</span> <span class="attr">iterator</span>: () =&gt; <span class="title class_">AsyncIterator</span>&lt;<span class="title class_">Item</span>&gt;,</span></span><br><span class="line"><span class="params">    <span class="attr">controller</span>: <span class="title class_">AbortController</span>,</span></span><br><span class="line"><span class="params">    <span class="attr">client</span>?: <span class="title class_">OpenAI</span>,</span></span><br><span class="line"><span class="params"></span>) &#123;</span><br><span class="line">    <span class="variable language_">this</span>.<span class="property">controller</span> = controller;</span><br><span class="line">    <span class="variable language_">this</span>.#client = client;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></div><ul><li>再看一眼 <code>client.chat.completions.create</code> 方法的源码：</li></ul><div class="code-container" data-rel="Ts"><figure class="iseeu highlight ts"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">export</span> <span class="keyword">class</span> <span class="title class_">Completions</span> <span class="keyword">extends</span> <span class="title class_ inherited__">APIResource</span> &#123;</span><br><span class="line"><span class="attr">messages</span>: <span class="title class_">MessagesAPI</span>.<span class="property">Messages</span> = <span class="keyword">new</span> <span class="title class_">MessagesAPI</span>.<span class="title class_">Messages</span>(<span class="variable language_">this</span>.<span class="property">_client</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment">* Creates a model response for the given chat conversation. Learn more in the</span></span><br><span class="line"><span class="comment">* [text generation](https://platform.openai.com/docs/guides/text-generation),</span></span><br><span class="line"><span class="comment">* [vision](https://platform.openai.com/docs/guides/vision), and</span></span><br><span class="line"><span class="comment">* [audio](https://platform.openai.com/docs/guides/audio) guides.</span></span><br><span class="line"><span class="comment">*</span></span><br><span class="line"><span class="comment">* Returns a chat completion object, or a streamed sequence of chat completion</span></span><br><span class="line"><span class="comment">* chunk objects if the request is streamed.</span></span><br><span class="line"><span class="comment">*/</span></span><br><span class="line"><span class="title function_">create</span>(<span class="attr">body</span>: <span class="title class_">ChatCompletionCreateParamsNonStreaming</span>, <span class="attr">options</span>?: <span class="title class_">RequestOptions</span>): <span class="title class_">APIPromise</span>&lt;<span class="title class_">ChatCompletion</span>&gt;;</span><br><span class="line"><span class="title function_">create</span>(</span><br><span class="line">    <span class="attr">body</span>: <span class="title class_">ChatCompletionCreateParamsStreaming</span>,</span><br><span class="line">    <span class="attr">options</span>?: <span class="title class_">RequestOptions</span>,</span><br><span class="line">): <span class="title class_">APIPromise</span>&lt;<span class="title class_">Stream</span>&lt;<span class="title class_">ChatCompletionChunk</span>&gt;&gt;;</span><br><span class="line"><span class="title function_">create</span>(</span><br><span class="line">    <span class="attr">body</span>: <span class="title class_">ChatCompletionCreateParamsBase</span>,</span><br><span class="line">    <span class="attr">options</span>?: <span class="title class_">RequestOptions</span>,</span><br><span class="line">): <span class="title class_">APIPromise</span>&lt;<span class="title class_">Stream</span>&lt;<span class="title class_">ChatCompletionChunk</span>&gt; | <span class="title class_">ChatCompletion</span>&gt;;</span><br><span class="line"><span class="title function_">create</span>(</span><br><span class="line">    <span class="attr">body</span>: <span class="title class_">ChatCompletionCreateParams</span>,</span><br><span class="line">    <span class="attr">options</span>?: <span class="title class_">RequestOptions</span>,</span><br><span class="line">): <span class="title class_">APIPromise</span>&lt;<span class="title class_">ChatCompletion</span>&gt; | <span class="title class_">APIPromise</span>&lt;<span class="title class_">Stream</span>&lt;<span class="title class_">ChatCompletionChunk</span>&gt;&gt; &#123;</span><br><span class="line">    <span class="keyword">return</span> <span class="variable language_">this</span>.<span class="property">_client</span>.<span class="title function_">post</span>(<span class="string">&#x27;/chat/completions&#x27;</span>, &#123; body, ...options, <span class="attr">stream</span>: body.<span class="property">stream</span> ?? <span class="literal">false</span> &#125;) <span class="keyword">as</span></span><br><span class="line">    | <span class="title class_">APIPromise</span>&lt;<span class="title class_">ChatCompletion</span>&gt;</span><br><span class="line">    | <span class="title class_">APIPromise</span>&lt;<span class="title class_">Stream</span>&lt;<span class="title class_">ChatCompletionChunk</span>&gt;&gt;;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></div><div class="code-container" data-rel="Ts"><figure class="iseeu highlight ts"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">export</span> <span class="keyword">interface</span> <span class="title class_">ChatCompletionCreateParamsStreaming</span> <span class="keyword">extends</span> <span class="title class_">ChatCompletionCreateParamsBase</span> &#123;</span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * If set to true, the model response data will be streamed to the client as it is</span></span><br><span class="line"><span class="comment">     * generated using</span></span><br><span class="line"><span class="comment">     * [server-sent events](https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events#Event_stream_format).</span></span><br><span class="line"><span class="comment">     * See the</span></span><br><span class="line"><span class="comment">     * [Streaming section below](https://platform.openai.com/docs/api-reference/chat/streaming)</span></span><br><span class="line"><span class="comment">     * for more information, along with the</span></span><br><span class="line"><span class="comment">     * [streaming responses](https://platform.openai.com/docs/guides/streaming-responses)</span></span><br><span class="line"><span class="comment">     * guide for more information on how to handle the streaming events.</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="attr">stream</span>: <span class="literal">true</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></div><ul><li><p>观察函数重载的签名得知，<code>stream</code> 项设置为 <code>true</code> 的时候，<code>chat.completions.create</code> 将返回一个 <code>APIPromise&lt;Stream&lt;ChatCompletionChunk&gt;&gt;</code>。</p></li><li><p>这个 OpenAI 自定义的 Promise 重写了<code>then</code> 函数：</p></li></ul><div class="code-container" data-rel="Ts"><figure class="iseeu highlight ts"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">private</span> <span class="title function_">parse</span>(): <span class="title class_">Promise</span>&lt;<span class="title class_">WithRequestID</span>&lt;T&gt;&gt; &#123;</span><br><span class="line">    <span class="keyword">if</span> (!<span class="variable language_">this</span>.<span class="property">parsedPromise</span>) &#123;</span><br><span class="line">        <span class="variable language_">this</span>.<span class="property">parsedPromise</span> = <span class="variable language_">this</span>.<span class="property">responsePromise</span>.<span class="title function_">then</span>(<span class="function">(<span class="params">data</span>) =&gt;</span></span><br><span class="line">            <span class="variable language_">this</span>.<span class="title function_">parseResponse</span>(<span class="variable language_">this</span>.#client, data),</span><br><span class="line">        ) <span class="keyword">as</span> <span class="built_in">any</span> <span class="keyword">as</span> <span class="title class_">Promise</span>&lt;<span class="title class_">WithRequestID</span>&lt;T&gt;&gt;;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> <span class="variable language_">this</span>.<span class="property">parsedPromise</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">override</span> then&lt;<span class="title class_">TResult1</span> = <span class="title class_">WithRequestID</span>&lt;T&gt;, <span class="title class_">TResult2</span> = <span class="built_in">never</span>&gt;(</span><br><span class="line">    <span class="attr">onfulfilled</span>?: (<span class="function">(<span class="params"><span class="attr">value</span>: <span class="title class_">WithRequestID</span>&lt;T&gt;</span>) =&gt;</span> <span class="title class_">TResult1</span> | <span class="title class_">PromiseLike</span>&lt;<span class="title class_">TResult1</span>&gt;) | <span class="literal">undefined</span> | <span class="literal">null</span>,</span><br><span class="line">    <span class="attr">onrejected</span>?: (<span class="function">(<span class="params"><span class="attr">reason</span>: <span class="built_in">any</span></span>) =&gt;</span> <span class="title class_">TResult2</span> | <span class="title class_">PromiseLike</span>&lt;<span class="title class_">TResult2</span>&gt;) | <span class="literal">undefined</span> | <span class="literal">null</span>,</span><br><span class="line">): <span class="title class_">Promise</span>&lt;<span class="title class_">TResult1</span> | <span class="title class_">TResult2</span>&gt; &#123;</span><br><span class="line">    <span class="keyword">return</span> <span class="variable language_">this</span>.<span class="title function_">parse</span>().<span class="title function_">then</span>(onfulfilled, onrejected);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></div><ul><li>那么这个 <code>this.parseReponse</code> 函数是哪里传过来的呢？根据此前 <code>create</code> 的源码我们知道其调用了 <code>this._client.post(...)</code>，具体来说：</li></ul><div class="code-container" data-rel="Ts"><figure class="iseeu highlight ts"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment">* API Client for interfacing with the OpenAI API.</span></span><br><span class="line"><span class="comment">*/</span></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">class</span> <span class="title class_">OpenAI</span> &#123;</span><br><span class="line">    <span class="attr">apiKey</span>: <span class="built_in">string</span>;</span><br><span class="line">    <span class="attr">organization</span>: <span class="built_in">string</span> | <span class="literal">null</span>;</span><br><span class="line">    <span class="attr">project</span>: <span class="built_in">string</span> | <span class="literal">null</span>;</span><br><span class="line">    <span class="comment">// ...</span></span><br><span class="line"></span><br><span class="line">    post&lt;<span class="title class_">Rsp</span>&gt;(<span class="attr">path</span>: <span class="built_in">string</span>, <span class="attr">opts</span>?: <span class="title class_">PromiseOrValue</span>&lt;<span class="title class_">RequestOptions</span>&gt;): <span class="title class_">APIPromise</span>&lt;<span class="title class_">Rsp</span>&gt; &#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="variable language_">this</span>.<span class="title function_">methodRequest</span>(<span class="string">&#x27;post&#x27;</span>, path, opts);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">private</span> methodRequest&lt;<span class="title class_">Rsp</span>&gt;(</span><br><span class="line">        <span class="attr">method</span>: <span class="title class_">HTTPMethod</span>,</span><br><span class="line">        <span class="attr">path</span>: <span class="built_in">string</span>,</span><br><span class="line">        <span class="attr">opts</span>?: <span class="title class_">PromiseOrValue</span>&lt;<span class="title class_">RequestOptions</span>&gt;,</span><br><span class="line">    ): <span class="title class_">APIPromise</span>&lt;<span class="title class_">Rsp</span>&gt; &#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="variable language_">this</span>.<span class="title function_">request</span>(</span><br><span class="line">            <span class="title class_">Promise</span>.<span class="title function_">resolve</span>(opts).<span class="title function_">then</span>(<span class="function">(<span class="params">opts</span>) =&gt;</span> &#123;</span><br><span class="line">                <span class="keyword">return</span> &#123; method, path, ...opts &#125;;</span><br><span class="line">            &#125;),</span><br><span class="line">        );</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    request&lt;<span class="title class_">Rsp</span>&gt;(</span><br><span class="line">        <span class="attr">options</span>: <span class="title class_">PromiseOrValue</span>&lt;<span class="title class_">FinalRequestOptions</span>&gt;,</span><br><span class="line">        <span class="attr">remainingRetries</span>: <span class="built_in">number</span> | <span class="literal">null</span> = <span class="literal">null</span>,</span><br><span class="line">    ): <span class="title class_">APIPromise</span>&lt;<span class="title class_">Rsp</span>&gt; &#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">APIPromise</span>(<span class="variable language_">this</span>, <span class="variable language_">this</span>.<span class="title function_">makeRequest</span>(options, remainingRetries, <span class="literal">undefined</span>));</span><br><span class="line">    &#125;</span><br></pre></td></tr></table></figure></div><ul><li>再观察 <code>APIPromise</code> 类的构造函数：</li></ul><div class="code-container" data-rel="Ts"><figure class="iseeu highlight ts"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">export</span> <span class="keyword">class</span> <span class="title class_">APIPromise</span>&lt;T&gt; <span class="keyword">extends</span> <span class="title class_">Promise</span>&lt;<span class="title class_">WithRequestID</span>&lt;T&gt;&gt; &#123;</span><br><span class="line"><span class="keyword">private</span> <span class="attr">parsedPromise</span>: <span class="title class_">Promise</span>&lt;<span class="title class_">WithRequestID</span>&lt;T&gt;&gt; | <span class="literal">undefined</span>;</span><br><span class="line">#<span class="attr">client</span>: <span class="title class_">OpenAI</span>;</span><br><span class="line">    <span class="title function_">constructor</span>(<span class="params"></span></span><br><span class="line"><span class="params">        <span class="attr">client</span>: <span class="title class_">OpenAI</span>,</span></span><br><span class="line"><span class="params">        <span class="keyword">private</span> <span class="attr">responsePromise</span>: <span class="title class_">Promise</span>&lt;<span class="title class_">APIResponseProps</span>&gt;,</span></span><br><span class="line"><span class="params">        <span class="keyword">private</span> <span class="attr">parseResponse</span>: (</span></span><br><span class="line"><span class="params">            client: OpenAI,</span></span><br><span class="line"><span class="params">            props: APIResponseProps,</span></span><br><span class="line"><span class="params">        ) =&gt; <span class="title class_">PromiseOrValue</span>&lt;<span class="title class_">WithRequestID</span>&lt;T&gt;&gt; = defaultParseResponse,</span></span><br><span class="line"><span class="params">    </span>) &#123;</span><br><span class="line">        <span class="variable language_">super</span>(<span class="function">(<span class="params">resolve</span>) =&gt;</span> &#123;</span><br><span class="line">            <span class="comment">// this is maybe a bit weird but this has to be a no-op to not implicitly</span></span><br><span class="line">            <span class="comment">// parse the response body; instead .then, .catch, .finally are overridden</span></span><br><span class="line">            <span class="comment">// to parse the response</span></span><br><span class="line">            <span class="title function_">resolve</span>(<span class="literal">null</span> <span class="keyword">as</span> <span class="built_in">any</span>);</span><br><span class="line">        &#125;);</span><br><span class="line">        <span class="variable language_">this</span>.#client = client;</span><br><span class="line">    &#125;</span><br></pre></td></tr></table></figure></div><ul><li>可以看到，<code>create</code> 函数调用之后的 <code>request</code> 函数中返回一个新的 <code>APIPromise</code> 对象的时候，没有传入 <code>parseResponse</code> 函数，因此其被定义为 <code>defaultParseResponse</code>：</li></ul><div class="code-container" data-rel="Ts"><figure class="iseeu highlight ts"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">export</span> <span class="keyword">async</span> <span class="keyword">function</span> defaultParseResponse&lt;T&gt;(</span><br><span class="line">    <span class="attr">client</span>: <span class="title class_">OpenAI</span>,</span><br><span class="line">    <span class="attr">props</span>: <span class="title class_">APIResponseProps</span>,</span><br><span class="line">): <span class="title class_">Promise</span>&lt;<span class="title class_">WithRequestID</span>&lt;T&gt;&gt; &#123;</span><br><span class="line">    <span class="keyword">const</span> &#123; response, requestLogID, retryOfRequestLogID, startTime &#125; = props;</span><br><span class="line">    <span class="keyword">const</span> body = <span class="keyword">await</span> (<span class="title function_">async</span> () =&gt; &#123;</span><br><span class="line">        <span class="keyword">if</span> (props.<span class="property">options</span>.<span class="property">stream</span>) &#123;</span><br><span class="line">            <span class="comment">// ...</span></span><br><span class="line"></span><br><span class="line">            <span class="keyword">return</span> <span class="title class_">Stream</span>.<span class="title function_">fromSSEResponse</span>(</span><br><span class="line">                response,</span><br><span class="line">                props.<span class="property">controller</span>,</span><br><span class="line">                client,</span><br><span class="line">                props.<span class="property">options</span>.<span class="property">__synthesizeEventData</span>,</span><br><span class="line">            ) <span class="keyword">as</span> <span class="built_in">any</span>;</span><br><span class="line">        &#125;</span><br></pre></td></tr></table></figure></div><ul><li>这里，当 <code>props.options.stream</code> 设为 true 的时候，返回的是 <code>Stream.fromSSEResponse</code> 函数的返回值，具体来说：</li></ul><div class="code-container" data-rel="Ts"><figure class="iseeu highlight ts"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">class</span> <span class="title class_">Stream</span> &#123;</span><br><span class="line">    <span class="title function_">constructor</span>(<span class="params">iterator, controller, client</span>) &#123;</span><br><span class="line">        <span class="variable language_">this</span>.<span class="property">iterator</span> = iterator;</span><br><span class="line">        <span class="comment">// ...</span></span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">static</span> <span class="title function_">fromSSEResponse</span>(<span class="params">response, controller, client, synthesizeEventData</span>) &#123;</span><br><span class="line">        <span class="keyword">let</span> consumed = <span class="literal">false</span>;</span><br><span class="line">        <span class="keyword">const</span> logger = client ? (<span class="number">0</span>, log_1.<span class="property">loggerFor</span>)(client) : <span class="variable language_">console</span>;</span><br><span class="line">        <span class="keyword">async</span> <span class="keyword">function</span>* <span class="title function_">iterator</span>(<span class="params"></span>) &#123;</span><br><span class="line">            <span class="comment">// iterator implementation</span></span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">Stream</span>(iterator, controller, client);</span><br><span class="line">    &#125;</span><br></pre></td></tr></table></figure></div><ul><li>可以看到，这就是最开始我们所寻找的 iterator。（ <em>具体的 iterator 实现内部过于复杂，懒得看</em> ）</li></ul><hr><ul><li><p>既然已经读完了（部分）源码，是时候问出那个问题了：<del>Why so serious?</del> 为什么要搞的这么复杂？</p></li><li><p>说实话，面对这么一大段像意大利面一样（或许不至于）的源码，我是没什么头绪的。我明白知其然知其所以然的道理，但确实个人能力有限，没有开发过这种级别的，涉及 streaming 的库，难以理解为什么需要如此复杂的处理流程。</p></li><li><p>因此我询问了 ChatGPT，得到如下回复：</p><blockquote><p>Yes — it is more complicated than a one-off app would need, but it is solving library-level problems.</p><ul><li>One API must handle both normal JSON responses and streamed SSE responses.</li><li>It must work in Node, browsers, edge runtimes, and React Native.</li><li>It must preserve await client.chat.completions.create(…) ergonomics while still returning an async stream when requested.</li><li>It must handle aborts, retries, parse errors, and request metadata consistently.</li><li>It reuses the same streaming engine for chat, responses, assistants, and other endpoints.</li></ul></blockquote><blockquote><p>The layering is intentional:</p><ul><li><code>APIPromise</code> delays parsing until the user actually awaits&#x2F;then-chains.</li><li><code>defaultParseResponse()</code> decides whether the result is JSON or a Stream.</li><li><code>Stream.fromSSEResponse()</code> converts the fetch ReadableStream into SSE events.</li><li><code>ReadableStreamToAsyncIterable(...)</code> is just the adapter that makes browser&#x2F;fetch streams usable with for await.</li></ul></blockquote><blockquote><p>So the complexity is mostly an adapter stack:</p><ul><li>HTTP response -&gt; ReadableStream -&gt; async iterable -&gt; SSE frames -&gt; parsed chunks -&gt; user loop.</li></ul></blockquote><blockquote><p>For a library, that’s useful because:</p><ul><li>it keeps the public API small,</li><li>it hides runtime differences,</li><li>and it gives consistent cancellation&#x2F;error behavior.</li></ul></blockquote><blockquote><p>So: yes, the internal call graph is twisty, but it’s mostly “plumbing” to make streaming feel simple at the call site.</p></blockquote></li><li><p>看起来，要求一个库在多种环境，面对多种输入和输出，以及存在异步资源请求的情况下工作并不是一件容易的事情。</p></li></ul></div></details><ul><li>说实话，感觉这种 <a class="link"   href="https://www.stainless.com/" >Stainless API<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a> 生成的 SDK 代码读起来好像并不是那么有价值。</li></ul><h1 id="题外话"><a href="#题外话" class="headerlink" title="题外话"></a>题外话</h1><ul><li><p>说点题外话——我感觉开发&#x2F;学习这个网页插件的方式和传统的方式大有不同。具体来说，我已经变的非常依赖 LLM 了。</p></li><li><p>尽管我自称所谓“轻度维新派”，坚持自己写代码，对于 LLM 生成的代码则每一行都自己审计并尝试理解，改正其错误或者根据 codebase 变化进行魔改。但不可否认的是，我对于许多开发过程中所需要的知识都是通过 LLM 获得的，我发现自己变的非常依赖 LLM 提供的 SOTA 技术选型&#x2F;起步框架，辅助阅读源码的能力以及设计模式方面的建议。</p></li><li><p>倒也不是感到恐慌，能够普及的新技术自有其优势和用处，若是要依靠传统的教程 + 搜索引擎 + 论坛 + 官方技术文档的方式写插件，那怕是费老鼻子劲了。</p></li><li><p>但确实，这让我再次对于 LLM 介入开发的程度感觉到一种模糊的摇摆之感——在“古法编码”和“vibe coding”之间的平衡点，到底在哪里呢？</p></li><li><p>倘若将来这些大型科技公司因为“没有故事可讲”，“没有对得起估值的盈利方式”而无法再提供这样的 API 服务，又或者是让价格大幅上涨，限额进一步缩减，我还能以同等的效率学习&#x2F;写出同等质量的代码吗？</p></li></ul>]]>
    </content>
    <id>https://blog.imlast.top/2026/04/01/scribecx-2/</id>
    <link href="https://blog.imlast.top/2026/04/01/scribecx-2/"/>
    <published>2026-04-01T08:39:00.000Z</published>
    <summary>LLM 对话请求周期，对话的持久化存储，以及流式传输的实现</summary>
    <title>Scribe.cx 2 - 对话与持久化存储</title>
    <updated>2026-04-01T08:39:00.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>Last</name>
    </author>
    <category term="工具使用" scheme="https://blog.imlast.top/categories/%E5%B7%A5%E5%85%B7%E4%BD%BF%E7%94%A8/"/>
    <category term="wayland" scheme="https://blog.imlast.top/tags/wayland/"/>
    <category term="python" scheme="https://blog.imlast.top/tags/python/"/>
    <category term="linuxqq" scheme="https://blog.imlast.top/tags/linuxqq/"/>
    <category term="shell" scheme="https://blog.imlast.top/tags/shell/"/>
    <content>
      <![CDATA[<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><ul><li><p>前些时日笔者就注意到 linuxqq 中复制内容实际上输出到了 X11 剪贴板中而非 Wayland，尽管 linuxqq 窗口确实是在 Wayland 混成器下运行的。推测可能是一些旧版本的 Electron 接口未能及时更新所致。</p></li><li><p>那时候，笔者所在群聊的群主用 AI 写了一个同步脚本，来将 x11 剪贴板中的内容同步到 Wayland 粘贴板。详见 <a href="https://blog.imlast.top/2025/10/15/linuxqq-clipboard-issue/">这篇文章</a>。</p></li></ul><h2 id="两个悬而未决的问题：锁丢失和内容截断"><a href="#两个悬而未决的问题：锁丢失和内容截断" class="headerlink" title="两个悬而未决的问题：锁丢失和内容截断"></a>两个悬而未决的问题：锁丢失和内容截断</h2><ul><li>在使用过程中，笔者发现该脚本出现了以下两个问题：<ol><li>休眠（Hibernate）后，锁文件丢失导致多个脚本实例同时运行</li><li>体积较大的图片文件在会被“截断”，具体来说，粘贴出的图片数据不完整，通常表现为只有截图区域的上半部分</li></ol></li></ul><hr><ul><li><p>关于第一个问题，我一开始 <strong>推测</strong> 是放置锁的位置不对：<code>/tmp/clipboard_sync.lock</code>。原先猜想会不会是 Hibernate 清空了 <code>/tmp</code> 路径下的文件，但写了一个简单的脚本测试之后，发现并不会发生这种事情。后续我修改了脚本，将锁文件存放在 <code>$XDG_RUNTIME_DIR/</code> 路径下，至于是否会发生同样的问题，尚未进行充分的测试。</p></li><li><p>于是这个问题就变成了一个未解之谜……</p></li><li><p>就第二个问题来说，<strong>推测</strong> 是 shell 语言中的管道操作异步执行导致的，关键在于脚本的这一部分：</p>  <div class="code-container" data-rel="Bash"><figure class="iseeu highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Pipe the image data directly to the Wayland clipboard</span></span><br><span class="line">xclip -selection clipboard -t <span class="string">&quot;<span class="variable">$x11_img_type</span>&quot;</span> -o 2&gt;/dev/null | wl-copy -t <span class="string">&quot;<span class="variable">$x11_img_type</span>&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># ...</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># Clear the X11 clipboard to make Wayland the single source of truth and prevent echo-syncing</span></span><br><span class="line">xclip -selection clipboard -i /dev/null</span><br></pre></td></tr></table></figure></div></li><li><p>可以看到，在通过管道命令输出 Wayland 剪贴板的内容到 X11 剪贴板后，脚本几乎是立刻（中间还有一些设置变量的步骤）清空了 X11 剪贴板。如果此时管道传输没有结束，就会导致同步数据被截断的情况。</p></li><li><p>然后事后不论是直接测试这段逻辑，当时反复运行脚本，甚至手动删除锁文件运行多个脚本实例，都没有观察到类似的 bug 再次出现。</p></li><li><p>所以这也成了一个未解之谜……</p></li></ul><h2 id="重复同步"><a href="#重复同步" class="headerlink" title="重复同步"></a>重复同步</h2><ul><li><p>在我尝试使用 Python 编写一个相同逻辑的脚本之后，观察 log 发现：</p>  <div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">[15:58:10] ✓ WL -&gt; X11 | Text:</span><br><span class="line">xclip 同步到 wl-clipboard 之后 xclip 被清空了，但是 wl-paste -...</span><br><span class="line">[15:58:11] ✓ X11 -&gt; WL | Text:</span><br><span class="line">xclip 同步到 wl-clipboard 之后 xclip 被清空了，但是 wl-paste -...</span><br><span class="line">[15:58:19] ✓ WL -&gt; X11 | Text:</span><br><span class="line">我之前看到同步两次的情况加了个锁避免写回，结果发现 x11 被清空了，然后又触发同步，wl-clip...</span><br><span class="line">[15:58:20] ✓ X11 -&gt; WL | Text:</span><br><span class="line">我之前看到同步两次的情况加了个锁避免写回，结果发现 x11 被清空了，然后又触发同步，wl-clip...</span><br><span class="line">[15:58:21] ✓ WL -&gt; X11 | Text:</span><br><span class="line">非常搞笑</span><br><span class="line">[15:58:22] ✓ X11 -&gt; WL | Text:</span><br><span class="line">非常搞笑</span><br></pre></td></tr></table></figure></div></li><li><p>可以看到，每次复制内容，脚本都执行了两次同步行为。脚本内监听 Wayland 的函数是这样的：</p>  <div class="code-container" data-rel="Python"><figure class="iseeu highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">watch_wayland</span>():</span><br><span class="line">    <span class="string">&quot;&quot;&quot;Listener process: wl-paste --watch blocks the process&quot;&quot;&quot;</span></span><br><span class="line"></span><br><span class="line">    <span class="comment"># wl-paste will echo &#x27;1&#x27; whenever the clipboard changes</span></span><br><span class="line">    proc = subprocess.Popen(</span><br><span class="line">        [<span class="string">&quot;wl-paste&quot;</span>, <span class="string">&quot;--watch&quot;</span>, <span class="string">&quot;echo&quot;</span>, <span class="string">&quot;1&quot;</span>], stdout=subprocess.PIPE</span><br><span class="line">    )</span><br><span class="line">    <span class="keyword">while</span> <span class="literal">True</span>:</span><br><span class="line">        <span class="keyword">if</span> proc.stdout.readline():  <span class="comment"># blocks until clipboard changes</span></span><br><span class="line">            time.sleep(<span class="number">0.05</span>)</span><br><span class="line">            sync_wayland_to_x11()</span><br></pre></td></tr></table></figure></div></li><li><p>不难想到，x11 -&gt; wayland 的脚本同步行为也触发了 <code>wl-paste --watch echo 1</code> 的监听机制，从而使得已经同步到 Wayland 的内容被同步回了 X11。</p></li><li><p>于是我理所当然的想着加一个变量充当锁机制，在 x11 -&gt; wayland 同步行为发生后让 <code>watch_wayland</code> 跳过下一次监听机制的触发：</p>  <div class="code-container" data-rel="Python"><figure class="iseeu highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">sync_wayland_to_x11</span>():</span><br><span class="line">    <span class="string">&quot;&quot;&quot;Wayland (event driven) -&gt; X11&quot;&quot;&quot;</span></span><br><span class="line">    <span class="keyword">global</span> last_text, last_img_hash, wl_ignore_next_update</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> wl_ignore_next_update:</span><br><span class="line">        wl_ignore_next_update = <span class="literal">False</span></span><br><span class="line">        <span class="keyword">return</span></span><br><span class="line"></span><br><span class="line">    <span class="comment"># ...</span></span><br></pre></td></tr></table></figure></div><p>  <em>(在运行 <code>wl-copy</code> 命令之前将 <code>wl_ignore_next_update</code> 设为 True)</em></p></li><li><p>却发现从 linuxqq 中复制内容后剪贴板中什么都没有，何意味？</p></li><li><p>查看 log：</p>  <div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">[16:27:03] ✓ X11 -&gt; WL | Text:</span><br><span class="line">xclip 同步到 wl-clipboard 之后 xclip 被清空了，但是 wl-paste -...</span><br><span class="line">[16:27:04] ✓ X11 -&gt; WL | Text:</span><br><span class="line"></span><br></pre></td></tr></table></figure></div></li><li><p>可以看到，日志最后的同步信息是一个 <strong>空行</strong>，意味着最后 Wayland 剪贴板被同步了成了“空”，导致粘贴行为什么都没有输出。</p></li><li><p>然后我使用 pdb 一步一步的执行脚本，并在旁边打开一个终端窗口时刻观察 X11 剪贴板中的内容变化，最终发现运行 <code>wl-copy</code> 同步 X11 剪贴板中的内容至 Wayland 剪贴板之后，X11 剪贴板中的内容被清空了。</p></li><li><p>这是为什么？</p></li></ul><h2 id="剪贴板所有权"><a href="#剪贴板所有权" class="headerlink" title="剪贴板所有权"></a>剪贴板所有权</h2><ul><li><p>原因在于系统剪贴板具有一个 <code>ownership</code> 的属性，这一点在 Wayland 和 XServer 上是一样的。</p></li><li><p>当脚本运行 <code>wl-copy</code> 来同步内容时，CLIPBOARD 这个 selection 的 ownership 就不归属于 linuxqq（准确的来说是 linuxqq 内部的某个陈旧的子模块）所有了。</p></li><li><p>事实上，笔者先前对于系统剪贴板的运作有一个误解——<strong>误以为剪贴板是一个归属于 Wayland&#x2F;XServer 所管理的 Buffer</strong>，然而事实上在 Wayland&#x2F;XServer 中复制粘贴这样的跨窗口数据通信，事实上是一种“拉取式”的行为，即当“粘贴”操作发生时，当前窗口会向剪贴板的 owner 发送一个请求获取 CLIPBOARD 中的内容。</p></li><li><p>这样一来，就不难理解为什么一旦运行 <code>wl-copy</code> 后，剪贴板中的内容就直接“消失不见了”——因为 ownership 已经不归属于 linuxqq，而是属于 Wayland Compositor。而同步脚本自身并没有 XWayland 那样同步剪贴板的行为，<code>xclip</code> 自然也无从获取数据。</p></li></ul><hr><ul><li><p>对于这个问题，我能想到三种解决方法：</p><ol><li>回到原先没有同步锁的逻辑， <strong>任由第二次同步发生</strong>（事实上是让该脚本始终掌握剪贴板的 ownership）</li><li>保留同步锁，但是“双写”，即每次同步都 <strong>同时写入 Wayland 和 X11 的剪贴板</strong></li><li>跳过空内容的同步，即 <strong>在 linuxqq 失去剪贴板所有权后，检测到 xclip 输出内容为空（有更新）则跳过同步</strong></li></ol></li><li><p>对于 <code>1</code>，说实话这有点 “该系统依赖 bug 运行” 的味道，按照正常的逻辑 X11 同步到 Wayland 后不应该再触发一次 Wayland 同步回 X11 的行为，嗯，正常来说是这样的。</p></li><li><p>对于 <code>2</code>，这是最符合逻辑的做法，代价就是实现起来比较复杂，并且性能上也有所权衡。</p></li><li><p>对于 <code>3</code> 这其实是基于 <em>在 linuxqq 中的“粘贴”行为读取的是 Wayland 剪贴板而非 X11</em> 这个事实，才能起作用的一种方式。其实在我看来这种行为挺奇怪的，尤其是对于一个“同步”脚本来说。</p></li><li><p>但从结果来说，这三种方案中的任意一个都能解决问题，选择哪个其实无所谓。</p></li></ul><h2 id="clipsync"><a href="#clipsync" class="headerlink" title="clipsync"></a>clipsync</h2><ul><li><p>笔者在研究的过程中，正巧 GitHub 上一位用户名为 <a class="link"   href="https://github.com/SHORiN-KiWATA" >SHORiN-KiWATA<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a> 发布了他的<a class="link"   href="https://github.com/SHORiN-KiWATA/clipsync/tree/main" >剪贴板同步脚本<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a>，使用 Shellscript 编写。</p></li><li><p>笔者下载研读了一下，发现他所使用的其实就是上述第一种方法，并且在 md5 哈希计算比对的时候加入了空值检测。</p></li><li><p>观察其 log 可以得到佐证：</p>  <div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line">[2026-02-14 01:45:38] [INFO] &gt;&gt;&gt; 监测到 X11 剪贴板变化信号</span><br><span class="line">[2026-02-14 01:45:38] [DEBUG] X11 包含的数据类型: [UTF8_STRING]</span><br><span class="line">[2026-02-14 01:45:38] [INFO] 匹配类型: 纯文字 (UTF8_STRING)</span><br><span class="line">[2026-02-14 01:45:38] [DEBUG] 哈希比对: Wayland[8beccf70cb34cb30fcf1b84008cc6d7c] vs X11[221361ceefda8a8097851867a83e2dc1]</span><br><span class="line">[2026-02-14 01:45:38] [ACTION] 内容不同，正在同步到 Wayland...</span><br><span class="line">[2026-02-14 01:45:38] [SUCCESS] 纯文字同步成功</span><br><span class="line">[2026-02-14 01:45:38] [INFO] === 脚本触发: 开始检测剪贴板数据类型 ===</span><br><span class="line">[2026-02-14 01:45:38] [DEBUG] 检测到的源类型列表: [UTF8_STRING,text/plain,text/plain;charset=utf-8,TEXT,STRING,UTF8_STRING]</span><br><span class="line">[2026-02-14 01:45:38] [INFO] 匹配类型: 纯文字 (text/plain)</span><br><span class="line">[2026-02-14 01:45:38] [ACTION] 正在同步纯文字到 X11...</span><br><span class="line">[2026-02-14 01:45:38] [SUCCESS] 纯文字同步完成</span><br><span class="line">[2026-02-14 01:45:38] [INFO] --- 流程结束 ---</span><br><span class="line">[2026-02-14 01:45:38] [INFO] &gt;&gt;&gt; 监测到 X11 剪贴板变化信号</span><br><span class="line">[2026-02-14 01:45:38] [DEBUG] X11 包含的数据类型: [TARGETS,UTF8_STRING]</span><br><span class="line">[2026-02-14 01:45:38] [INFO] 匹配类型: 纯文字 (UTF8_STRING)</span><br><span class="line">[2026-02-14 01:45:38] [DEBUG] 哈希比对: Wayland[221361ceefda8a8097851867a83e2dc1] vs X11[221361ceefda8a8097851867a83e2dc1]</span><br><span class="line">[2026-02-14 01:45:38] [SKIP] 内容一致，跳过同步</span><br><span class="line">[2026-02-14 01:45:38] [INFO] --- 本次循环结束，等待下一次 clipnotify 信号 ---</span><br></pre></td></tr></table></figure></div></li><li><p>可以看到，一次 X11 剪贴板变化确实触发了 X11 -&gt; Wayland &amp; Wayland -&gt; X11 两次同步，这确实有效的解决了上述问题。</p></li><li><p>同时，使用 systemd 来管理脚本的启停，相较于让脚本自己持有锁来说是一种更好的方式。</p></li><li><p>本着不重复造轮子 <del>（懒惰）</del> 的原则，笔者决定采用此脚本。</p>  <div class="code-container" data-rel="Bash"><figure class="iseeu highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">paru -S clipsync-git</span><br><span class="line">systemd --user <span class="built_in">enable</span> clipsync.service --now</span><br></pre></td></tr></table></figure></div></li></ul><h2 id="另一种方式：XWayland-模式启动"><a href="#另一种方式：XWayland-模式启动" class="headerlink" title="另一种方式：XWayland 模式启动"></a>另一种方式：XWayland 模式启动</h2><ul><li><p>既然是由于 linuxqq 对 Wayland 的“表面适配”导致的此等问题，那么直接让 linuxqq 运行在 XWayland 模式下，利用 XWayland 自带的同步机制不就好了？</p><ul><li><p>在 <code>~/.config</code> 下创建 <code>qq-electron-flags.conf</code>，内容如下：</p>  <div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">--ozone-platform-hint=x11</span><br></pre></td></tr></table></figure></div></li></ul></li><li><p>经测试，XWayland 模式下运行的 linuxqq 没有剪贴板同步问题。</p></li><li><p>或许这才是最简便高效的方式。（摊手）</p></li></ul><h2 id="尾声：没有商业价值的用户"><a href="#尾声：没有商业价值的用户" class="headerlink" title="尾声：没有商业价值的用户"></a>尾声：没有商业价值的用户</h2><ul><li><p>虽说现如今的 linuxqq 相较于 QQ 的 Electron 时代之前的那个老古董已经完善了不少，但还是在许多细节之处显得非常“敷衍”——不止是剪贴板，语音消息 &amp; 屏幕共享在 Linux 上依旧没有支持。</p><blockquote><p>感觉腾讯全系对桌面 gnu&#x2F;linux 都是这个态度（<br>尤其是腾讯会议在 Ubuntu 下二维码都加载不出来，虚拟摄像头也读不到:sweat_smile:</p></blockquote></li><li><p>该怎么说呢，或许腾讯非常明白他旗下软件的绝大部分用户都不会使用 Linux 作为操作系统，因而压根没投入多少资源。</p></li><li><p>果然 Linux 用户对于国内这些软件厂商来说纯粹是边缘群体，是“没有商业价值的用户”，令人感慨。</p></li></ul><h2 id="附录：-关于-linuxqq-的-X11-剪贴板调用"><a href="#附录：-关于-linuxqq-的-X11-剪贴板调用" class="headerlink" title="附录： 关于 linuxqq 的 X11 剪贴板调用"></a>附录： 关于 linuxqq 的 X11 剪贴板调用</h2><ul><li><p>使用如下命令启动 linuxqq：</p>  <div class="code-container" data-rel="Bash"><figure class="iseeu highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">env</span> -u DISPLAY qq</span><br></pre></td></tr></table></figure></div></li><li><p>linuxqq 正常启动，但只要在 linuxqq 中右键复制，或者按下 <C-c>，就会发生崩溃报错：</p>  <div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br></pre></td><td class="code"><pre><span class="line">[BuglyService.cpp][handleSignal][382]Stack is succesfully dumped by libUnwind.</span><br><span class="line">[BuglyService.cpp][handleSignal][384]Native stack:</span><br><span class="line">$$00    pc 00000000059d41af    /opt/QQ/resources/app/wrapper.node [x86_64::ae125ff74fb6eafb0000000000000000]</span><br><span class="line">$$01    pc 000000000009698b    /usr/lib/libc.so.6 [x86_64::0f8de86da4eead11213c59d926ca3796]</span><br><span class="line">$$02    pc 000000000011aa0c    /usr/lib/libc.so.6 [x86_64::0f8de86da4eead11213c59d926ca3796]</span><br><span class="line"></span><br><span class="line">[BuglyService.cpp][handleSignal][386]Record map file of thread: 787</span><br><span class="line">[BuglyService.cpp][handleSignal][396]Dumping of native stack finished.</span><br><span class="line">235,0001,Record EupInfo</span><br><span class="line">235,0000,write key fail</span><br><span class="line">235,0001,write key fail</span><br><span class="line">235,0002,write key fail</span><br><span class="line">235,0003,write key fail</span><br><span class="line">235,0004,write key fail</span><br><span class="line">235,0005,write key fail</span><br><span class="line">235,0006,write key fail</span><br><span class="line">235,0007,write key fail</span><br><span class="line">235,0002,Failed to record java thread name.</span><br><span class="line">235,0008,write key fail</span><br><span class="line">235,0009,write key fail</span><br><span class="line">235,0010,write key fail</span><br><span class="line">235,0003,EupInfo has been recorded.</span><br><span class="line">235,0004,Record native key-value list.</span><br><span class="line">235,0005,Native key-value list has been recorded.</span><br><span class="line">235,0006,Record native log.</span><br><span class="line">235,0000,Native log has not been initiated.</span><br><span class="line">235,0007,Native log has been recorded.</span><br><span class="line">[BuglyService.cpp][clearEupInfo][283]Clear eupInfo object.</span><br><span class="line">235,0005,Try to unlock file: /home/last/.config/QQ/crash_files//../files/native_record_lock</span><br><span class="line">235,0006,Successfully unlock file: /home/last/.config/QQ/crash_files//../files/native_record_lock</span><br><span class="line">[BuglyService.cpp][handleSignal][441]Restored signal handlers.</span><br></pre></td></tr></table></figure></div></li></ul><h2 id="参考资料"><a href="#参考资料" class="headerlink" title="参考资料"></a>参考资料</h2><ul><li><p><a class="link"   href="https://www.x.org/releases/current/doc/xorg-docs/icccm/icccm.html#Peer_to_Peer_Communication_by_Means_of_Selections" >X Consortium Standard: Chapter 2 Peer-to-Peer Communication by Means of Selections<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a></p></li><li><p><a class="link"   href="https://en.wikipedia.org/wiki/X_Window_System_selection#Clipboard" >Wikipedia: X Window System selection<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a></p></li></ul>]]>
    </content>
    <id>https://blog.imlast.top/2026/02/13/clipboard-sync/</id>
    <link href="https://blog.imlast.top/2026/02/13/clipboard-sync/"/>
    <published>2026-02-13T18:56:36.000Z</published>
    <summary>关于 linuxqq 的剪贴板操作行为，以及 Linux 下 X11/Wayland 的剪贴板同步行为</summary>
    <title>关于 X11 与 Wayland 的剪贴板同步问题</title>
    <updated>2026-02-13T18:56:36.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>Last</name>
    </author>
    <category term="笔记" scheme="https://blog.imlast.top/categories/%E7%AC%94%E8%AE%B0/"/>
    <category term="browser" scheme="https://blog.imlast.top/tags/browser/"/>
    <category term="wxt" scheme="https://blog.imlast.top/tags/wxt/"/>
    <content>
      <![CDATA[<h2 id="webextension-polyfill"><a href="#webextension-polyfill" class="headerlink" title="webextension-polyfill"></a>webextension-polyfill</h2><ul><li><p>查阅 wxt 相关 <a class="link"   href="https://wxt.dev/guide/essentials/extension-apis.html#using-webextension-polyfill" >README<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a></p>  <div class="code-container" data-rel="Bash"><figure class="iseeu highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pnpm i @wxt-dev/webextension-polyfill webextension-polyfill</span><br></pre></td></tr></table></figure></div></li><li><p>以及在 <code>wxt.config.ts</code> 中加入：</p>  <div class="code-container" data-rel="Ts"><figure class="iseeu highlight ts"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">export</span> <span class="keyword">default</span> <span class="title function_">defineConfig</span>(&#123;</span><br><span class="line">    <span class="comment">//...</span></span><br><span class="line">    <span class="attr">modules</span>: [<span class="string">&quot;@wxt-dev/webextension-polyfill&quot;</span>]</span><br><span class="line">    <span class="comment">//...</span></span><br><span class="line">&#125;);</span><br></pre></td></tr></table></figure></div></li><li><p>此外，还需要 <code>@types/webextension-polyfill</code> 以及 <code>@types/firefox-webext-browser</code> 来扩展 <code>browser</code> 的 Firefox 成员。</p>  <div class="code-container" data-rel="Bash"><figure class="iseeu highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pnpm i -D @types/firefox-webext-browser</span><br></pre></td></tr></table></figure></div></li></ul><h2 id="括号作为行开头"><a href="#括号作为行开头" class="headerlink" title="括号作为行开头"></a>括号作为行开头</h2><p><img src="https://s2.loli.net/2026/01/31/SrWPQwFyUzN8JLx.png" alt="semi-1.png"></p><p><img src="https://s2.loli.net/2026/01/31/n5kgCxzQI6uaVKr.png" alt="semi-2.png"></p><ul><li>这就是 JavaScript ASI 吗，给我整笑了。</li></ul><hr><h2 id="默认打开-Side-Panel"><a href="#默认打开-Side-Panel" class="headerlink" title="默认打开 Side Panel"></a>默认打开 Side Panel</h2><h3 id="Firefox"><a href="#Firefox" class="headerlink" title="Firefox"></a>Firefox</h3><ul><li><p>经测试，<code>manifest.json</code> 中的 <code>sidebar_action</code> 或者 <code>side_panel</code> 事实上没有任何作用。</p></li><li><p>也可能是 WXT 抹平了这其中的一些坑，没有细究。</p></li></ul><hr><ul><li><p>对于 Firefox，点击扩展图标触发 listener 函数的机制和 <code>default_popup</code> 是 <strong>冲突</strong> 的，这意味着如果浏览器发现 manifest 中的 <code>action</code> 一项中存在 <code>default_popup</code>，那么点击扩展图标只会打开 popup 窗口而不会触发 <code>background.ts</code> 中挂载的 listener 函数。</p></li><li><p>因此，想要默认打开侧板，需要删除 <code>entrypoints</code> 中的 <code>popup</code> 来防止 wxt 自动在 <code>manifest.json</code> 中生成 <code>default_popup</code>。</p><ul><li><p>也可以通过一种奇怪的方式来让 WXT 忽略 <code>popup</code>:</p><blockquote><p><a class="link"   href="https://github.com/wxt-dev/wxt/issues/1433" >https://github.com/wxt-dev/wxt/issues/1433<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a></p></blockquote></li></ul></li><li><p>但是不能完全删去 <code>action</code>，因为这样一来<code>background.ts</code> 就无法访问 <code>browser.browserAction</code> 或者 <code>browser.action</code>。</p><blockquote><p><a class="link"   href="https://github.com/wxt-dev/wxt/issues/669" >https://github.com/wxt-dev/wxt/issues/669<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a><br><a class="link"   href="https://wxt.dev/guide/essentials/config/manifest.html#action-without-popup" >https://wxt.dev/guide/essentials/config/manifest.html#action-without-popup<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a></p></blockquote><ul><li><p>可以在 <code>wxt.config.ts</code> 中的 <code>manifest</code> 部分添加一个空的 <code>action</code>，如下所示：</p>  <div class="code-container" data-rel="Ts"><figure class="iseeu highlight ts"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">export</span> <span class="keyword">default</span> <span class="title function_">defineConfig</span>(&#123;</span><br><span class="line">    <span class="comment">// ...</span></span><br><span class="line">    <span class="attr">manifest</span>: &#123;</span><br><span class="line">        <span class="comment">// ...</span></span><br><span class="line">        <span class="attr">action</span>: &#123;&#125;</span><br><span class="line">        <span class="comment">// ...</span></span><br><span class="line">    &#125;</span><br><span class="line">    <span class="comment">// ...</span></span><br><span class="line">&#125;);</span><br></pre></td></tr></table></figure></div></li></ul></li><li><p>然后在 <code>background.ts</code> 中注册监听函数：</p>  <div class="code-container" data-rel="Ts"><figure class="iseeu highlight ts"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">if</span> (<span class="keyword">import</span>.<span class="property">meta</span>.<span class="property">env</span>.<span class="property">MANIFEST_VERSION</span> === <span class="number">3</span>) &#123;</span><br><span class="line">    browser.<span class="property">action</span>.<span class="property">onClicked</span>.<span class="title function_">addListener</span>(sidePanelManager.<span class="property">open</span>);</span><br><span class="line">&#125; <span class="keyword">else</span> &#123;</span><br><span class="line">    browser.<span class="property">browserAction</span>.<span class="property">onClicked</span>.<span class="title function_">addListener</span>(sidePanelManager.<span class="property">open</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></div></li></ul><h3 id="Chrome"><a href="#Chrome" class="headerlink" title="Chrome"></a>Chrome</h3><ul><li><p>同样的，需要 <code>manifest.json</code> 中包含 <code>action</code>，且需要删除 <code>popup</code>：</p><blockquote><p><a class="link"   href="https://developer.chrome.com/docs/extensions/reference/api/sidePanel#open-action-icon" >https://developer.chrome.com/docs/extensions/reference/api/sidePanel#open-action-icon<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a></p></blockquote></li><li><p>经测试，当 <code>PanelBehavior</code> 中的 <code>openPanelOnActionClick</code> 被设为 <code>true</code> 的时候，点击扩展图标同样不会触发 <code>background.ts</code> 中挂载的 listener 函数。</p></li><li><p><code>openPanelOnActionClick</code> 默认设置为 <code>false</code>，保险起见再手动设置一遍：</p>  <div class="code-container" data-rel="Ts"><figure class="iseeu highlight ts"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// Chrome specific: Disable the default declarative behavior to ensure</span></span><br><span class="line"><span class="comment">// the onClicked event is dispatched to our listener.</span></span><br><span class="line"><span class="keyword">if</span> (<span class="keyword">import</span>.<span class="property">meta</span>.<span class="property">env</span>.<span class="property">CHROME</span> &amp;&amp; <span class="keyword">typeof</span> chrome.<span class="property">sidePanel</span>?.<span class="property">setPanelBehavior</span> === <span class="string">&quot;function&quot;</span>) &#123;</span><br><span class="line">    chrome.<span class="property">sidePanel</span>.<span class="title function_">setPanelBehavior</span>(&#123; <span class="attr">openPanelOnActionClick</span>: <span class="literal">false</span> &#125;).<span class="title function_">catch</span>(<span class="function">(<span class="params">error</span>) =&gt;</span> &#123;</span><br><span class="line">        <span class="variable language_">console</span>.<span class="title function_">error</span>(<span class="string">&quot;[Chrome] Error resetting panel behavior: &quot;</span>, error);</span><br><span class="line">    &#125;);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></div></li></ul><h3 id="完整代码"><a href="#完整代码" class="headerlink" title="完整代码"></a>完整代码</h3><details class="relative my-4 border border-border-color bg-second-background-color rounded-md  purple" data-header-exclude><summary class="px-4 py-2 rounded-md shadow-[0_0_2px_0_var(--shadow-color-1)] cursor-pointer not-markdown"><i class="fa-solid fa-chevron-right"></i>@/utils/sidepanel.ts</summary><div class="content p-4 "><div class="code-container" data-rel="Ts"><figure class="iseeu highlight ts"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> &#123; <span class="title class_">Tabs</span> &#125; <span class="keyword">from</span> <span class="string">&quot;webextension-polyfill&quot;</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * Defines the contract for side panel operations across different browsers.</span></span><br><span class="line"><span class="comment"> * This abstraction allows the rest of the extension to trigger UI components</span></span><br><span class="line"><span class="comment"> * without platform-specific branching.</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">interface</span> <span class="title class_">SidePanelManager</span> &#123;</span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * Toggles or opens the side panel depending on the browser&#x27;s capabilities.</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> tab The current active tab.</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="attr">open</span>: <span class="function">(<span class="params"><span class="attr">tab</span>: <span class="title class_">Tabs</span>.<span class="title class_">Tab</span></span>) =&gt;</span> <span class="title class_">Promise</span>&lt;<span class="built_in">void</span>&gt;;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * Chrome implementation using the MV3 sidePanel API.</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@requires</span> &quot;sidePanel&quot; permission in manifest.json</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">function</span> <span class="title function_">ChromeOpenSidePanel</span>(<span class="params"><span class="attr">tab</span>: <span class="title class_">Tabs</span>.<span class="title class_">Tab</span></span>) &#123;</span><br><span class="line">    <span class="comment">// Ensure the API exists</span></span><br><span class="line">    <span class="keyword">if</span> (<span class="keyword">typeof</span> chrome.<span class="property">sidePanel</span>?.<span class="property">open</span> !== <span class="string">&quot;function&quot;</span>) &#123;</span><br><span class="line">        <span class="variable language_">console</span>.<span class="title function_">error</span>(</span><br><span class="line">            <span class="string">&quot;[Chrome] sidePanel.open is not available. Check &#x27;sidePanel&#x27; permission and ensure Chrome version &gt;= 116&quot;</span></span><br><span class="line">        );</span><br><span class="line">        <span class="keyword">return</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// Ensure a valid `windowId`</span></span><br><span class="line">    <span class="keyword">const</span> windowId = tab.<span class="property">windowId</span> ?? chrome.<span class="property">windows</span>.<span class="property">WINDOW_ID_CURRENT</span>;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">try</span> &#123;</span><br><span class="line">        <span class="keyword">await</span> chrome.<span class="property">sidePanel</span>.<span class="title function_">open</span>(&#123; <span class="attr">windowId</span>: tab.<span class="property">windowId</span> &#125;);</span><br><span class="line">        <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">&quot;[Chrome] Side panel opened via action click.&quot;</span>);</span><br><span class="line">    &#125; <span class="keyword">catch</span> (error) &#123;</span><br><span class="line">        <span class="variable language_">console</span>.<span class="title function_">error</span>(<span class="string">&quot;[Chrome] Failed to open side panel: &quot;</span>, error);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * Firefox implementation using the sidebarAction API.</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@requires</span> &quot;sidebar_action&quot; definition in manifest.json</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">function</span> <span class="title function_">FirefoxOpenSidePanel</span>(<span class="params"><span class="attr">tab</span>: <span class="title class_">Tabs</span>.<span class="title class_">Tab</span></span>) &#123;</span><br><span class="line">    <span class="keyword">try</span> &#123;</span><br><span class="line">        <span class="keyword">await</span> browser.<span class="property">sidebarAction</span>.<span class="title function_">open</span>();</span><br><span class="line">        <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">&quot;[Firefox] Side panel opened via action click.&quot;</span>);</span><br><span class="line">    &#125; <span class="keyword">catch</span> (error) &#123;</span><br><span class="line">        <span class="variable language_">console</span>.<span class="title function_">error</span>(<span class="string">&quot;[Firefox] Failed to open side panel: &quot;</span>, error);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> <span class="attr">panelImpl</span>: <span class="title class_">Record</span>&lt;<span class="built_in">string</span>, <span class="title class_">SidePanelManager</span>&gt; = &#123;</span><br><span class="line">    <span class="attr">chrome</span>: &#123; <span class="attr">open</span>: <span class="title class_">ChromeOpenSidePanel</span> &#125;,</span><br><span class="line">    <span class="attr">firefox</span>: &#123; <span class="attr">open</span>: <span class="title class_">FirefoxOpenSidePanel</span> &#125;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * A platform-aware manager instance.</span></span><br><span class="line"><span class="comment"> * WXT optimizes this at build-time, removing the unused platform implementation.</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">const</span> <span class="attr">sidePanelManager</span>: <span class="title class_">SidePanelManager</span> =</span><br><span class="line">    panelImpl[<span class="keyword">import</span>.<span class="property">meta</span>.<span class="property">env</span>.<span class="property">BROWSER</span>] ?? panelImpl[<span class="string">&quot;chrome&quot;</span>];</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * Configures the extension icon to open the side panel as the default behavior.</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@description</span></span></span><br><span class="line"><span class="comment"> * This function registers a listener to the extension&#x27;s action icon.</span></span><br><span class="line"><span class="comment"> * - **Chrome**: Triggers `chrome.sidePanel.open`. Requires `openPanelOnActionClick: false`.</span></span><br><span class="line"><span class="comment"> * - **Firefox**: Triggers `sidebarAction.open`.</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@architecture</span></span></span><br><span class="line"><span class="comment"> * Uses `browser.action` for MV3 and fallbacks to `browser.browserAction` for MV2 (Firefox).</span></span><br><span class="line"><span class="comment"> * The imperative approach is used here to allow potential pre-open side effects.</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">function</span> <span class="title function_">openSidePanelAsDefault</span>(<span class="params"></span>) &#123;</span><br><span class="line">    <span class="comment">// <span class="doctag">TODO:</span> When in need of multiple listener functions, define a main listener</span></span><br><span class="line">    <span class="comment">// function and call the others inside it to maintain order</span></span><br><span class="line">    <span class="comment">// <span class="doctag">FIXME:</span> async function registered as callback causing problem?</span></span><br><span class="line">    <span class="keyword">if</span> (<span class="keyword">import</span>.<span class="property">meta</span>.<span class="property">env</span>.<span class="property">MANIFEST_VERSION</span> === <span class="number">3</span>) &#123;</span><br><span class="line">        browser.<span class="property">action</span>.<span class="property">onClicked</span>.<span class="title function_">addListener</span>(sidePanelManager.<span class="property">open</span>);</span><br><span class="line">    &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">        browser.<span class="property">browserAction</span>.<span class="property">onClicked</span>.<span class="title function_">addListener</span>(sidePanelManager.<span class="property">open</span>);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// Chrome specific: Disable the default declarative behavior to ensure</span></span><br><span class="line">    <span class="comment">// the onClicked event is dispatched to our listener.</span></span><br><span class="line">    <span class="keyword">if</span> (<span class="keyword">import</span>.<span class="property">meta</span>.<span class="property">env</span>.<span class="property">CHROME</span> &amp;&amp; <span class="keyword">typeof</span> chrome.<span class="property">sidePanel</span>?.<span class="property">setPanelBehavior</span> === <span class="string">&quot;function&quot;</span>) &#123;</span><br><span class="line">        chrome.<span class="property">sidePanel</span>.<span class="title function_">setPanelBehavior</span>(&#123; <span class="attr">openPanelOnActionClick</span>: <span class="literal">false</span> &#125;).<span class="title function_">catch</span>(<span class="function">(<span class="params">error</span>) =&gt;</span> &#123;</span><br><span class="line">            <span class="variable language_">console</span>.<span class="title function_">error</span>(<span class="string">&quot;[Chrome] Error resetting panel behavior: &quot;</span>, error);</span><br><span class="line">        &#125;);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></div></div></details>]]>
    </content>
    <id>https://blog.imlast.top/2026/01/30/scribecx-1/</id>
    <link href="https://blog.imlast.top/2026/01/30/scribecx-1/"/>
    <published>2026-01-30T09:08:26.000Z</published>
    <summary>WXT 框架下浏览器插件对 Firefox 及 chromium 系浏览器的侧边栏控制差异</summary>
    <title>Scribe.cx 1 - 跨浏览器的插件侧板控制</title>
    <updated>2026-01-30T09:08:26.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>Last</name>
    </author>
    <category term="工具使用" scheme="https://blog.imlast.top/categories/%E5%B7%A5%E5%85%B7%E4%BD%BF%E7%94%A8/"/>
    <category term="browser" scheme="https://blog.imlast.top/tags/browser/"/>
    <category term="LLM" scheme="https://blog.imlast.top/tags/LLM/"/>
    <content>
      <![CDATA[<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><ul><li><p>我想要一个浏览器中的“生成网页总结”侧板很久了。此前我一直使用的是 Brave 浏览器的 Leo，使用其免费的 Claude Haiku 模型用来生成网页总结，以及问答一些网页信息。</p></li><li><p>更换浏览器到 Zen 之后，Leo 肯定是没法用了，但是经过搜索我发现主流的两个基于 LLM 的网页总结 Harpa 和 Sider 都只支持 chromium，且都不开源。</p></li><li><p>我只好选用 Page Assist，本质上是一个用于使用本地 Ollma 模型的 Web UI。正如其窗口名称所言：</p><blockquote><p>Page Assist - A Web UI for Local AI Models</p></blockquote></li></ul><h2 id="上下文长度问题"><a href="#上下文长度问题" class="headerlink" title="上下文长度问题"></a>上下文长度问题</h2><ul><li><p>我在测试 <code>Chat with current page</code> 功能的时候发现，模型只能获取一部分的上下文。于是我把所有的 context 复制出来，发现其确实截断了网页内容。</p></li><li><p>但是我在这个插件的设置页面里找了半天也没找着任何和 <code>context window</code> 有关的设置选项，最后在 GitHub Issues 里通过搜索关键词 <code>citation</code> 找到了这样的<a class="link"   href="https://github.com/n4ze3m/page-assist/issues/513#issuecomment-3562111163" >解决方案<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a>：</p><blockquote><p>I just did workaround by increasing the limit of content size:</p><blockquote><p>RAG Settings -&gt; Retrieval Settings -&gt; Maximum Content Size for Full Context Mode</p></blockquote><p>Default is 7028, so I just change it to 100000 (I use mistral-large-latest in most cases).</p></blockquote></li><li><p>也是神奇，上下文长度的设置选项会放在 RAG Settings 里？这也没有用到 embedding model 和向量数据库吧。</p></li><li><p>将这个设置改为 128000 后内容截断的问题立马消失了。</p></li></ul><h2 id="自定义提示词"><a href="#自定义提示词" class="headerlink" title="自定义提示词"></a>自定义提示词</h2><ul><li><p>说实话，我对于自定义提示词并不是很熟悉。我对于那些“定义角色，划清职责，结构化输出”的提示词说实话，是非常不信任的。倒也没有什么具体的原因，就是一种感觉有种直觉上的“莫名其妙”。</p></li><li><p>话虽如此，我还是希望能声明模型在这个侧栏里的需求，因此定义了如下两个 prompt：</p><blockquote><p>分析当前网页内容。</p><ol><li>内容定性：直接指出它是深度分析、新闻快讯、营销软文还是其他类型的内容。</li><li>核心摘要：用最简短的话说明页面在讲什么，以及它的核心价值点。</li><li>定位回答：回答我的问题（如果有，没有则罗列网页内容的结构和各部分概要），并注明信息在文中的大概位置（如：开头、[XX]标题下、中部）。</li><li>诚实原则：如果内容空洞或我问的信息文中没有，请直接告知，不要润色或编造。</li></ol></blockquote></li><li><p>以及：</p><blockquote><p>作为一个技术文档提取工具，请执行以下操作：</p><ol><li>技术概览：快速列出该项目的主要功能（Features）和技术栈。</li><li>精确检索：根据我的提问，寻找特定的 API、配置参数或功能描述。</li><li>位置映射：给出该信息所在的具体章节标题或路径，以便我快速定位到原文。</li><li>无则申明：如果文档中没提到我寻找的内容，直接回复“未找到相关描述”，严禁基于常识进行推测。</li></ol><p>要求： 仅负责信息的“提取”与“定位”，保持技术术语原样，回答要干练。</p></blockquote></li><li><p>总的来说效果还可以，但是在后续关于某些具体信息提问的时候他居然还会按照这个流程来回答……哎哟，再说吧。</p></li></ul><h2 id="愿景"><a href="#愿景" class="headerlink" title="愿景"></a>愿景</h2><ul><li><p>不得不承认，当前的方案虽然有效，但属于是一种妥协。这个插件本质上并不是“通过 LLM 帮助用户快速的、更好的浏览网页”而设计的，他本质是一个本地大模型的 Web UI，那个 <code>Chat with current page</code> 更像是一个附带的额外功能。</p></li><li><p>此外，支持 Firefox 的开源插件，我在 GitHub 和 Firefox Extension Store 里搜索了一番几乎找不到几个可用的。</p></li><li><p>我在想，或许我可以自己写一个？我心中对于这样的插件的预期大概有这么几个点：</p><ol><li>总结网页，提供内容评估，标注信息来源，可以一键跳转</li><li>对于技术文档，严谨的查询 api 和文档说明，原样复述</li><li>访问文中的超链接，一并总结（可能需要限制数量）</li><li>对于懒加载内容的网页，加载过的部分予以缓存</li></ol></li><li><p>这些功能感觉并不是很难做，慢慢探索一下吧。</p></li></ul>]]>
    </content>
    <id>https://blog.imlast.top/2026/01/26/page-assist/</id>
    <link href="https://blog.imlast.top/2026/01/26/page-assist/"/>
    <published>2026-01-26T03:53:07.000Z</published>
    <summary>关于寻找“网页总结”插件的过程</summary>
    <title>Page Assist</title>
    <updated>2026-01-26T03:53:07.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>Last</name>
    </author>
    <category term="随笔" scheme="https://blog.imlast.top/categories/%E9%9A%8F%E7%AC%94/"/>
    <content>
      <![CDATA[<h2 id="毕业"><a href="#毕业" class="headerlink" title="毕业"></a>毕业</h2><ul><li><p>这一年我从大学毕业了。回首过去的四年，经历了两年疫情和 LLM 的问世，也算是感慨良多吧。</p></li><li><p>就如同我在大一时发觉的那样，在学校学习的这四年并没有给我带来很多知识的积累，对社交技能的熟络和对自我精神世界的探索倒是有所提升。</p></li><li><p>但是我没什么想在这里说的，那过去四年更多的是琐碎，迷茫和自我麻醉。我也变成了空心人，满脑稻草，犹豫不决。</p></li></ul><h2 id="考研"><a href="#考研" class="headerlink" title="考研"></a>考研</h2><ul><li><p>我选择了考研。期初我的目标是“名正言顺的再多学三年”，因为我感觉计算机和艺术领域都有太多值得我花时间进一步钻研的东西，因而不想这么快的进入社会参与工作。</p></li><li><p>事实证明，这是一个错误的选择。且不论后来我才发现的，考上硕士之后本质上和打工没什么大区别，就光是复习考研的这大半年就让我感觉难以消化。我太低估这项考试了，也太低估计算机专业硕士入学的内卷程度。</p></li><li><p>漫长的复习时间中，我屡次感到厌倦。那种在高中时期所感受过的虚无之感，又缓慢的席卷上来。不是一个明确的闪回，而是像蒙尘那样缓慢堆积的麻木。待到回过神来，已经在慢性压力下苦苦挣扎，在沉没成本面前犹豫不决。</p></li><li><p>尤其是考研报名的那一刻，我曾无数次推迟的模拟考，和估分后的目标院校选择，此时已然兵临城下，避无可避。</p></li><li><p>于是我逃离了，数次。我失眠了，数次，最后还出现了极端的作息失调——昼夜颠倒，而后又倒回。但是当我上午时分入睡，傍晚之后起床，一股奇妙的惬意之感充斥着我的全身：</p><blockquote><p>于是我自暴自弃了，我干脆放开了熬夜，直到真正的困倦袭来之时才上床睡觉。我关闭了所有闹钟，只管睡到自然醒的那一刻。就这样过了三天，我的入睡时间从早上九点到十点，最后到达十二点。<br>但是在这样的作息节律下，我感觉自己的精神状态得到了显著的好转。尤其是今天，下午六点半起床后我感觉自己久违的，真的是久违的感到了一种发自内心的振奋还愉悦，身心充满了力量和喜悦。出门吃饭的路上不禁欢呼雀跃，耳机里的音乐也听起来更加动人了。<br>我感觉一切困难都存在解答，不再感到先前那样焦虑，不在为所谓意义和存在而消沉。夜晚的天空漆黑一片，那星光如同救赎一般照耀我身。美丽的夜晚独属于我，一想到如此我便感到振奋不已。</p></blockquote></li><li><p>如此精神上的解脱虽然没能带给我继续复习的动力，但确实把我从那种虚无中再次拉了出来，也是颇为神奇的一次经历。</p></li></ul><hr><ul><li><p>经历了这一切之后，我深深的感到，我实在是不能接受那套叙事。再怎么和我强调坚持的话语，上岸后的愿景，都无济于事。我就是无法忍受这样的东西。说我懒惰也好，无知也罢，我就是这样了。</p><blockquote><p>我感觉社会共识已经陷入了一种癫狂，我们如此努力，投入如此多时间不是因为热爱，不是因为可预期的回报，不是因为满足自身对知识的渴望，而仅仅是因为恐惧和焦虑。为了把另一个人挤出赛道我们花费了如此巨大的力气，学着一些不知道是什么臭狗屎的无聊应试知识和技巧。我理解供大于求的时候招人的实验室会需要候选人以某种方式证明自己，但当这种证明所需要的成本如此之大，其造成的对知识的异化如此之深的时候，我们居然还能保持这种狂热？<br>这简直叫我费解，但他们又是如此的笃定，如此的诚恳和勤劳，以至于我每每思索到此处总要掉转矛头来怀疑自己。</p></blockquote></li><li><p>谁能成想，这 408 烟雨浩渺的庞大知识体系中，第一个让我感到无所适从，难以坚持的居然是大家公认最简单的数据结构。</p><blockquote><p>计算机这块尤其恶心我和你讲<br>因为绝大部分的算法都不是凭空出现的<br>是基于一个需要解决的现实问题才被发明出来的<br>不研究现实问题单纯学算法在我看来是很恶心很无聊的行为<br>最典型的就是那几个图和相关的遍历和寻路算法<br>但是大家都在这么做<br>说实话我感觉这个现象远不止于计算机这个领域的教育<br>但说实话那些物理化学的什么理论可能实验条件很苛刻，没法频繁开展实验课<br>计算机的实验条件还不简单吗？<br>现在手机上都能写代码</p></blockquote></li><li><p>我实在是无法理解那些数据结构和算法背后的目的，标准化考试异化后的背诵知识在我的感受里味同嚼蜡，令我痛苦不堪。</p></li></ul><hr><ul><li><blockquote><p>你想去大厂接触海量并发场景吗？<br>你想去顶尖实验室玩那些昂贵的硬件吗？<br>你想在未来的职场上有更多的话语权去定义“什么是好的代码”吗？</p></blockquote></li><li><p>说实话，我不想。我只想安安静静的学习而已，我不在乎大厂里怎么样，我不需要昂贵的硬件，我不需要拥有什么“职场话语权”。我只想满足自己的好奇心，自己对知识的渴望，对创造的渴望，对意义的追求。</p></li><li><p>这也是为什么我对自己的考研之路感到如此的自我怀疑，与沉没成本心理的对抗是如此的令人纠结。我去查看了一些导师的介绍网站，看到他们所发的论文基本都是“深度学习灌水”之后更是倍受打击，一度想着直接放弃不考了。那些实验室感觉都是些挂羊头卖狗肉的货色，考上了进去也只是当一个论文生产流水线上的工人，真叫我作呕。</p></li></ul><hr><ul><li><p>不管怎么说，这样的精神折磨我都不想体验第二次了。我不推荐任何人考研，起码不要在需要付出如此巨大的代价的情况下选择考研。</p></li><li><p>我已经为我一年前轻率的决定付出了代价，即便是现在考完一周过后，那种深深的倦怠仍然留存在我的身体里。</p></li></ul><h2 id="关于校园之外的荒野"><a href="#关于校园之外的荒野" class="headerlink" title="关于校园之外的荒野"></a>关于校园之外的荒野</h2><ul><li><p>现在我毕业了，我不得不开始考虑进入社会。</p></li><li><p>曾经我不止一次因为这件事焦虑过，中学和本科时期均有，但我都已“忧虑未来没有意义”压下了情绪，尝试“着眼当下”。但现在这一刻已经来临了，而我依然没什么想法。</p></li><li><p>我对自己未来的方向感到迷茫。我感觉到了这个毕业后的时刻，我对社会的了解并没有比我在中学或者本科的时候加深多少。尽管有许多童话般天真的设想慢慢消解了，但那其实更加加剧了我的迷茫和不安，而没有提供多少具有建设性的意见。</p></li><li><p>或许这就是现实中人们原本的模样——跌跌撞撞的摸索着前进，像我这样内心之中“需完全搞懂后才可予以实践”的预设才是一种错误的，天真的，甚至有些傲慢的偏见。</p></li><li><p>眼下我能做什么呢？我对就业市场并不了解，我通过选择考研逃避了这件事。但是倘若我没有考上呢？等到我被迫面对这件事的时候，会不会太晚了呢？</p></li><li><p>算了，在这个考试刚刚结束的身心俱疲的节点，我不想考虑这些事情。</p></li><li><p>是的，我又一次逃避了。但我真的倦得很，要是将来我要为此付出什么代价的话，尽管来吧。我倦得很。</p></li></ul><h2 id="变化"><a href="#变化" class="headerlink" title="变化"></a>变化</h2><h3 id="Zen"><a href="#Zen" class="headerlink" title="Zen"></a>Zen</h3><ul><li><p>年底我更换了浏览器，从 Brave 转向了 Zen，契机是 Theo 的<a class="link"   href="https://www.youtube.com/watch?v=m1QrNF9wZao" >浏览器讨论视频<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a>。</p></li><li><p>不得不说，这个浏览器确实让我感到非常惊艳，尽管他在性能上饱受诟病——轻轻松松吃掉 10G 内存。但是我并不缺内存（32G），事实上大部分时候我的日常软件（除开浏览器），只能占用 5 个 G 左右，因此剩下的 20+G 内存事实上是被浪费了。</p></li><li><p>最令我感到满意的事实上是他彻底删去了浏览器常见的顶栏，并且在 compact mode 下连侧栏都被隐藏，因而使得用户获得了一个非常洁净，纯粹的浏览体验，所谓 “Zen”。</p></li><li><p>我基本没遇到 Firefox 引起的兼容性问题，加之我对内存问题并不敏感，因此这成为了我的新主力浏览器。</p></li><li><p>不过我仍然留着 Brave，因为 Zen 在 oopz 上似乎有些问题，无法读取到麦克风输入。以及为了我所熟悉的那套 chromium devtools。</p></li></ul><h3 id="Spotify"><a href="#Spotify" class="headerlink" title="Spotify"></a>Spotify</h3><ul><li><p>由于网易云封禁了所有使用第三方客户端的用户，我不得不另寻他就。 在群友的推荐下我选择了 Spotify，用了一些特殊手段购买了便宜的一年会员。</p></li><li><p>我不得不说这个软件的体验事实上是不如网易云的，甚至比不上它的那些第三方客户端。</p><ul><li>首先是卡顿，我实在是无法理解为什么一个音乐软件的卡顿能如此严重，每次我打开一个歌单或者进行一次搜索都要加载好久。</li><li>其次是在 Linux 端的 Spotify 就像是个 beta 版，时不时就会崩溃。尽管背景中仍在放着音乐，它那彻底卡死的 UI 界面足以让你明白，它又崩溃了。</li><li>最后是交互逻辑，我真是搞不懂英文软件怎么都是这种德行，Spotify，YouTube，Apple Music 都是这样，交互逻辑极其反人类令人难以理解，同时缺少很多在我看来理所应当存在的功能（例如对当前播放列表的自定义）。国内的各种软件的缺点在于功能过度臃肿，而国外这些软件给我的感觉就是他简直拒绝交互。</li></ul></li></ul><h2 id="结语"><a href="#结语" class="headerlink" title="结语"></a>结语</h2><ul><li><p>这是一个无聊的人所过的无聊的一年。丧失了意义，丧失了动力。</p></li><li><p>前年好不容易从痛苦中解脱的我，好像又落入了另一个关于虚无的苦难循环中，世事无常呀。</p></li><li><p>但是好在，这一切已经结束了。我只需休息片刻，控制权仍在我的手里，我需要，休息片刻，现在。</p></li></ul>]]>
    </content>
    <id>https://blog.imlast.top/2025/12/27/2025-Summary/</id>
    <link href="https://blog.imlast.top/2025/12/27/2025-Summary/"/>
    <published>2025-12-27T18:03:00.000Z</published>
    <summary>这是一个解冻之夜，一个疾风之夜</summary>
    <title>2025 年终总结</title>
    <updated>2025-12-27T18:03:00.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>Last</name>
    </author>
    <category term="工具使用" scheme="https://blog.imlast.top/categories/%E5%B7%A5%E5%85%B7%E4%BD%BF%E7%94%A8/"/>
    <category term="wayland" scheme="https://blog.imlast.top/tags/wayland/"/>
    <category term="linuxqq" scheme="https://blog.imlast.top/tags/linuxqq/"/>
    <category term="shell" scheme="https://blog.imlast.top/tags/shell/"/>
    <content>
      <![CDATA[<div class="callout callout--titled danger mb-4 rounded-small shadow-redefine-flat bg-(--callout-bg-color) p-3 pl-1 relative flex flex-row gap-2"><div role="none" class="rounded-full self-stretch w-0.5 bg-(--callout-primary-color) shrink-0 opacity-60"></div><div class="flex flex-col gap-2"><div class="callout__title flex items-center gap-2 font-semibold tracking-tight"><i class="callout__icon fa-clock leading-none text-(--callout-primary-color) text-sm shrink-0"></i> <strong>更新</strong></div><div class="callout__content markdown-body flex-1 min-w-0"><ul><li>该 Shell 脚本因改来改去 Bug 频出，因此近日笔者细细研究了一番这其中的古怪机制，详情见 <a href="https://blog.imlast.top/2026/02/13/clipboard-sync/">这篇博文</a></li></ul></div></div></div><h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><ul><li><p>不知从哪个版本开始，Linuxqq 在 Wayland 下的粘贴板出现了一个奇怪的问题：可以将 qq 中的文本复制到系统粘贴板（cliphist），但是无法将系统粘贴板上的内容粘贴进 qq 中。</p></li><li><p>由于问题出现当时我正好将 Linuxqq 换成了 <code>linuxqq-nt-bwarp</code>，于是理所当然的认为这是因为 bwarp 沙盒化引起的，乍看之下也挺合理。</p></li><li><p>直到今天在群里看到群主（应要求，不透露 id）发了一份用来同步 <code>xclip</code> 和 <code>cliphist</code> 粘贴板内容的脚本，这才恍然大悟——沟槽的 tx，虽然 linuxqq 基于的 Electron 已经默认使用 Wayland 协议，但其复制仍然选择将内容输出到 <code>xclip</code>。</p></li></ul><hr><div class="callout callout--titled info mb-4 rounded-small shadow-redefine-flat bg-(--callout-bg-color) p-3 pl-1 relative flex flex-row gap-2"><div role="none" class="rounded-full self-stretch w-0.5 bg-(--callout-primary-color) shrink-0 opacity-60"></div><div class="flex flex-col gap-2"><div class="callout__title flex items-center gap-2 font-semibold tracking-tight"><i class="callout__icon fa-circle-info leading-none text-(--callout-primary-color) text-sm shrink-0"></i> 查看</div><div class="callout__content markdown-body flex-1 min-w-0"><p>可以使用 <code>xclip -sel clip -o</code> 来查看 xlip 粘贴板中的内容。</p></div></div></div><h2 id="脚本"><a href="#脚本" class="headerlink" title="脚本"></a>脚本</h2><ul><li><p>脚本代码如下：</p>  <details class="relative my-4 border border-border-color bg-second-background-color rounded-md  blue" data-header-exclude><summary class="px-4 py-2 rounded-md shadow-[0_0_2px_0_var(--shadow-color-1)] cursor-pointer not-markdown"><i class="fa-solid fa-chevron-right"></i>clipboard_sync.sh</summary><div class="content p-4 "><div class="code-container" data-rel="Bash"><figure class="iseeu highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># Lock file to prevent multiple instances</span></span><br><span class="line">LOCK_DIR=<span class="string">&quot;<span class="variable">$&#123;XDG_RUNTIME_DIR:-/tmp&#125;</span>&quot;</span></span><br><span class="line">LOCK_FILE=<span class="string">&quot;<span class="variable">$LOCK_DIR</span>/clipboard_sync.lock&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">exec</span> 200&gt;<span class="string">&quot;<span class="variable">$LOCK_FILE</span>&quot;</span></span><br><span class="line">flock -n 200 || &#123;</span><br><span class="line">    <span class="built_in">echo</span> <span class="string">&quot;Error: Another instance of the script is already running.&quot;</span> &gt;&amp;2</span><br><span class="line">    <span class="built_in">exit</span> 1</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment"># Temp file path</span></span><br><span class="line">TEMP_IMG=<span class="string">&quot;<span class="variable">$LOCK_DIR</span>/clip_sync_buffer&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># The interval in seconds for checking the clipboard</span></span><br><span class="line">INTERVAL=0.5</span><br><span class="line"></span><br><span class="line"><span class="comment"># Color definitions for logging</span></span><br><span class="line">COLOR_RESET=<span class="string">&quot;\033[0m&quot;</span></span><br><span class="line">COLOR_GREEN=<span class="string">&quot;\033[32m&quot;</span></span><br><span class="line">COLOR_BLUE=<span class="string">&quot;\033[34m&quot;</span></span><br><span class="line">COLOR_YELLOW=<span class="string">&quot;\033[33m&quot;</span></span><br><span class="line">COLOR_CYAN=<span class="string">&quot;\033[36m&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># General log function</span></span><br><span class="line"><span class="function"><span class="title">log</span></span>() &#123;</span><br><span class="line">    <span class="built_in">local</span> timestamp=$(<span class="built_in">date</span> <span class="string">&#x27;+%H:%M:%S&#x27;</span>)</span><br><span class="line">    <span class="built_in">echo</span> -e <span class="string">&quot;<span class="variable">$&#123;COLOR_CYAN&#125;</span>[<span class="variable">$timestamp</span>]<span class="variable">$&#123;COLOR_RESET&#125;</span> <span class="variable">$1</span>&quot;</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment"># Log function specific to sync events</span></span><br><span class="line"><span class="function"><span class="title">log_sync</span></span>() &#123;</span><br><span class="line">    <span class="built_in">local</span> direction=<span class="variable">$1</span></span><br><span class="line">    <span class="built_in">local</span> <span class="built_in">type</span>=<span class="variable">$2</span></span><br><span class="line">    <span class="built_in">local</span> format=<span class="variable">$3</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">case</span> <span class="string">&quot;<span class="variable">$direction</span>&quot;</span> <span class="keyword">in</span></span><br><span class="line">        <span class="string">&quot;x11-&gt;wl&quot;</span>)</span><br><span class="line">            <span class="built_in">echo</span> -e <span class="string">&quot;<span class="variable">$&#123;COLOR_CYAN&#125;</span>[<span class="subst">$(date &#x27;+%H:%M:%S&#x27;)</span>]<span class="variable">$&#123;COLOR_RESET&#125;</span> <span class="variable">$&#123;COLOR_GREEN&#125;</span>✓<span class="variable">$&#123;COLOR_RESET&#125;</span> X11 → Wayland | <span class="variable">$&#123;COLOR_YELLOW&#125;</span><span class="variable">$&#123;type&#125;</span><span class="variable">$&#123;COLOR_RESET&#125;</span><span class="variable">$&#123;format&#125;</span>&quot;</span></span><br><span class="line">            ;;</span><br><span class="line">        <span class="string">&quot;wl-&gt;x11&quot;</span>)</span><br><span class="line">            <span class="built_in">echo</span> -e <span class="string">&quot;<span class="variable">$&#123;COLOR_CYAN&#125;</span>[<span class="subst">$(date &#x27;+%H:%M:%S&#x27;)</span>]<span class="variable">$&#123;COLOR_RESET&#125;</span> <span class="variable">$&#123;COLOR_BLUE&#125;</span>✓<span class="variable">$&#123;COLOR_RESET&#125;</span> Wayland → X11 | <span class="variable">$&#123;COLOR_YELLOW&#125;</span><span class="variable">$&#123;type&#125;</span><span class="variable">$&#123;COLOR_RESET&#125;</span><span class="variable">$&#123;format&#125;</span>&quot;</span></span><br><span class="line">            ;;</span><br><span class="line">    <span class="keyword">esac</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment"># Function to check for required command dependencies</span></span><br><span class="line"><span class="function"><span class="title">check_dependencies</span></span>() &#123;</span><br><span class="line">    <span class="built_in">local</span> missing_deps=()</span><br><span class="line">    <span class="keyword">for</span> cmd <span class="keyword">in</span> xclip wl-paste wl-copy <span class="built_in">sha256sum</span>; <span class="keyword">do</span></span><br><span class="line">        <span class="keyword">if</span> ! <span class="built_in">command</span> -v <span class="string">&quot;<span class="variable">$cmd</span>&quot;</span> &amp;&gt;/dev/null; <span class="keyword">then</span></span><br><span class="line">            missing_deps+=(<span class="string">&quot;<span class="variable">$cmd</span>&quot;</span>)</span><br><span class="line">        <span class="keyword">fi</span></span><br><span class="line">    <span class="keyword">done</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> [[ <span class="variable">$&#123;#missing_deps[@]&#125;</span> -gt 0 ]]; <span class="keyword">then</span></span><br><span class="line">        <span class="built_in">echo</span> <span class="string">&quot;Error: Missing required dependencies: <span class="variable">$&#123;missing_deps[*]&#125;</span>&quot;</span> &gt;&amp;2</span><br><span class="line">        <span class="built_in">exit</span> 1</span><br><span class="line">    <span class="keyword">fi</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment"># Debounce variables</span></span><br><span class="line">last_text=<span class="string">&quot;&quot;</span></span><br><span class="line">last_x11_img_hash=<span class="string">&quot;&quot;</span>  <span class="comment"># Hash of the last image synced from X11 to Wayland</span></span><br><span class="line">last_wl_img_hash=<span class="string">&quot;&quot;</span>   <span class="comment"># Hash of the last image synced from Wayland to X11</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># Main sync loop</span></span><br><span class="line"><span class="function"><span class="title">clipboard_sync</span></span>() &#123;</span><br><span class="line">    <span class="keyword">while</span> <span class="literal">true</span>; <span class="keyword">do</span></span><br><span class="line">        img_synced=<span class="literal">false</span>  <span class="comment"># Flag to track if an image was synced in this iteration</span></span><br><span class="line"></span><br><span class="line">        <span class="comment"># -------- Image Sync: X11 → Wayland --------</span></span><br><span class="line">        x11_targets=$(xclip -selection clipboard -t TARGETS -o 2&gt;/dev/null || <span class="literal">true</span>)</span><br><span class="line">        x11_img_type=<span class="string">&quot;&quot;</span></span><br><span class="line">        <span class="keyword">if</span> <span class="built_in">echo</span> <span class="string">&quot;<span class="variable">$x11_targets</span>&quot;</span> | grep -q <span class="string">&quot;image/png&quot;</span>; <span class="keyword">then</span></span><br><span class="line">            x11_img_type=<span class="string">&quot;image/png&quot;</span></span><br><span class="line">        <span class="keyword">elif</span> <span class="built_in">echo</span> <span class="string">&quot;<span class="variable">$x11_targets</span>&quot;</span> | grep -q <span class="string">&quot;image/jpeg&quot;</span>; <span class="keyword">then</span></span><br><span class="line">            x11_img_type=<span class="string">&quot;image/jpeg&quot;</span></span><br><span class="line">        <span class="keyword">elif</span> <span class="built_in">echo</span> <span class="string">&quot;<span class="variable">$x11_targets</span>&quot;</span> | grep -q <span class="string">&quot;image/gif&quot;</span>; <span class="keyword">then</span></span><br><span class="line">            x11_img_type=<span class="string">&quot;image/gif&quot;</span></span><br><span class="line">        <span class="keyword">fi</span></span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> [[ -n <span class="string">&quot;<span class="variable">$x11_img_type</span>&quot;</span> ]]; <span class="keyword">then</span></span><br><span class="line">            <span class="keyword">if</span> xclip -selection clipboard -t <span class="string">&quot;<span class="variable">$x11_img_type</span>&quot;</span> -o &gt; <span class="string">&quot;TEMP_IMG&quot;</span> 2&gt;/dev/null; <span class="keyword">then</span></span><br><span class="line"></span><br><span class="line">                <span class="comment"># image output file exists</span></span><br><span class="line">                <span class="keyword">if</span> [[ -s <span class="string">&quot;<span class="variable">$TEMP_IMG</span>&quot;</span> ]]; <span class="keyword">then</span></span><br><span class="line">                    x11_img_hash=$(xclip -selection clipboard -t <span class="string">&quot;<span class="variable">$x11_img_type</span>&quot;</span> -o 2&gt;/dev/null | <span class="built_in">sha256sum</span> | awk <span class="string">&#x27;&#123;print $1&#125;&#x27;</span>)</span><br><span class="line"></span><br><span class="line">                    <span class="keyword">if</span> [[ -n <span class="string">&quot;<span class="variable">$x11_img_hash</span>&quot;</span> &amp;&amp; <span class="string">&quot;<span class="variable">$x11_img_hash</span>&quot;</span> != <span class="string">&quot;<span class="variable">$last_x11_img_hash</span>&quot;</span> ]]; <span class="keyword">then</span></span><br><span class="line"></span><br><span class="line">                        <span class="comment"># use temp file as buffer instead of using pipeline directly to avoid image cut off</span></span><br><span class="line">                        wl-copy -t <span class="string">&quot;<span class="variable">$x11_img_type</span>&quot;</span> &lt; <span class="string">&quot;<span class="variable">$TEMP_IMG</span>&quot;</span></span><br><span class="line"></span><br><span class="line">                        last_x11_img_hash=<span class="string">&quot;<span class="variable">$x11_img_hash</span>&quot;</span></span><br><span class="line">                        last_wl_img_hash=<span class="string">&quot;<span class="variable">$x11_img_hash</span>&quot;</span></span><br><span class="line">                        img_synced=<span class="literal">true</span></span><br><span class="line">                        log_sync <span class="string">&quot;x11-&gt;wl&quot;</span> <span class="string">&quot;Image&quot;</span> <span class="string">&quot; (<span class="variable">$x11_img_type</span>)&quot;</span></span><br><span class="line">                    <span class="keyword">fi</span></span><br><span class="line">                <span class="keyword">fi</span></span><br><span class="line"></span><br><span class="line">            <span class="keyword">fi</span></span><br><span class="line">        <span class="keyword">fi</span></span><br><span class="line"></span><br><span class="line">        <span class="comment"># -------- Image Sync: Wayland → X11 --------</span></span><br><span class="line">        <span class="comment"># Only check Wayland → X11 if no image sync has occurred in this iteration</span></span><br><span class="line">        <span class="keyword">if</span> [[ <span class="string">&quot;<span class="variable">$img_synced</span>&quot;</span> == <span class="literal">false</span> ]]; <span class="keyword">then</span></span><br><span class="line">            wl_types=$(wl-paste --list-types 2&gt;/dev/null || <span class="literal">true</span>)</span><br><span class="line">            wl_img_type=<span class="string">&quot;&quot;</span></span><br><span class="line">            <span class="keyword">if</span> <span class="built_in">echo</span> <span class="string">&quot;<span class="variable">$wl_types</span>&quot;</span> | grep -q <span class="string">&quot;image/png&quot;</span>; <span class="keyword">then</span></span><br><span class="line">                wl_img_type=<span class="string">&quot;image/png&quot;</span></span><br><span class="line">            <span class="keyword">elif</span> <span class="built_in">echo</span> <span class="string">&quot;<span class="variable">$wl_types</span>&quot;</span> | grep -q <span class="string">&quot;image/jpeg&quot;</span>; <span class="keyword">then</span></span><br><span class="line">                wl_img_type=<span class="string">&quot;image/jpeg&quot;</span></span><br><span class="line">            <span class="keyword">elif</span> <span class="built_in">echo</span> <span class="string">&quot;<span class="variable">$wl_types</span>&quot;</span> | grep -q <span class="string">&quot;image/gif&quot;</span>; <span class="keyword">then</span></span><br><span class="line">                wl_img_type=<span class="string">&quot;image/gif&quot;</span></span><br><span class="line">            <span class="keyword">fi</span></span><br><span class="line"></span><br><span class="line">            <span class="keyword">if</span> [[ -n <span class="string">&quot;<span class="variable">$wl_img_type</span>&quot;</span> ]]; <span class="keyword">then</span></span><br><span class="line">                <span class="comment"># Pipe binary data to calculate hash for debouncing</span></span><br><span class="line">                <span class="comment"># wl_img_hash=$(wl-paste -t &quot;$wl_img_type&quot; 2&gt;/dev/null | tee &gt;(sha256sum | awk &#x27;&#123;print $1&#125;&#x27; &gt; /tmp/wl_hash_$$) | cat &gt; /dev/null; cat /tmp/wl_hash_$$ 2&gt;/dev/null; rm -f /tmp/wl_hash_$$ 2&gt;/dev/null)</span></span><br><span class="line"></span><br><span class="line">                <span class="keyword">if</span> wl-paste -t <span class="string">&quot;<span class="variable">$wl_img_type</span>&quot;</span> &gt; <span class="string">&quot;<span class="variable">$TEMP_IMG</span>&quot;</span> 2&gt;/dev/null; <span class="keyword">then</span></span><br><span class="line">                    <span class="keyword">if</span> [[ -s <span class="string">&quot;<span class="variable">$TEMP_IMG</span>&quot;</span> ]]; <span class="keyword">then</span></span><br><span class="line">                        wl_img_hash=$(<span class="built_in">sha256sum</span> <span class="string">&quot;<span class="variable">$TEMP_IMG</span>&quot;</span> | awk <span class="string">&#x27;&#123;print $1&#125;&#x27;</span>)</span><br><span class="line"></span><br><span class="line">                        <span class="comment"># If the Wayland image is different from the last synced one, sync it to X11</span></span><br><span class="line">                        <span class="keyword">if</span> [[ -n <span class="string">&quot;<span class="variable">$wl_img_hash</span>&quot;</span> &amp;&amp; <span class="string">&quot;<span class="variable">$wl_img_hash</span>&quot;</span> != <span class="string">&quot;<span class="variable">$last_wl_img_hash</span>&quot;</span> ]]; <span class="keyword">then</span></span><br><span class="line">                            xclip -selection clipboard -t <span class="string">&quot;wl_img_type&quot;</span> -i &lt; <span class="string">&quot;<span class="variable">$TEMP_IMG</span>&quot;</span></span><br><span class="line"></span><br><span class="line">                            last_wl_img_hash=<span class="string">&quot;<span class="variable">$wl_img_hash</span>&quot;</span></span><br><span class="line">                            last_x11_img_hash=<span class="string">&quot;<span class="variable">$wl_img_hash</span>&quot;</span></span><br><span class="line">                            img_synced=<span class="literal">true</span>  <span class="comment"># Mark image as synced to skip text sync in this iteration</span></span><br><span class="line">                            log_sync <span class="string">&quot;wl-&gt;x11&quot;</span> <span class="string">&quot;Image&quot;</span> <span class="string">&quot; (<span class="variable">$wl_img_type</span>)&quot;</span></span><br><span class="line">                        <span class="keyword">fi</span></span><br><span class="line">                    <span class="keyword">fi</span></span><br><span class="line">                <span class="keyword">fi</span></span><br><span class="line"></span><br><span class="line">            <span class="keyword">fi</span></span><br><span class="line">        <span class="keyword">fi</span></span><br><span class="line"></span><br><span class="line">        <span class="comment"># -------- Text Sync --------</span></span><br><span class="line">        <span class="comment"># Only perform text sync if no image was synced in this iteration</span></span><br><span class="line">        <span class="keyword">if</span> [[ <span class="string">&quot;<span class="variable">$img_synced</span>&quot;</span> == <span class="literal">false</span> ]]; <span class="keyword">then</span></span><br><span class="line">            text_synced=<span class="literal">false</span>  <span class="comment"># Flag to track if text was synced in this iteration</span></span><br><span class="line"></span><br><span class="line">            x11_targets=$(xclip -selection clipboard -t TARGETS -o 2&gt;/dev/null || <span class="literal">true</span>)</span><br><span class="line"></span><br><span class="line">            <span class="comment"># Only read from X11 clipboard if it likely contains text to avoid warnings from binary data</span></span><br><span class="line">            <span class="keyword">if</span> <span class="built_in">echo</span> <span class="string">&quot;x11_targets&quot;</span> | grep -qE <span class="string">&quot;image/png|image/jpeg|image/bmp|image/tiff&quot;</span>; <span class="keyword">then</span></span><br><span class="line">                x11_text=<span class="string">&quot;&quot;</span></span><br><span class="line">            <span class="keyword">else</span></span><br><span class="line">                x11_text=$(xclip -selection clipboard -t UTF8_STRING -o 2&gt;/dev/null || <span class="literal">true</span>)</span><br><span class="line">            <span class="keyword">fi</span></span><br><span class="line"></span><br><span class="line">            current_text=$(wl-paste --<span class="built_in">type</span> text/plain 2&gt;/dev/null || <span class="literal">true</span>)</span><br><span class="line"></span><br><span class="line">            <span class="keyword">if</span> [[ -n <span class="string">&quot;<span class="variable">$x11_text</span>&quot;</span> &amp;&amp; <span class="string">&quot;<span class="variable">$x11_text</span>&quot;</span> != <span class="string">&quot;<span class="variable">$last_text</span>&quot;</span> &amp;&amp; <span class="string">&quot;<span class="variable">$x11_text</span>&quot;</span> != <span class="string">&quot;<span class="variable">$current_text</span>&quot;</span> ]]; <span class="keyword">then</span></span><br><span class="line">                <span class="keyword">if</span> [[ ! <span class="string">&quot;<span class="variable">$x11_text</span>&quot;</span> =~ \x00 ]]; <span class="keyword">then</span></span><br><span class="line">                    <span class="comment"># use `printf` for special characters</span></span><br><span class="line">                    <span class="built_in">printf</span> <span class="string">&quot;%s&quot;</span> <span class="string">&quot;<span class="variable">$x11_text</span>&quot;</span> | wl-copy --<span class="built_in">type</span> text/plain</span><br><span class="line">                    last_text=<span class="string">&quot;<span class="variable">$x11_text</span>&quot;</span></span><br><span class="line">                    text_synced=<span class="literal">true</span></span><br><span class="line">                    log_sync <span class="string">&quot;x11-&gt;wl&quot;</span> <span class="string">&quot;Text&quot;</span> <span class="string">&quot; \&quot;<span class="variable">$preview</span>\&quot;&quot;</span></span><br><span class="line">                <span class="keyword">fi</span></span><br><span class="line">            <span class="keyword">fi</span></span><br><span class="line"></span><br><span class="line">            <span class="comment"># Only check Wayland → X11 if no text sync has occurred from the other direction</span></span><br><span class="line">            <span class="keyword">if</span> [[ <span class="string">&quot;<span class="variable">$text_synced</span>&quot;</span> == <span class="literal">false</span> &amp;&amp; -n <span class="string">&quot;<span class="variable">$current_text</span>&quot;</span> &amp;&amp; <span class="string">&quot;<span class="variable">$current_text</span>&quot;</span> != <span class="string">&quot;<span class="variable">$last_text</span>&quot;</span> &amp;&amp; <span class="string">&quot;<span class="variable">$x11_text</span>&quot;</span> != <span class="string">&quot;<span class="variable">$current_text</span>&quot;</span> ]]; <span class="keyword">then</span></span><br><span class="line">                <span class="comment"># use `printf` for special characters</span></span><br><span class="line">                <span class="built_in">printf</span> <span class="string">&quot;%s&quot;</span> <span class="string">&quot;<span class="variable">$current_text</span>&quot;</span> | xclip -selection clipboard -t UTF8_STRING -i</span><br><span class="line">                last_text=<span class="string">&quot;<span class="variable">$current_text</span>&quot;</span></span><br><span class="line">                log_sync <span class="string">&quot;wl-&gt;x11&quot;</span> <span class="string">&quot;Text&quot;</span> <span class="string">&quot; \&quot;<span class="variable">$preview</span>\&quot;&quot;</span></span><br><span class="line">            <span class="keyword">fi</span></span><br><span class="line">        <span class="keyword">fi</span></span><br><span class="line"></span><br><span class="line">        <span class="built_in">sleep</span> <span class="variable">$INTERVAL</span></span><br><span class="line">    <span class="keyword">done</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment"># Set up cleanup on exit (releases the lock file)</span></span><br><span class="line"><span class="built_in">trap</span> <span class="string">&#x27;exit&#x27;</span> INT TERM EXIT</span><br><span class="line"></span><br><span class="line"><span class="comment"># Check for dependencies</span></span><br><span class="line">check_dependencies</span><br><span class="line"></span><br><span class="line"><span class="built_in">log</span> <span class="string">&quot;Clipboard sync service started&quot;</span></span><br><span class="line"><span class="built_in">log</span> <span class="string">&quot;Monitoring clipboard sync between Wayland ↔ X11...&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">log</span> <span class="string">&quot;Service started on lock: <span class="variable">$LOCK_FILE</span>&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># Start the sync service</span></span><br><span class="line">clipboard_sync</span><br></pre></td></tr></table></figure></div></div></details></li></ul><hr><ul><li><p>这个脚本的思路很简单：每间隔 <code>$INTERVAL</code> 的时间，就同步一次两个剪贴板中的内容。同时，利用哈希算法来确保图片的同步过程中不会出现无限循环。</p></li><li><p>同时，笔者加入了使用 <code>flock</code> 的片段来确保不会出现该脚本在同一时间被运行多次的情况。</p>  <div class="code-container" data-rel="Bash"><figure class="iseeu highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Lock file to prevent multiple instances</span></span><br><span class="line">LOCK_DIR=<span class="string">&quot;<span class="variable">$&#123;XDG_RUNTIME_DIR:-/tmp&#125;</span>&quot;</span></span><br><span class="line">LOCK_FILE=<span class="string">&quot;<span class="variable">$LOCK_DIR</span>/clipboard_sync.lock&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">exec</span> 200&gt;<span class="string">&quot;<span class="variable">$LOCK_FILE</span>&quot;</span></span><br><span class="line">flock -n 200 || &#123;</span><br><span class="line">    <span class="built_in">echo</span> <span class="string">&quot;Error: Another instance of the script is already running.&quot;</span> &gt;&amp;2</span><br><span class="line">    <span class="built_in">exit</span> 1</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment"># ...</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="built_in">trap</span> <span class="string">&#x27;exit&#x27;</span> INT TERM EXIT</span><br></pre></td></tr></table></figure></div></li></ul><h2 id="后台运行"><a href="#后台运行" class="headerlink" title="后台运行"></a>后台运行</h2><ul><li><p>笔者使用的是 Hyprland，因此只需在配置文件中加入：</p>  <div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"># Start clipboard sync service (for linuxqq)</span><br><span class="line">exec = ~/path/to/clipboard_sync.sh</span><br></pre></td></tr></table></figure></div></li><li><p>即可。</p></li></ul>]]>
    </content>
    <id>https://blog.imlast.top/2025/10/15/linuxqq-clipboard-issue/</id>
    <link href="https://blog.imlast.top/2025/10/15/linuxqq-clipboard-issue/"/>
    <published>2025-10-15T09:07:43.000Z</published>
    <summary>解决 Linuxqq 在 Wayland 协议下粘贴板无法正常工作的问题</summary>
    <title>Linuxqq 粘贴板同步问题</title>
    <updated>2025-10-15T09:07:43.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>Last</name>
    </author>
    <category term="随笔" scheme="https://blog.imlast.top/categories/%E9%9A%8F%E7%AC%94/"/>
    <category term="linux" scheme="https://blog.imlast.top/tags/linux/"/>
    <content>
      <![CDATA[<ul><li><p>在刚接触 Arch Linux 的时候我也像许多人一样，痴迷于美化自己的桌面系统。从 KDE 的自定义组件到 bspwm 的脚本配置，最后到 hyprland 各种绚丽的动效。此外，还有很多 neovim 的插件和快捷键配置，例如 neo-tree 或者 codesnap，最近一次的配置大修更是从一系列主流插件转向了 folke 的 <code>snacks.nvim</code> 。（哎 folke 的大手）</p></li><li><p>不得不说，折腾这些美化和快捷键之类的配置确实有一种魔力，让我着迷。诚然，摆弄这些东西并予以一定程度的客制化确实能够帮助用户更加了解他们的系统和桌面环境操作。其对于生产力的作用虽然确实不能说完全没有，但也只是“可有可无”的程度而已。在这其中投入大量的时间并非明智之举。</p></li></ul><hr><ul><li><p>我想，之所以这样的行为如此令人着迷，大概是因为更改配置时产生的“即时反馈”。相较于对一些艰深知识的漫长学习，折腾配置所产生的成果来的要快多了——只需浏览官方文档（又或者是从别人哪里抄来一套配置），更改几个选项便能立竿见影的看到其实现的效果，这确实很令人着迷，让人产生一种“自己的系统全然尽在掌握”的奇妙感觉。</p></li><li><p>但事实上，这种掌控感一定程度上可以说是“假的”——折腾配置并没有带来对于桌面环境本身或者系统底层运行原理的理解，能够通过修改各种配置得到一个美观的桌面并不代表理解了 wayland 协议或者各种动效的实现原理。</p></li><li><p>不停的更换桌面环境，但是始终没有能力为其提供一个 patch 或者实现一个 new feature。安装了几十个插件，但是最终也没有能力编写一个属于自己的插件，又或者对于 neovim 的 lsp 实现一无所知（……literally me）。</p></li></ul><hr><ul><li><p>不可否认，在折腾桌面环境的美化和 neovim 插件的过程中，我某些方面的能力的确得到了提升。例如：查文档定位需求&#x2F;问题的能力和英语阅读能力。</p></li><li><p>但是这种提升在我看来，并不一定非要通过折腾桌面美化来获得。直接参与优秀公开课的学习或者实习对于上述能力的提升更加立竿见影。相较于投入在 ricing 上的大量时间，所获得的回报实在是有点不成比例了。</p></li><li><p>不过就这方面来说，可能没那么绝对。毕竟有时候过于缺乏基础能力的情况下盲目上手一些专业性和理论性较强的较难课程可能确实比较困难。“兴趣驱动学习”或许可以作为一个“过渡阶段”，帮助度过前期的困难期。</p></li></ul><hr><ul><li><p>或许在这个问题上，我们应当运用一下所谓的“二八定律”，即花费 20% 的时间来获取 80% 的效果。比如我现在就直接使用 ml4w 的 hyprland 配置并加以魔改以适应此前自己习惯的快捷键配置。在<a href="https://blog.imlast.top/2024/12/18/2nd-hyprland/">相关博客</a>中我当时也提到了在折腾桌面环境配置上所花费的大量时间并不是很值得：</p><blockquote><p>在初入 DE Rice 领域的时候，我曾坚信只有由自己亲手去写（缝） dotfiles，搞明白每一个配置选项和桌面环境的启动流程，才能保证在某个桌面组件出问题的时候可以快速定位到问题源头并予以修复。直接套用他人提供的配置文件看似在配置阶段省下了不少时间，实则会在将来的某一刻加倍偿还。<br>虽然如今我依然这样觉得，但是已然不愿意付出折腾系统美化所消耗的时间和精力代价了。</p></blockquote><blockquote><p>所以这次我选择了一种折中的方案：套用 mylinuxforwork 的 dotfile（该配置套件甚至在 Hyprland 的官方 wiki 中得到推荐），在此基础之上加入&#x2F;修改一些自己定制的配置方案。<br>当然，这一切也是基于我过去很长一段时间内使用 Bspwm 和上一次配置 Hyprland 的经验才能实现。毕竟，深度定制桌面环境配置的前提依然是能看懂各个配置项的作用。</p></blockquote></li><li><p>简而言之，稍微投入一定程度的努力，获得一定的效率提升和阅读文档能力之后便可收手了。再往后，各种细致定制化大部分情况也不过是重复此前的步骤，在各种桌面环境和编辑器&#x2F;插件间来回跳跃而已。</p></li></ul><hr><ul><li>又或者说，或许可以以此为入口，尝试对于 Linux 系统底层和各种桌面协议进行学习？这在大部分情况下感觉和折腾配置的初衷是矛盾的——大部分情况下人们只是想要即时反馈和绚丽的桌面以作为炫耀的资本而已。漫长且反馈具有一定延迟性的学习一定程度上来说是反人性的，单凭兴趣驱动恐怕很难支持一个人走那么远的距离。</li></ul><hr><ul><li>总的来说，折腾美化和配置在某种程度上确实可以提升用户日常操作的效率，以及文档阅读能力。但是这样的能力提升并不高效，且走不远。最终我们还是应该回归到对于更加“正经”或者说“传统”的 CS 技能和知识的学习上来。</li></ul>]]>
    </content>
    <id>https://blog.imlast.top/2025/06/22/configuration-engineering/</id>
    <link href="https://blog.imlast.top/2025/06/22/configuration-engineering/"/>
    <published>2025-06-22T14:10:27.000Z</published>
    <summary>所谓“配置工程师”的利与弊</summary>
    <title>关于所谓“配置工程师”</title>
    <updated>2025-06-22T14:10:27.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>Last</name>
    </author>
    <category term="笔记" scheme="https://blog.imlast.top/categories/%E7%AC%94%E8%AE%B0/"/>
    <category term="c" scheme="https://blog.imlast.top/tags/c/"/>
    <content>
      <![CDATA[<h2 id="起因"><a href="#起因" class="headerlink" title="起因"></a>起因</h2><ul><li><p>记得去年在完成 NJU PA 的时候，遇见一位群友在读取 elf 文件并校验魔数的时候遇到的问题：他读取出的魔数是字节颠倒的。</p></li><li><p>他读出的魔数是 <code>46 4c 45 7f</code>，但实际上应当为 <code>7f 45 4c 46</code>。从表面上看，就好像是因为小端序机器中内存的存储方式一样，以字节为单位颠倒过来。</p></li><li><p>我当时仔细检查他的代码后发现，他使用 <code>fread</code> 函数的时候出现了错误，填反了 <code>size</code> 和 <code>n_count</code> 这两个参数：</p>  <div class="code-container" data-rel="C"><figure class="iseeu highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">uint32_t</span> ident;</span><br><span class="line">FILE *fp = fopen(<span class="string">&quot;./a.out&quot;</span>, <span class="string">&quot;rb&quot;</span>);</span><br><span class="line"></span><br><span class="line">fread(&amp;ident, <span class="number">1</span>, <span class="number">4</span>, fp);</span><br></pre></td></tr></table></figure></div></li><li><p>我想当然的认为，这就是导致最后字节顺序倒转的原因。</p></li><li><p>但实际上当时我们都没有尝试调转这两个参数的位置后，输出的内容会不会恢复正常——那位朋友后来得知了可以 <code>#include &lt;elf.h&gt;</code> 并且使用其中定义好的数据结构承接 elf 文件中的内容，也就不需要这种方法了。</p>  <div class="code-container" data-rel="C"><figure class="iseeu highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">ElfW(Ehdr) ELF_header;</span><br><span class="line">fread(&amp;ELF_header, <span class="keyword">sizeof</span>(ELF_header), <span class="number">1</span>, file);</span><br><span class="line"><span class="comment">// check file ident</span></span><br><span class="line"><span class="keyword">if</span> (<span class="built_in">memcmp</span>(ELF_header.e_ident, ELFMAG, SELFMAG) != <span class="number">0</span>)</span><br><span class="line">    Assert(<span class="number">0</span>, ANSI_FMT(<span class="string">&quot;Not an ELF file: %s.&quot;</span>, ANSI_FG_RED), elfFile);</span><br></pre></td></tr></table></figure></div></li></ul><h2 id="实际原因"><a href="#实际原因" class="headerlink" title="实际原因"></a>实际原因</h2><ul><li><p>时隔半年我看到考研群里大伙在讨论大小端序，突然想起来上面这位朋友遇到的问题，便想着重现一下并且和群友们分享。但是我突然发现我始终无法获取一个相反的文件内容，不管 <code>size</code> 是不是 1。</p></li><li><p>询问大模型后我才恍然大悟，原来真正的问题并不在于 <code>fread</code>，而是用来存放读取到的内容的变量类型： <code>uint32_t</code>。</p></li><li><p>真正的原因在于从文件中读取的内容被存在了一个 <code>uint32_t</code> 类型的变量里，而这类变量在小端序机器的内存中存放的方式正是字节颠倒的。此时使用 <code>%x</code> 作为占位符将其输出时，就会得到一个字节颠倒的结果。</p></li><li><p>下面这两个函数可以很好的展示这一差异：</p>  <div class="code-container" data-rel="C"><figure class="iseeu highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">void</span> <span class="title function_">read_elf_uint</span><span class="params">()</span> &#123;</span><br><span class="line">    <span class="type">uint32_t</span> ident;</span><br><span class="line">    FILE *fp = fopen(<span class="string">&quot;./a.out&quot;</span>, <span class="string">&quot;rb&quot;</span>);</span><br><span class="line"></span><br><span class="line">    fread(&amp;ident, <span class="number">4</span>, <span class="number">1</span>, fp);</span><br><span class="line"></span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;reversed: 0x%x\n&quot;</span>, ident);</span><br><span class="line"></span><br><span class="line">    fclose(fp);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="type">void</span> <span class="title function_">read_elf</span><span class="params">()</span> &#123;</span><br><span class="line">    <span class="type">unsigned</span> <span class="type">char</span> ident[<span class="number">4</span>];</span><br><span class="line">    <span class="built_in">memset</span>(ident, <span class="number">0</span>, <span class="number">4</span>);</span><br><span class="line">    FILE *fp = fopen(<span class="string">&quot;./a.out&quot;</span>, <span class="string">&quot;rb&quot;</span>);</span><br><span class="line"></span><br><span class="line">    fread(ident, <span class="number">4</span>, <span class="number">1</span>, fp);</span><br><span class="line"></span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;correct: 0x&quot;</span>);</span><br><span class="line">    <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; <span class="number">4</span>; i++) &#123;</span><br><span class="line">        <span class="built_in">printf</span>(<span class="string">&quot;%x&quot;</span>, ident[i]);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;\n&quot;</span>);</span><br><span class="line"></span><br><span class="line">    fclose(fp);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></div></li></ul><h2 id="感慨"><a href="#感慨" class="headerlink" title="感慨"></a>感慨</h2><ul><li><p>C 真是门艰深又麻烦的语言，为了灵活性导致了非常多隐形的复杂度。</p></li><li><p>又或者说，为了更好的，以更底层的方式操作计算机的工作，势必要忍受一些未被封装的复杂度。</p></li></ul>]]>
    </content>
    <id>https://blog.imlast.top/2025/05/14/edian/</id>
    <link href="https://blog.imlast.top/2025/05/14/edian/"/>
    <published>2025-05-14T14:03:05.000Z</published>
    <summary>小端序机器内存变量存储字节序的一种体现</summary>
    <title>记一次小端序内存的实际体现</title>
    <updated>2025-05-14T14:03:05.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>Last</name>
    </author>
    <category term="笔记" scheme="https://blog.imlast.top/categories/%E7%AC%94%E8%AE%B0/"/>
    <category term="c" scheme="https://blog.imlast.top/tags/c/"/>
    <category term="rust" scheme="https://blog.imlast.top/tags/rust/"/>
    <content>
      <![CDATA[<div class="callout callout--titled warning mb-4 rounded-small shadow-redefine-flat bg-(--callout-bg-color) p-3 pl-1 relative flex flex-row gap-2"><div role="none" class="rounded-full self-stretch w-0.5 bg-(--callout-primary-color) shrink-0 opacity-60"></div><div class="flex flex-col gap-2"><div class="callout__title flex items-center gap-2 font-semibold tracking-tight"><i class="callout__icon fa-triangle-exclamation leading-none text-(--callout-primary-color) text-sm shrink-0"></i> Warning</div><div class="callout__content markdown-body flex-1 min-w-0"><p>If someone is reading this blog, please be aware that the writer <strong>did not</strong> consider the experience of the other readers.<br>After all, the most important part is about writing things down for better memorization.</p></div></div></div><h2 id="Memory-Management"><a href="#Memory-Management" class="headerlink" title="Memory Management"></a>Memory Management</h2><h3 id="Ownership-in-C"><a href="#Ownership-in-C" class="headerlink" title="Ownership in C"></a>Ownership in C</h3><ul><li><p>There’s actually no ownership design in C, which means that the language, or more specifically the compiler, does not check anything about ownership, leaving the burden to the programmers.</p></li><li><p>For example, look at the declaration of the function below:</p>  <div class="code-container" data-rel="C"><figure class="iseeu highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * dvb_unregister_frontend() - Unregisters a DVB frontend</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * @fe: pointer to &amp;struct dvb_frontend</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * Stops the frontend kthread, calls dvb_unregister_device() and fress the</span></span><br><span class="line"><span class="comment"> * private frontend data allocated by dvb_unregister_frontend().</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">NOTE:</span> This function doesn&#x27;t free the memory allocated by the demod,</span></span><br><span class="line"><span class="comment"> * by the SEC driver and by the tuner. In order to free it, an explicit call to</span></span><br><span class="line"><span class="comment"> * dvb_frontend_detach() is needed, after calling this function.</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="type">int</span> <span class="title function_">dvb_unregister_frontend</span><span class="params">(<span class="keyword">struct</span> dvb_frontend *fe)</span>;</span><br></pre></td></tr></table></figure></div></li><li><p>Just from the doc comment for this function, you can tell that the memory management process is like messy. Programmers should be cautious when invoking those functions, carefully reading doc comment for each one to understand the ownership implications.</p></li><li><p>Not only that, the memory area pointed to by the pointer taken as a parameter in this function cannot be freed with <code>free()</code>, there’s a specific function called <code>dvb_frontend_detach</code> responsible for destroying that heap-allocated memory.</p></li><li><p>Even worse, the data structure pointed by the pointer might need multiple different functions to free the memory allocated earlier. This can be very complicated and prone to mistakes, leading to memory corruption or memory leak.</p></li></ul><hr><ul><li>As a result, it is really difficult to handle the creation and destruction of heap areas in C manually. It is very common to forget about clearing up memory areas after using them, or dereference pointers pointing to memory areas that have been freed already early on, which would cause a seg fault.</li></ul><h3 id="Ownership-in-Rust"><a href="#Ownership-in-Rust" class="headerlink" title="Ownership in Rust"></a>Ownership in Rust</h3><ul><li><p>Rust addresses this problem with a unique concept: <strong>ownership</strong>.</p><blockquote><p>Ownership is Rust’s most unique feature and has deep implications for the rest of the language. It enables Rust to make memory safety guarantees without needing a garbage collector, so it’s important to understand how ownership works.</p></blockquote></li><li><p>Three ownership rules:</p><ol><li><strong>Each value in Rust has an owner.</strong></li><li><strong>There can only be one owner at a time.</strong></li><li><strong>When the owner goes out of scope, the value will be dropped.</strong></li></ol></li></ul><h3 id="Ownership-with-Rust-Exmaples"><a href="#Ownership-with-Rust-Exmaples" class="headerlink" title="Ownership with Rust Exmaples"></a>Ownership with Rust Exmaples</h3><div class="code-container" data-rel="Rust"><figure class="iseeu highlight rust"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">fn</span> <span class="title function_">log</span>(s: <span class="type">String</span>) &#123;</span><br><span class="line">    <span class="built_in">println!</span>(<span class="string">&quot;&#123;&#125;&quot;</span>, s);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">fn</span> <span class="title function_">main</span>() &#123;</span><br><span class="line">    <span class="keyword">let</span> <span class="variable">s</span> = <span class="type">String</span>::<span class="title function_ invoke__">from</span>(<span class="string">&quot;hello&quot;</span>);</span><br><span class="line">    <span class="title function_ invoke__">log</span>(s);</span><br><span class="line">    <span class="title function_ invoke__">log</span>(s);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></div><ul><li><p>The code above won’t compile. Reason is that the first time we invoke <code>log</code> on <code>s</code>, the function takes the ownership of the string so the second time we call it, <code>s</code> no longer owns the string <code>&quot;hello&quot;</code> anymore.</p></li><li><p>In other words, the memory that stores the string <code>&quot;hello&quot;</code> would have been freed after the first call to <code>log(s)</code>.</p></li><li><p>Here we can see that Rust is trying to make sure that every value is not <code>NULL</code> or <code>None</code> when they are used, in a very strict way. Any manipulation(i.e., borrowing) of the value is treated with caution; hence, the value is often not allowed after such an operation.</p></li><li><p>In C, where the allocation and deallocation of the memory is controlled manually by the programmer, you can free the buffer <code>s</code> anywhere in the code. Either after the first time calling <code>log</code>, or the second time, or even inside the <code>log</code> function(right after printing the string to the standard output). This seems manageable in a simple example like the one above, but you can’t make that promise anymore when the complexity of the code grows. (Reality has proven this.)</p>  <div class="code-container" data-rel="C"><figure class="iseeu highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">void</span> <span class="title function_">log</span><span class="params">(<span class="type">char</span> *s)</span> &#123;</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;%s\n&quot;</span>, s);</span><br><span class="line">    <span class="comment">// free(s); ?</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="type">int</span> <span class="title function_">main</span><span class="params">()</span> &#123;</span><br><span class="line">    <span class="type">char</span> *s = strdup(<span class="string">&quot;hello&quot;</span>);</span><br><span class="line">    <span class="built_in">log</span>(s);</span><br><span class="line">    <span class="comment">// free(s); ?</span></span><br><span class="line">    <span class="built_in">log</span>(s);</span><br><span class="line">    <span class="comment">// free(s); ?</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></div><ul><li>You might encounter <em>use-after-free</em> or <em>double-free</em> issue, or even <em>memory leak</em> if you forget to free the buffer.</li></ul></li></ul><hr><div class="code-container" data-rel="Rust"><figure class="iseeu highlight rust"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">fn</span> <span class="title function_">main</span>() &#123;</span><br><span class="line">    <span class="keyword">let</span> <span class="variable">s</span> = <span class="type">String</span>::<span class="title function_ invoke__">from</span>(<span class="string">&quot;hello&quot;</span>);</span><br><span class="line"></span><br><span class="line">    <span class="keyword">let</span> <span class="variable">s1</span> = &amp;s;</span><br><span class="line">    <span class="keyword">let</span> <span class="variable">s2</span> = &amp;s;</span><br><span class="line"></span><br><span class="line">    <span class="built_in">println!</span>(<span class="string">&quot;&#123;&#125; &#123;&#125; &#123;&#125;&quot;</span>, s, s1, s2);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></div><ul><li><p>This code compiles without error. <code>&amp;</code> stands for <em>borrowing</em> (i.e., referencing), which does not tranfer the ownership from its original owner.</p></li><li><p>However if we change one of the references to a <em>mutable</em> reference, like the way down below:</p>  <div class="code-container" data-rel="Rust"><figure class="iseeu highlight rust"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">let</span> <span class="variable">s1</span> = &amp;<span class="keyword">mut</span> s;</span><br><span class="line"><span class="keyword">let</span> <span class="variable">s2</span> = &amp;s;</span><br></pre></td></tr></table></figure></div></li><li><p>Then it won’t compile. This introduces another rule about borrowing:</p><ul><li><strong>At any given time, you can have either one mutable reference or any number of immutable references.</strong></li></ul></li><li><p>The purpose of this rule is easy to understand: You don’t want the data you’re reading to change unexpectedly. So Rust enforces that only one entity may mutate a value at a time, and during mutation, no other entity may read or write to it. But it’s okay that more than one guy reading from the same value, as long as none of them is modifying it.</p></li></ul><h2 id="Error-Handling"><a href="#Error-Handling" class="headerlink" title="Error Handling"></a>Error Handling</h2><p>TODO</p><h2 id="To-Be-Continued…"><a href="#To-Be-Continued…" class="headerlink" title="To Be Continued…"></a>To Be Continued…</h2>]]>
    </content>
    <id>https://blog.imlast.top/2025/05/01/cs110l-l3/</id>
    <link href="https://blog.imlast.top/2025/05/01/cs110l-l3/"/>
    <published>2025-05-01T09:04:00.000Z</published>
    <summary>The design of ownership and error handling in Rust and why they're needed</summary>
    <title>CS110L L3 - Memory Safety in Rust</title>
    <updated>2025-05-01T09:04:00.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>Last</name>
    </author>
    <category term="笔记" scheme="https://blog.imlast.top/categories/%E7%AC%94%E8%AE%B0/"/>
    <category term="c" scheme="https://blog.imlast.top/tags/c/"/>
    <category term="rust" scheme="https://blog.imlast.top/tags/rust/"/>
    <content>
      <![CDATA[<div class="callout callout--titled warning mb-4 rounded-small shadow-redefine-flat bg-(--callout-bg-color) p-3 pl-1 relative flex flex-row gap-2"><div role="none" class="rounded-full self-stretch w-0.5 bg-(--callout-primary-color) shrink-0 opacity-60"></div><div class="flex flex-col gap-2"><div class="callout__title flex items-center gap-2 font-semibold tracking-tight"><i class="callout__icon fa-triangle-exclamation leading-none text-(--callout-primary-color) text-sm shrink-0"></i> Warning</div><div class="callout__content markdown-body flex-1 min-w-0"><p>If someone is reading this blog, please be aware that the writer <strong>did not</strong> consider the experience of the other readers.<br>After all, the most important part is about writing things down for better memorization.</p></div></div></div><h2 id="Valgrind"><a href="#Valgrind" class="headerlink" title="Valgrind"></a>Valgrind</h2><ul><li><p>Valgrind is an instrumentation framework for building dynamic analysis tools. There are Valgrind tools that can automatically detect many memory management and threading bugs, and profile your programs in detail.</p></li><li><p>The tool does it’s job by modifying some of the assembly code which is assosiated to memory operation, like <code>call malloc</code> or <code>load</code>&#x2F;<code>store</code>, when executing the code.</p></li><li><p>It is doing what we call ‘dynamic analysis’, which is <em>run the program and watch what it does.</em></p></li><li><p>Though it is able to detect heap-based buffer overflows, valgrind cannot detect stack-based buffer overflows, as it does not know the source code of the program and has no idea about the stack layout.</p></li></ul><h2 id="LLVM-Sanitizers"><a href="#LLVM-Sanitizers" class="headerlink" title="LLVM Sanitizers"></a>LLVM Sanitizers</h2><ul><li><p>Instead of instrumenting binary file like Valgrind does, it instruments the source code.</p></li><li><p>There’re several kinds of sanitizers, including memory sanitizer, leak sanitizer, undefined behavior sanitizer and thread sanitizer.</p></li></ul><h2 id="Fundamental-Limitation-of-Dynamic-Analysis"><a href="#Fundamental-Limitation-of-Dynamic-Analysis" class="headerlink" title="Fundamental Limitation of Dynamic Analysis"></a>Fundamental Limitation of Dynamic Analysis</h2><ul><li><p><strong>Dynamic analysis can only report bad behavior that actually happened.</strong></p></li><li><p>The program might crash due to some specific input from the user which is probably not going to show up during the test&#x2F;dynamic analysis.</p></li><li><p>This leads to the fact that, we just can’t find lots of the issues before it happens. There’re just too much possible issues.</p></li></ul><h2 id="Fuzzing-Testing"><a href="#Fuzzing-Testing" class="headerlink" title="Fuzzing Testing"></a>Fuzzing Testing</h2><ul><li><p>A very simple but extremely effective way to find bugs.</p></li><li><p>AFL &amp; libfuzzer</p></li><li><p>Still can not provide any guarantees that a program is bug-free.</p></li></ul><h2 id="Static-Analysis"><a href="#Static-Analysis" class="headerlink" title="Static Analysis"></a>Static Analysis</h2><ul><li><p>Static analyzers could be helpful when finding bugs in the code by doing data-flow analysis. It can detect some edge cases that dynamic analysis might never be able to run into.</p></li><li><p>However, static analyzers can report a lot of false positives, which means that reporting bugs that could only be triggerred theoratically and impossible in real world.</p></li><li><p>Also, tracing every possible control flow could be a very cpu-consuming job.</p></li><li><p>Plus a whole bunch of potential problems. There’re just too many possible issues that exceeds the limit of code analysis.</p></li></ul>]]>
    </content>
    <id>https://blog.imlast.top/2025/04/30/cs110l-l2/</id>
    <link href="https://blog.imlast.top/2025/04/30/cs110l-l2/"/>
    <published>2025-04-30T16:17:00.000Z</published>
    <summary>Some tools and methods used for program analysis, including static/dynamic analysis</summary>
    <title>CS110L L2 - Program Analysis</title>
    <updated>2025-04-30T16:17:00.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>Last</name>
    </author>
    <category term="笔记" scheme="https://blog.imlast.top/categories/%E7%AC%94%E8%AE%B0/"/>
    <category term="c" scheme="https://blog.imlast.top/tags/c/"/>
    <category term="rust" scheme="https://blog.imlast.top/tags/rust/"/>
    <content>
      <![CDATA[<ul><li>Learning Advanced Mathematics is just too boring, I need something interesting.</li></ul><hr><div class="callout callout--titled warning mb-4 rounded-small shadow-redefine-flat bg-(--callout-bg-color) p-3 pl-1 relative flex flex-row gap-2"><div role="none" class="rounded-full self-stretch w-0.5 bg-(--callout-primary-color) shrink-0 opacity-60"></div><div class="flex flex-col gap-2"><div class="callout__title flex items-center gap-2 font-semibold tracking-tight"><i class="callout__icon fa-triangle-exclamation leading-none text-(--callout-primary-color) text-sm shrink-0"></i> Warning</div><div class="callout__content markdown-body flex-1 min-w-0"><p>If someone is reading this blog, please be aware that the writer <strong>did not</strong> consider the experience of the other readers.<br>After all, the most important part is about writing things down for better memorization.</p></div></div></div><h2 id="Why-not-C-C"><a href="#Why-not-C-C" class="headerlink" title="Why not C&#x2F;C++?"></a>Why not C&#x2F;C++?</h2><ul><li><p>Severe security problem could happen if C&#x2F;C++ code is not carefully handled.</p></li><li><p>For example, a classic buffer overflow attack might happen during the runtime of the code below:</p>  <div class="code-container" data-rel="C"><figure class="iseeu highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;stdio.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;string.h&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="type">int</span> <span class="title function_">main</span><span class="params">()</span> &#123;</span><br><span class="line">    <span class="type">char</span> s[<span class="number">100</span>];</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;\nEnter a string: &quot;</span>);</span><br><span class="line">    gets(s);</span><br><span class="line"></span><br><span class="line">    <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; s[i] != <span class="string">&#x27;\0&#x27;</span>; i++) &#123;</span><br><span class="line">        <span class="comment">// ...</span></span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;\nString in Upper Case = %s&quot;</span>, s);</span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></div></li><li><p>The general idea of a buffer overflow attack is to fill the buffer out of its intended size, in which case malicious data could grow from low addresses to high addresses, potentially overriding the return address of the currently executing function.</p></li><li><p>The famous <em>Morris Worm</em> virus took advantage of this ‘feature’ of C, and took down thousands of computers back in 1988.</p></li></ul><hr><ul><li><p>You might argue that well nowadays programmers are aware of those holes, and they would handle their code well that does not involve any of these issues. Or is it that ‘Professional engineers don’t make such silly mistakes’ you might consider.</p></li><li><p>Fact is that countless real-world examples have shown that even the big tech company like Google&#x2F;Microsoft who had invested a lot in security still include many of those ‘simple’ mistakes in their products. Not because they are silly, it’s just that the buffer-overflow issue could happen anywhere and hard to mitigate.</p></li><li><p>See this example below:</p>  <div class="code-container" data-rel="C"><figure class="iseeu highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">char</span> buffer[<span class="number">128</span>];</span><br><span class="line"></span><br><span class="line"><span class="type">int</span> bytesToCopy = packet.length;</span><br><span class="line"><span class="keyword">if</span> (bytesToCopy &lt; <span class="number">128</span>) &#123;</span><br><span class="line">    <span class="built_in">strncpy</span>(buffer, packet.data, bytesToCopy);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></div></li><li><p>At first glance the code is fine, with proper boundary check and using <code>strncpy</code> instead of <code>strcpy</code>.</p></li><li><p>Turns out the problem in this code lies in the type of variable <code>bytesToCopy</code>: <strong>it’s an <code>int</code> type, while <code>strncpy</code>‘s third parameter takes in a <code>size_t</code> type, which is an unsigned integer.</strong> If the attacker transfer a packet with a ‘negative length’, the if-check would pass and strncpy would allow for a <strong>really</strong> large string copy which could eventually overflow the 128-byte buffer created in stack for the packet data.</p></li></ul><h2 id="Why-not-GC-Language"><a href="#Why-not-GC-Language" class="headerlink" title="Why not GC Language?"></a>Why not GC Language?</h2><ul><li><p>Simple reason: <strong>they’re slow.</strong></p></li><li><p>Plus, they’re not necessarily safe as well.</p></li></ul>]]>
    </content>
    <id>https://blog.imlast.top/2025/04/30/cs110l-l1/</id>
    <link href="https://blog.imlast.top/2025/04/30/cs110l-l1/"/>
    <published>2025-04-30T14:20:21.000Z</published>
    <summary>Flaw of the current programming language in perspective of safety</summary>
    <title>CS110L L1 - Safety in System Programming</title>
    <updated>2025-04-30T14:20:21.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>Last</name>
    </author>
    <category term="工具使用" scheme="https://blog.imlast.top/categories/%E5%B7%A5%E5%85%B7%E4%BD%BF%E7%94%A8/"/>
    <category term="embedded development" scheme="https://blog.imlast.top/tags/embedded-development/"/>
    <category term="arduino" scheme="https://blog.imlast.top/tags/arduino/"/>
    <category term="neovim" scheme="https://blog.imlast.top/tags/neovim/"/>
    <category term="LSP" scheme="https://blog.imlast.top/tags/LSP/"/>
    <content>
      <![CDATA[<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><ul><li>毕设选了个嵌入式开发的小项目，不是很想用笨重的 arduino IDE。</li><li>于是浪费了半个下午配置环境……水篇博客，不然这努力岂不是白费了（bushi</li></ul><h2 id="正文"><a href="#正文" class="headerlink" title="正文"></a>正文</h2><h3 id="问题描述"><a href="#问题描述" class="headerlink" title="问题描述"></a>问题描述</h3><ul><li><p>期初我尝试直接使用 <code>Mason</code> 安装 <code>arduino-language-server</code>，但即便按文档要求修改配置后仍然无法正常启动。</p></li><li><p>查阅相关 <a class="link"   href="https://github.com/arduino/arduino-language-server/pull/199#issuecomment-2453517587" >issues&#x2F;PR<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a> 之后发现，问题不在 <code>arduino-language-server</code> 自身，而是将其 integrate 进 Neovim 时所依赖的 <code>go-lsp</code> 上。</p><blockquote><p>The dependency (bugst&#x2F;go-lsp) used by the Arduino language server was updated (its go.mod was bumped to Go 1.22), and its behavior causes the language server to “fail to attach” or “quit” when Neovim v0.10+ attempts to start it. This manifests as errors in the Neovim logs (e.g. errors related to clangd startup and “locked (waiting clangd)”, even though the server may still work despite the warning message).</p></blockquote></li><li><p><a class="link"   href="https://github.com/speelbarrow" >speelbarrow<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a> 将 <code>arduino-language-server</code> 依赖的 <code>go-lsp</code> 更换为了其 patch 过的版本：</p>  <div class="code-container" data-rel="Diff"><figure class="iseeu highlight diff"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">+++ go.mod</span></span><br><span class="line">@@ 32,3 +32,5 @@</span><br><span class="line">    gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect</span><br><span class="line">    gopkg.in/yaml.v3 v3.0.1 // indirect</span><br><span class="line">)</span><br><span class="line"><span class="addition">+</span></span><br><span class="line"><span class="addition">+ replace go.bug.st/lsp =&gt; github.com/speelbarrow/go-lsp v0.1.3-0.20241103164431-cf1c00fb5806</span></span><br></pre></td></tr></table></figure></div></li><li><p>进一步查看其对于 <code>go-lsp</code> 所做的修改：</p>  <div class="code-container" data-rel="Diff"><figure class="iseeu highlight diff"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">--- jsonrpc/jsonrpc_connection.go</span></span><br><span class="line"><span class="comment">+++ jsonrpc/jsonrpc_connection.go</span></span><br><span class="line"><span class="meta">@@ -277,7 +277,7 @@</span> func (c *Connection) SendRequest(ctx context.Context, method string, params json</span><br><span class="line">        _, active := c.activeOutRequests[id]</span><br><span class="line">        c.activeOutRequestsMutex.Unlock()</span><br><span class="line">        if active &#123;</span><br><span class="line"><span class="deletion">-           if notif, err := json.Marshal(CancelParams&#123;ID: encodedId&#125;); err != nil &#123;</span></span><br><span class="line"><span class="addition">+           if notif, err := json.Marshal(CancelParams&#123;ID: encodedID&#125;); err != nil &#123;</span></span><br><span class="line">                       // should never happen</span><br><span class="line">                       panic(&quot;internal error: failed json encoding&quot;)</span><br><span class="line">                  &#125; else &#123;</span><br></pre></td></tr></table></figure></div></li><li><p>原来只是一个类型 typo 错误吗……</p></li></ul><h3 id="解决方案"><a href="#解决方案" class="headerlink" title="解决方案"></a>解决方案</h3><ul><li><p>虽然上文提到的 patch 已经能够使得 <code>arduino-language-server</code> 运行在 neovim v0.10+ 的版本中，但是该 PR 并未被 merge。查看 <code>go-lsp</code> 仓库的 Insights 界面可知：</p><p>  <img src="https://s2.loli.net/2025/02/22/1jNncSWpA6PZkLv.png" alt="screenshot_22022025_114218.jpg"></p></li><li><p><del>很显然这个仓库已经死了。</del></p></li><li><p>仔细看了一下，这个仓库似乎仅仅是为了 <code>arduino-language-server</code> 而 fork 的一个仓库，作者 <a class="link"   href="https://github.com/cmaglie" >cmaglie<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a> 已经很久没有对其进行维护了。</p></li></ul><div class="callout callout--titled warning mb-4 rounded-small shadow-redefine-flat bg-(--callout-bg-color) p-3 pl-1 relative flex flex-row gap-2"><div role="none" class="rounded-full self-stretch w-0.5 bg-(--callout-primary-color) shrink-0 opacity-60"></div><div class="flex flex-col gap-2"><div class="callout__title flex items-center gap-2 font-semibold tracking-tight"><i class="callout__icon fa-clock leading-none text-(--callout-primary-color) text-sm shrink-0"></i> 更新</div><div class="callout__content markdown-body flex-1 min-w-0"><p>cmaglie 于 2025-03-19 合并了该 PR，现在可以直接使用 Mason 安装的 arduino-language-server 了。</p></div></div></div><hr><ul><li><p>尽管如此，办法也还是有的：</p><ul><li><p>将 <a class="link"   href="https://github.com/speelbarrow/arduino-language-server/tree/main" >speelbarrow 的 repo<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a> 克隆到本地：</p>  <div class="code-container" data-rel="Bash"><figure class="iseeu highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">clone</span> https://github.com/speelbarrow/arduino-language-server.git</span><br></pre></td></tr></table></figure></div></li><li><p>手动 build 一个依赖正确 <code>go-lsp</code> 的 <code>arduino-language-server</code>：</p>  <div class="code-container" data-rel="Bash"><figure class="iseeu highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span> arduino-language-server &amp;&amp; go build</span><br></pre></td></tr></table></figure></div></li><li><p>将 Mason 里安装的可执行文件替换为手动构建的 <code>arduino-language-server</code>：</p>  <div class="code-container" data-rel="Bash"><figure class="iseeu highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cp</span> ./arduino-language-server ~/.local/share/nvim/mason/packages/arduino-language-server/arduino-language-server</span><br></pre></td></tr></table></figure></div></li></ul></li></ul><h2 id="配置文件"><a href="#配置文件" class="headerlink" title="配置文件"></a>配置文件</h2><ul><li><p>顺带的，<code>arduino-language-server</code> 的启动需要一些前置步骤以及一些命令行参数。</p></li><li><p>前置步骤详见： <a class="link"   href="https://github.com/neovim/nvim-lspconfig/blob/master/doc/configs.md#arduino_language_server" >lspconfig doc<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a></p></li><li><p>本人开发 ESP32 CAM 所需要的命令行参数如下：</p><p>  <em>astrolsp.lua:</em></p>  <div class="code-container" data-rel="Lua"><figure class="iseeu highlight lua"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line">arduino_language_server = &#123;</span><br><span class="line">    on_new_config = <span class="function"><span class="keyword">function</span><span class="params">(config)</span></span></span><br><span class="line">        <span class="built_in">config</span>.capabilities.textDocument.semanticTokens = vim.NIL</span><br><span class="line">        <span class="built_in">config</span>.capabilities.workspace.semanticTokens = vim.NIL</span><br><span class="line">        <span class="built_in">config</span>.cmd = &#123;</span><br><span class="line">            <span class="string">&quot;arduino-language-server&quot;</span>,</span><br><span class="line">            <span class="string">&quot;-clangd&quot;</span>,</span><br><span class="line">            <span class="string">&quot;/home/last/.local/share/nvim/mason/bin/clangd&quot;</span>,</span><br><span class="line">            <span class="string">&quot;-cli&quot;</span>,</span><br><span class="line">            <span class="string">&quot;/usr/bin/arduino-cli&quot;</span>,</span><br><span class="line">            <span class="string">&quot;-cli-config&quot;</span>,</span><br><span class="line">            <span class="string">&quot;/home/last/.arduino15/arduino-cli.yaml&quot;</span>,</span><br><span class="line">            <span class="string">&quot;-fqbn&quot;</span>,</span><br><span class="line">            <span class="string">&quot;esp32:esp32:esp32cam&quot;</span>,</span><br><span class="line">        &#125;</span><br><span class="line">    <span class="keyword">end</span>,</span><br><span class="line">&#125;,</span><br></pre></td></tr></table></figure></div><p>  <em>注意：该配置仅适用于 AstroNvim 下，且需要使用 Mason 安装 <code>clangd</code></em></p></li></ul><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><ul><li>又是被环境配置折磨的一天。</li><li>这麻烦还是我自己找的，哈哈。</li></ul>]]>
    </content>
    <id>https://blog.imlast.top/2025/02/22/arduino-language-server-on-neovim/</id>
    <link href="https://blog.imlast.top/2025/02/22/arduino-language-server-on-neovim/"/>
    <published>2025-02-22T03:05:34.000Z</published>
    <summary>在 Neovim 中安装并使用 arduino-language-server 时所遇到的问题和解决方案</summary>
    <title>在 Neovim(v0.10+) 上使用 arduino-language-server</title>
    <updated>2025-02-22T03:05:34.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>Last</name>
    </author>
    <category term="笔记" scheme="https://blog.imlast.top/categories/%E7%AC%94%E8%AE%B0/"/>
    <category term="c" scheme="https://blog.imlast.top/tags/c/"/>
    <category term="pa" scheme="https://blog.imlast.top/tags/pa/"/>
    <content>
      <![CDATA[<div class="callout callout--titled warning mb-4 rounded-small shadow-redefine-flat bg-(--callout-bg-color) p-3 pl-1 relative flex flex-row gap-2"><div role="none" class="rounded-full self-stretch w-0.5 bg-(--callout-primary-color) shrink-0 opacity-60"></div><div class="flex flex-col gap-2"><div class="callout__title flex items-center gap-2 font-semibold tracking-tight"><i class="callout__icon fa-triangle-exclamation leading-none text-(--callout-primary-color) text-sm shrink-0"></i> Warning</div><div class="callout__content markdown-body flex-1 min-w-0"><p>If someone is reading this blog, please be aware that the writer <strong>DID NOT</strong> consider the experience of the other readers.<br>After all, the most important thing is about writing things down for better memorization.</p></div></div></div><h2 id="Exception-Handling-Interruption"><a href="#Exception-Handling-Interruption" class="headerlink" title="Exception Handling&#x2F;Interruption"></a>Exception Handling&#x2F;Interruption</h2><ul><li><p>riscv32 uses instruction <code>ecall</code> for self-trapping. Once the cpu recieved an <code>ecall</code> instruction, it would then store the current address pointed by <code>pc</code> to CSR <code>mepc</code> and push its status(context) on to the stack, and jump to an exception handler function.</p></li><li><p>This design is required because of privilege implementation. We want the application’s behavior to be limited, and let the OS do the ‘sensitive’ works, like file read&#x2F;write or memory allocation.</p></li><li><p>See also :</p><blockquote><p>riscv-privileged-20211203.pdf - page.37</p></blockquote></li></ul><h3 id="CSR-Control-and-Status-Register"><a href="#CSR-Control-and-Status-Register" class="headerlink" title="CSR: Control and Status Register"></a>CSR: Control and Status Register</h3><blockquote><p><strong>DeepSeek</strong>: CSRs are special registers in RISC-V processors used to control and monitor the CPU’s operation. They manage system-level functions such as interrupts, exceptions, and processor modes.</p></blockquote><ul><li>Basically, CSRs are registers which stores data related to the control and status of the CPU.</li></ul><hr><ul><li><p>In PA3, we would implement four CSRs for riscv32-nemu, which are:</p><ul><li><code>mepc</code> – <strong>Machine Exception Program Counter</strong>: Stores the address of the instruction where execution should resume after handling an exception or interrupt.</li><li><code>mcause</code> – <strong>Machine Cause Register</strong>: Indicates the reason for an exception or interrupt.</li><li><code>mstatus</code> – <strong>Machine Status Register</strong>: Tracks the processor’s current state, including interrupt enable bits and processor mode.</li><li><code>mtvec</code> – <strong>Machine Trap Vector Base Address Register</strong>: Holds the base address for the exception&#x2F;interruption handler.</li></ul></li><li><p>As we do not care about priviledge mode in PA, <code>mstatus</code> does not require much attention.</p></li><li><p>Also, <code>mtvec</code> is set to ‘direct mode’, which means that all exceptions jump to the same address, which is function <code>__am_asm_trap</code> which we set its address into <code>mtvec</code> in <code>Trap.S</code>(See down below).</p></li></ul><h3 id="Trap-S"><a href="#Trap-S" class="headerlink" title="Trap.S"></a><code>Trap.S</code></h3><ul><li><p>The error handler function is registerred to CSR <code>mtvec</code> when initializing cte module:</p>  <div class="code-container" data-rel="C"><figure class="iseeu highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">bool</span> <span class="title function_">cte_init</span><span class="params">(Context *(*handler)(Event, Context *))</span> &#123;</span><br><span class="line">    <span class="comment">// initialize exception entry</span></span><br><span class="line">    <span class="keyword">asm</span> <span class="title function_">volatile</span><span class="params">(<span class="string">&quot;csrw mtvec, %0&quot;</span> : : <span class="string">&quot;r&quot;</span>(__am_asm_trap))</span>;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// register event handler</span></span><br><span class="line">    user_handler = handler;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></div></li><li><p>In this code snippet, function <code>__am_asm_trap</code> is defined in a file named <code>Trap.S</code>. The reason why it’s written in assembly is that it is an architecture specific script, which means that the way the emulated cpu stores and restores context varies as the architecture varies, and that requires completely differenct implementation.</p></li><li><p>Content in <code>Trap.S</code>:</p>  <div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br></pre></td><td class="code"><pre><span class="line">.align 3</span><br><span class="line">.globl __am_asm_trap</span><br><span class="line">__am_asm_trap:</span><br><span class="line">addi sp, sp, -CONTEXT_SIZE</span><br><span class="line"></span><br><span class="line">MAP(REGS, PUSH)</span><br><span class="line"></span><br><span class="line">csrr t0, mcause</span><br><span class="line">csrr t1, mstatus</span><br><span class="line">csrr t2, mepc</span><br><span class="line"></span><br><span class="line">STORE t0, OFFSET_CAUSE(sp)</span><br><span class="line">STORE t1, OFFSET_STATUS(sp)</span><br><span class="line">STORE t2, OFFSET_EPC(sp)</span><br><span class="line"></span><br><span class="line"># set mstatus.MPRV to pass difftest</span><br><span class="line">li a0, (1 &lt;&lt; 17)</span><br><span class="line">or t1, t1, a0</span><br><span class="line">csrw mstatus, t1</span><br><span class="line"></span><br><span class="line">mv a0, sp</span><br><span class="line">jal __am_irq_handle</span><br><span class="line"></span><br><span class="line">LOAD t1, OFFSET_STATUS(sp)</span><br><span class="line">LOAD t2, OFFSET_EPC(sp)</span><br><span class="line">csrw mstatus, t1</span><br><span class="line">csrw mepc, t2</span><br><span class="line"></span><br><span class="line">MAP(REGS, POP)</span><br><span class="line"></span><br><span class="line">addi sp, sp, CONTEXT_SIZE</span><br><span class="line">mret</span><br></pre></td></tr></table></figure></div></li><li><p>Reading this script really cost me a lot of time, mainly due to its frequent usage of macros.</p></li><li><p>The main behavior of this script is:</p><ul><li>First store all of the data in the registers on stack</li><li>Set CSR registers(<code>mcause</code>, <code>mstatus</code>, <code>mepc</code>)</li><li>Jump to interruption handling function <code>__am_irq_handle</code></li><li>After the handler function returns, restore the registers using the data previously stored on stack</li></ul></li></ul><h3 id="System-Call"><a href="#System-Call" class="headerlink" title="System Call"></a>System Call</h3><ul><li><p>When the application need something to be done by the OS, it would invoke a ‘system call’, which is based on the exception handling&#x2F;interruption mechanism mentioned above.</p></li><li><p>See <code>syscall.c</code> in navy-apps:</p>  <div class="code-container" data-rel="C"><figure class="iseeu highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">intptr_t</span> _syscall_(<span class="type">intptr_t</span> type, <span class="type">intptr_t</span> a0, <span class="type">intptr_t</span> a1, <span class="type">intptr_t</span> a2) &#123;</span><br><span class="line"><span class="keyword">register</span> <span class="type">intptr_t</span> _gpr1 <span class="title function_">asm</span><span class="params">(<span class="string">&quot;a7&quot;</span>)</span> = type;</span><br><span class="line"><span class="keyword">register</span> <span class="type">intptr_t</span> _gpr2 <span class="title function_">asm</span><span class="params">(<span class="string">&quot;a0&quot;</span>)</span> = a0;</span><br><span class="line"><span class="keyword">register</span> <span class="type">intptr_t</span> _gpr3 <span class="title function_">asm</span><span class="params">(<span class="string">&quot;a1&quot;</span>)</span> = a1;</span><br><span class="line"><span class="keyword">register</span> <span class="type">intptr_t</span> _gpr4 <span class="title function_">asm</span><span class="params">(<span class="string">&quot;a2&quot;</span>)</span> = a2;</span><br><span class="line"><span class="keyword">register</span> <span class="type">intptr_t</span> ret <span class="title function_">asm</span><span class="params">(<span class="string">&quot;a0&quot;</span>)</span>;</span><br><span class="line"><span class="keyword">asm</span> <span class="title function_">volatile</span><span class="params">(<span class="string">&quot;ecall&quot;</span></span></span><br><span class="line"><span class="params">            : <span class="string">&quot;=r&quot;</span>(ret)</span></span><br><span class="line"><span class="params">            : <span class="string">&quot;r&quot;</span>(_gpr1), <span class="string">&quot;r&quot;</span>(_gpr2), <span class="string">&quot;r&quot;</span>(_gpr3), <span class="string">&quot;r&quot;</span>(_gpr4))</span>;</span><br><span class="line"><span class="keyword">return</span> ret;</span><br><span class="line"></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></div><p>  <em>(All macros are expanded)</em></p><ul><li><p>Here we can see that a system call is basically executing the <code>ecall</code> instruction plus passing some related data to certain registers, in order to tell the OS what the application requires it to do.</p></li><li><p>The registers taken by riscv32 in an exception handling process are <code>a7</code>, <code>a0</code>, <code>a1</code> and <code>a2</code>.(Specifically, <code>a7</code> register for storing system call type) After the system call is done, the return value is passed to the OS through register <code>a0</code>, and then returned to the user program.</p></li></ul></li></ul><h3 id="The-Entire-Process-of-a-System-Call"><a href="#The-Entire-Process-of-a-System-Call" class="headerlink" title="The Entire Process of a System Call"></a>The Entire Process of a System Call</h3><ul><li>User program invokes a system call, which is by executing assemble instruction <code>ecall</code>.</li><li>NEMU interpret <code>ecall</code> and call function <code>isa_raise_intr</code></li><li><code>isa_raise_intr</code> set <code>mepc</code>, <code>mcause</code> and returns address of the handler function, which is <code>am_irq_handle</code>, NEMU then jump to it.</li><li><code>am_irq_handle</code> create an <code>Event</code> object with the exception NO stored in register <code>a7</code> and pass it to <code>user_handler</code>(if there is one).</li><li>After the user handler function returns, the <code>Context</code> object will be returned in order to restore the context.</li><li>User program resumes.</li></ul><pre class="mermaid">flowchart TD    A[syscall] --> B[isa_raise_intr]    B --> C[__am_asm_trap]    C --> D[__am_irq_handle]    D --> E[user_handler]    E --> F[restore context & resume program]</pre><h2 id="Multi-elf-Support-for-Ftrace"><a href="#Multi-elf-Support-for-Ftrace" class="headerlink" title="Multi-elf Support for Ftrace"></a>Multi-elf Support for Ftrace</h2><h3 id="Implementation"><a href="#Implementation" class="headerlink" title="Implementation"></a>Implementation</h3><ul><li>Since we already have a single-elf ftrace working, changing the variable holding the file path into a linked list would solve the problem.</li></ul><h3 id="start-issue"><a href="#start-issue" class="headerlink" title="_start issue"></a><code>_start</code> issue</h3><ul><li><p>There’s a function called <code>_start</code> in a linking script, located at <code>/libs/libos/src/crt0/start.S</code>. It is not labeled as a function and its size is default to 0.</p>  <div class="code-container" data-rel="C"><figure class="iseeu highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">for</span> (<span class="type">size_t</span> i = <span class="number">0</span>; i &lt; func_table.size; i++) &#123;</span><br><span class="line">    FuncSym curr_func = func_table.funcs[i];</span><br><span class="line">    <span class="keyword">if</span> (addr &gt;= curr_func.value &amp;&amp;</span><br><span class="line">        addr &lt; curr_func.value + curr_func.size) &#123;</span><br><span class="line">        <span class="keyword">return</span> curr_func;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></div></li><li><p>From the code in <code>ftrace</code> we can see that, the jump address must fall into the range of <code>[value, value + size)</code>. While the size of <code>_start</code> is defaulted to 0, ftrace can not find the corresponding symbol when the program invokes <code>_start</code>.</p></li></ul><h2 id="5000-Bytes-8-0K"><a href="#5000-Bytes-8-0K" class="headerlink" title="5000 Bytes == 8.0K ?"></a><code>5000 Bytes == 8.0K</code> ?</h2><ul><li><p>When I was checking the size of the file being taken into <code>fsimg</code>, I encountered a strange thing that:</p>  <div class="code-container" data-rel="Bash"><figure class="iseeu highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">$ <span class="built_in">du</span> -h fsimg/share/files/num</span><br><span class="line">8.0K    fsimg/share/files/num</span><br><span class="line"></span><br><span class="line">$ <span class="built_in">du</span> --bytes fsimg/share/files/num</span><br><span class="line">5000    fsimg/share/files/num</span><br></pre></td></tr></table></figure></div><ul><li><code>du -h</code> shows a <code>8.0K</code> file</li><li><code>du --bytes</code> shows a 5000-byte file</li></ul></li><li><p>The reason is that, <strong>5000 bytes</strong> is the actual content size of the file, while <strong>8.0K</strong> is the disk usage of it.</p></li><li><p>Filesystems allocate space in fixed-size blocks, often 4096 bytes(4K) each. A 5000-byte file needs two blocks <em>(2 x 4096 &#x3D; 8192 bytes)</em>, rounded to 8.0K.</p></li></ul><h2 id="sbrk-Implementation"><a href="#sbrk-Implementation" class="headerlink" title="sbrk Implementation"></a><code>sbrk</code> Implementation</h2><ul><li><p><code>man sbrk</code>:</p><blockquote><p><code>brk()</code> and <code>sbrk()</code> change the location of the program break, which defines the end of the process’s data segment (i.e., the program break is the first location after the end of the uninitialized data segment <em>(.bss)</em> ).<br>Increasing the program break has the effect of allocating memory to the process; decreasing the break deallocates memory.<br>…<br><code>sbrk()</code> increments the program’s data space by <em>increment</em> bytes. Calling <code>sbrk()</code> with an <em>increment</em> of 0 can be used to find the current location of the program break.</p></blockquote></li><li><p>We will need a symbol <code>end</code> to get the initial memory address of <em>program break</em>.</p></li><li><p><code>man end</code>:</p><blockquote><p><strong>end</strong>: This is the first address past the end of the uninitialized data segment (also known as the BSS segment)</p></blockquote><ul><li><p>We can get the address this way:</p>  <div class="code-container" data-rel="C"><figure class="iseeu highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;stdio.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;stdlib.h&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="keyword">extern</span> <span class="type">char</span> end; <span class="comment">/* The symbol must have some type,</span></span><br><span class="line"><span class="comment">                    or &quot;gcc -Wall&quot; complains */</span></span><br><span class="line"></span><br><span class="line"><span class="type">int</span> <span class="title function_">main</span><span class="params">(<span class="type">void</span>)</span> &#123;</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;First address past:\n&quot;</span>);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;    uninitialized data (end)  %10p\n&quot;</span>, &amp;end);</span><br><span class="line"></span><br><span class="line">    <span class="built_in">exit</span>(EXIT_SUCCESS);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></div></li></ul></li></ul><hr><ul><li><p>When <code>sbrk</code> is invoked by lib functions, it would invoke a system call called <code>SYS_brk</code>, which is basically requesting the OS for <code>increment</code> bytes of memory section.</p></li><li><p>As nanos-lite is now only a single-program OS, all of the free memory is allocatable to the program, so the system call handler in nanos-lite for <code>SYS_brk</code> would just return 0 for now.</p></li><li><p>As for <code>syscall.c</code> in navy-apps, <code>_sbrk</code> need to maintain the program break. Specifically, it is required to update pbreak at each time it is invoked, and return the pointer to the old program break.</p></li></ul><h2 id="File-System"><a href="#File-System" class="headerlink" title="File System"></a>File System</h2><ul><li><p>File system in nanos-lite is a simplified version of real-world fs. Specifically:</p><ul><li>The size of each file is fixed</li><li>Data written into the file is not allowed to exceed its initial limit</li><li>The number of files is fixed, meaning that we can not create new files</li><li>There’s no directoy</li></ul></li><li><p>These design makes the implementation of file system for nanos-lite much more simpler and easier.</p></li></ul><hr><ul><li><p>The abstraction of the files is an array which contains all of the file names stored in <code>fsimg</code>. <em>(file names contains the path)</em></p></li><li><p>The way to achieve this is by executing the script written in <code>Makefile</code> along with some preset files such as <code>stdin</code> &amp; <code>stdout</code>.</p></li><li><p>The file list array is defined in <code>fs.c</code>:</p>  <div class="code-container" data-rel="C"><figure class="iseeu highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">struct</span> &#123;</span></span><br><span class="line">    <span class="type">char</span> *name;</span><br><span class="line">    <span class="type">size_t</span> size;</span><br><span class="line">    <span class="type">size_t</span> disk_offset;</span><br><span class="line">    ReadFn read;</span><br><span class="line">    WriteFn write;</span><br><span class="line">&#125; Finfo;</span><br><span class="line"></span><br><span class="line"><span class="comment">/* This is the information about all files in disk. */</span></span><br><span class="line"><span class="type">static</span> Finfo file_table[] __attribute__((used)) = &#123;</span><br><span class="line">    [FD_STDIN] = &#123;<span class="string">&quot;stdin&quot;</span>, <span class="number">-1</span>, <span class="number">0</span>, invalid_read, invalid_write&#125;,</span><br><span class="line">    [FD_STDOUT] = &#123;<span class="string">&quot;stdout&quot;</span>, <span class="number">-1</span>, <span class="number">0</span>, invalid_read, serial_write&#125;,</span><br><span class="line">    [FD_STDERR] = &#123;<span class="string">&quot;stderr&quot;</span>, <span class="number">-1</span>, <span class="number">0</span>, invalid_read, serial_write&#125;,</span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&quot;files.h&quot;</span></span></span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure></div><ul><li><p><code>files.h</code> is generated by navy-apps’s Makefile:</p>  <div class="code-container" data-rel="Makefile"><figure class="iseeu highlight makefile"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable">$(RAMDISK)</span>: fsimg</span><br><span class="line">    <span class="variable">$(<span class="built_in">eval</span> FSIMG_FILES := $(<span class="built_in">shell</span> find -L ./fsimg -type f)</span>)</span><br><span class="line">    @mkdir -p $(@D)</span><br><span class="line">    @cat <span class="variable">$(FSIMG_FILES)</span> &gt; <span class="variable">$@</span></span><br><span class="line">    @truncate -s \%512 <span class="variable">$@</span></span><br><span class="line">    @echo <span class="string">&quot;// file path, file size, offset in disk&quot;</span> &gt; <span class="variable">$(RAMDISK_H)</span></span><br><span class="line">    @wc -c <span class="variable">$(FSIMG_FILES)</span></span><br><span class="line">        | grep -v &#x27;total$$&#x27;</span><br><span class="line">        | sed -e &#x27;s+ ./fsimg+ +&#x27;</span><br><span class="line">        | awk -v sum=0 &#x27;&#123;print <span class="string">&quot;\x7b\x22&quot;</span> $$2 <span class="string">&quot;\x22\x2c &quot;</span> $$1 <span class="string">&quot;\x2c &quot;</span> sum <span class="string">&quot;\x7d\x2c&quot;</span>;sum += $$1&#125;&#x27; &gt;&gt; <span class="variable">$(RAMDISK_H)</span></span><br></pre></td></tr></table></figure></div></li></ul></li><li><p>The last two element of <code>Finfo</code> is the ‘read’ and ‘write’ function for that specific file.</p></li></ul><hr><ul><li><p>Noted that, we treat <code>stdin</code>, <code>stdout</code> and <code>stderr</code> as files. This is what the statement ‘Everything is a file’ in Linux means: <strong>the system components – including hardware devices, directories, and processes – are represented as files in the filesystem.</strong></p></li><li><p>This design simplifies interaction with system resources because they can be accessed, read, and written using standard file operations (e.g., <code>open</code>, <code>read</code>, <code>write</code>).</p></li><li><p>With a function pointer set to each file’s struct object, we would only need to call it in <code>fs_read</code> &amp; <code>fs_write</code>.</p></li></ul><h2 id="Compound-Literal-Issue"><a href="#Compound-Literal-Issue" class="headerlink" title="Compound Literal Issue"></a>Compound Literal Issue</h2><ul><li><p>When I was implementing some SDL apis, I encountered yet another subtle issue: defining and retreating the pointer of a compound literal struct object.</p></li><li><p>Here’s the initial code:</p>  <div class="code-container" data-rel="C"><figure class="iseeu highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">if</span> (srcrect == <span class="literal">NULL</span>)</span><br><span class="line">    srcrect = &amp;((SDL_Rect)&#123;.x = <span class="number">0</span>, .y = <span class="number">0</span>, .w = src-&gt;w, .h = src-&gt;h&#125;);</span><br></pre></td></tr></table></figure></div></li><li><p>Turns out that <code>(SDL_Rect)&#123;...&#125;</code> creates a temporary SDL_Rect object <strong>inside the if block</strong>. After the if statement ends, the temporary object disappears (goes out of scope).</p></li><li><p>As a result, <code>srcrect</code> now holds a dangling pointer (an invalid memory address). Undefined behavior occurs when you try to use srcrect.</p></li></ul><hr><ul><li><p>To fix this, we would need a persistent object:</p>  <div class="code-container" data-rel="C"><figure class="iseeu highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">SDL_Rect full_src = &#123;.x = <span class="number">0</span>, .y = <span class="number">0</span>, .w = src-&gt;w, .h = src-&gt;h&#125;;</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (!srcrect) srcrect = &amp;full_src;</span><br></pre></td></tr></table></figure></div></li><li><p>This way, <code>full_src</code> is defined in the function’s scope, so it will live until the function returns.</p></li></ul><h2 id="Pixel-Value-Conversion-Palette"><a href="#Pixel-Value-Conversion-Palette" class="headerlink" title="Pixel Value Conversion: Palette"></a>Pixel Value Conversion: Palette</h2><ul><li><p>In PAL, the value of each pixel is 8-bit in length, and is not representing the color of that pixel. Instead, it is an index to a palette. We would need to convert that index to a 32-bit color value when rendering the rectangle.</p></li><li><p>One thing worth mentioning is that, <code>SDL_Color-&gt;val</code> is not the target color value. The format of it does not match <code>AARRGGBB</code>, so we’ll have to manually set the bit of the pixel data:</p>  <div class="code-container" data-rel="C"><figure class="iseeu highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; h; i++) &#123;</span><br><span class="line">    <span class="keyword">for</span> (<span class="type">int</span> j = <span class="number">0</span>; j &lt; w; j++) &#123;</span><br><span class="line">        <span class="type">uint8_t</span> idx = read_ptr[j];</span><br><span class="line">        buf[i * w + j] = (colors[idx].a &lt;&lt; <span class="number">24</span>) | (colors[idx].r &lt;&lt; <span class="number">16</span>) |</span><br><span class="line">                            (colors[idx].g &lt;&lt; <span class="number">8</span>) | (colors[idx].b);</span><br><span class="line">    &#125;</span><br><span class="line">    read_ptr += s-&gt;pitch;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></div></li></ul><h2 id="A-Way-of-Passing-Graphic-Parameter-Through-Standard-File-Operation"><a href="#A-Way-of-Passing-Graphic-Parameter-Through-Standard-File-Operation" class="headerlink" title="A Way of Passing Graphic Parameter Through Standard File Operation"></a>A Way of Passing Graphic Parameter Through Standard File Operation</h2><ul><li><p>In NDL, the api responsible for drawing rectangle is like this:</p>  <div class="code-container" data-rel="C"><figure class="iseeu highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">void</span> <span class="title function_">NDL_DrawRect</span><span class="params">(<span class="type">uint32_t</span> *pixels, <span class="type">int</span> x, <span class="type">int</span> y, <span class="type">int</span> w, <span class="type">int</span> h)</span>;</span><br></pre></td></tr></table></figure></div></li><li><p>This brings up an issue: <code>write</code> only accept three paramters, while the first of them is the file descriptor. That means, we would need to pass four parameters to a function which could only accept two parameters.</p></li><li><p>There’re two ways to solve this that I came up with:</p><ol><li>invoke <code>write</code> for each line of the rectangle</li><li>write all of the empty pixels as well</li></ol></li><li><p>After asking Deepseek, it recommended another way of achieving this: <strong>store <code>x</code> and <code>y</code> in the first 8 bytes of <code>pixels</code>.</strong></p></li><li><p>Though the top-left corner of the image presented might be a little bit stange, the trade-off for better performance is worthy.</p></li></ul><hr><ul><li>The most affected application is <code>typing-game</code>, cuz the program would draw a rectangle for each dropping letter.</li></ul><h2 id="To-Be-Continued…"><a href="#To-Be-Continued…" class="headerlink" title="To Be Continued…"></a>To Be Continued…</h2><div class="callout callout--titled info mb-4 rounded-small shadow-redefine-flat bg-(--callout-bg-color) p-3 pl-1 relative flex flex-row gap-2"><div role="none" class="rounded-full self-stretch w-0.5 bg-(--callout-primary-color) shrink-0 opacity-60"></div><div class="flex flex-col gap-2"><div class="callout__title flex items-center gap-2 font-semibold tracking-tight"><i class="callout__icon fa-face-sad-cry leading-none text-(--callout-primary-color) text-sm shrink-0"></i> Suspend</div><div class="callout__content markdown-body flex-1 min-w-0"><p>Gotta prepare for the master entrance examination :(</p></div></div></div>]]>
    </content>
    <id>https://blog.imlast.top/2025/02/10/nju-pa-3/</id>
    <link href="https://blog.imlast.top/2025/02/10/nju-pa-3/"/>
    <published>2025-02-10T12:00:00.000Z</published>
    <summary>exception handling, system calls, file system, and directmedia layer implementation</summary>
    <title>PA3 - Batch Processing System</title>
    <updated>2025-02-10T12:00:00.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>Last</name>
    </author>
    <category term="随笔" scheme="https://blog.imlast.top/categories/%E9%9A%8F%E7%AC%94/"/>
    <content>
      <![CDATA[<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><ul><li>2024 就这么结束了。我的心中一片茫然。</li><li>时间既没有停歇也没有加速，是我的感官模糊了，它们被分散到了其他地方。</li><li>只要目光不盯紧钟表的指针，它们就疯狂地转动不停。</li></ul><h2 id="2024-年"><a href="#2024-年" class="headerlink" title="2024 年"></a>2024 年</h2><h3 id="硬件更新"><a href="#硬件更新" class="headerlink" title="硬件更新"></a>硬件更新</h3><h4 id="手机"><a href="#手机" class="headerlink" title="手机"></a>手机</h4><ul><li><p>我这用了四年的 iPhone 11 终于是可以退役了。经过接连几次的系统更新之后他已经卡的让人无法接受了。</p></li><li><p>本人此前用过的两部手机都是 iPhone（8，11），对于苹果已经积攒了十足的怨气。其在硬件上的吝啬，技术上的不思进取和坐地起价的蛮横态度属实让我气愤不已的同时感到匪夷所思。类似于 NFC 和屏下指纹这样简单好用的功能迟迟不出，高分和高刷屏被价格高昂的 pro 型号独占，简直是把“赚钱”二字写在脸上了。</p></li><li><p>被其粉丝吹捧的 IOS 系统更是让我感到恶心不已。究其原因，以下几点：</p><ul><li>系统封闭。想安装什么软件还得看 App Store 里有没有。侧载安装每周都需要链接电脑刷新签名，无言了。</li><li>卡顿。四年前该手机刚入手的时候系统流畅度确实无可挑剔，然而在接连几次系统更新之后不知怎的越来越卡。对于计划报废这些说辞我不置可否，但是卡顿的系统着实让我感到非常恶心。</li><li>微信同步消息简直慢的让人不可置信。每次打开微信都需要等待 5s 以上的时间等待消息同步，我简直无法理解。询问旁人后得知，这就是 IOS 独有的问题。</li></ul></li><li><p>如今终于可以摆脱这恶心的品牌，快哉快哉！</p></li></ul><hr><ul><li>新手机是一部 One Plus Ace3v。由于我不需要玩手游也没有拍照需求，对于手机的要求仅仅就是个即时通讯器而已。再加之对于苹果长久以来各种毛病的怨气，我选择了一款价格便宜的安卓系统手机。</li><li>从 5 月份一直用到现在，说实话体验相当良好。2k 屏，高刷，NFC，屏下指纹以及应用分身。这些在苹果那里倘若不买价格 1w+ 的 pro 型号，通通没有。</li></ul><hr><ul><li><p>当然，购买该平牌手机还有一个原因就是 root 方便，甚至还有一加盒子这样的社区工具，好评。</p></li><li><p>依稀记得本人一开始 root 的时候一股脑安装了许多模块，大概是其中某个模块发生问题，导致手机无法开机，也就是俗称的“变砖”。好在提前安装了一个“自动救砖”的模块，重启三次之后自动隔离了其他模块，算是有惊无险。</p></li><li><p>说实在的，本人对于刷 root 权限这件事其实也没有那么执着，仅仅是抱着“玩一玩”的心态去尝试的。对于各家厂商纷纷停止向用户开放 root 权限，我其实是可以理解的。毕竟，开屏广告没了的话，广告收入会削减不少。以及所谓的“用户数据也是手机厂商宝贵的资产”。</p></li><li><p>当然，理解归理解，该骂还是要骂。资本的最终目的还是为了增值。</p></li></ul><h4 id="电脑"><a href="#电脑" class="headerlink" title="电脑"></a>电脑</h4><ul><li><p>五月份又拜托 Jazz 哥，在旧台式的基础上翻新配置组了台新机器。配置是 AMD R7 5700x 和 AMD 6750 GRE 12g，迈出了逃离 N 卡的第一步，好！也是得益于此，后续我再次 <a href="https://blog.imlast.top/2024/12/18/2nd-hyprland/">折腾 Hyprland</a> 的体验好了不少，也是给我用上 Hyprland 了（喜）。</p></li><li><p>当然，选择 AMD 的考量主要还是在于性价比。N 卡借助人工智能领域飞黄腾达之后，连带着价格也跟着水涨船高。在我发现一张 N 卡的价格要占到整机预算的 50% 以上之后，就再也不想考虑 N 卡了。</p></li><li><p>换了台式之后最大的感受不是性能的提升，而是骤减的散热压力。再也不会像曾今用笔记本时那样，cpu 动不动就涨到 90°C 了。</p></li><li><p>顺带的换了个鼠标。随便挑了一个国产的牌子，不曾想该鼠标续航能力简直惊人——充一次电能用将近两个月，属实令我惊讶不已。</p></li></ul><h4 id="Neo-Ergo"><a href="#Neo-Ergo" class="headerlink" title="Neo Ergo"></a>Neo Ergo</h4><ul><li>购买了一把 Alice 布局的客制化键盘。阳极银、紫镜面配重。ALU 定位板，无绵 Gasket。轴体选了紫薇轴，我很喜欢这种脆响的声音。键帽是随便选的一套植物园配色。</li></ul><p><img src="https://s2.loli.net/2025/01/01/rQSlRhGBPKeaDkN.jpg" alt="neo-ergo.jpg"></p><ul><li>使用体验相当优秀，声音也很令我满意。把底绵和夹心绵卸下之后，声音的脆响程度又上了一层楼，甚好，甚好。</li></ul><h3 id="开源之夏"><a href="#开源之夏" class="headerlink" title="开源之夏"></a>开源之夏</h3><ul><li>今年暑假参加了<a class="link"   href="https://summer-ospp.ac.cn/" >开源之夏<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a>（OSPP）活动，具体内容是为 <a class="link"   href="https://github.com/emqx/MQTTX" >MQTTX<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a> 添加 AVRO 编码支持。</li><li>说实话，在挑选项目的时候我对自己有些过于不自信了，这个项目对我而言似乎是有点太过简单了……总共花在上面的时间恐怕不足三个星期，其中的大部分时间还都是花在沟通上，技术上可以说没遇到任何难题。</li><li>项目导师可以说十分尽职尽责，事无巨细的解答了我对于项目许多的问题：<a href="https://blog.imlast.top/tags/mqttx/">相关博客</a></li><li>开发工作完成后导师还邀请我加入了 GitHub 上 emqx 的组织，可惜此后我拿不出那么多时间就继续开发该项目，总感觉有些对不起导师。不过在如今潦草的经济大环境下，他应该能理解我。</li></ul><h3 id="Hyprland"><a href="#Hyprland" class="headerlink" title="Hyprland"></a>Hyprland</h3><ul><li>也是给我用上 Hyprland 了。经过重重险阻解决了大部分 BUG，详见 <a href="https://blog.imlast.top/2024/12/18/2nd-hyprland/">这篇博客</a>。</li></ul><p><img src="https://s2.loli.net/2024/12/29/kI57gHsNOZinFcu.png" alt="screenshot_29122024_052933.jpg"></p><h3 id="南京大学-ICS"><a href="#南京大学-ICS" class="headerlink" title="南京大学 ICS"></a>南京大学 ICS</h3><ul><li><p>上半年学期末考试之前，因为懒得复习所以找了点别的事情干。依稀记起此前群友有推荐过这个课程，便找来讲义想着体验一番。 哪成想一下陷入其中，断断续续的一直写到了 PA3。</p></li><li><p>这门课可以说是刚好处在我能力边缘的位置——努努力就可以达到其中的要求，在这个过程中还能学到不少计算机系统的运作原理。长时间阅读文档和 DE 后终于调通了某个功能之后，那种喜悦能让我感觉自己至今为止的努力都没有白费。</p></li><li><p>虽然用了一种很“俗套”的说法，但是那一瞬间的感触确实如是。</p></li></ul><hr><ul><li>完成 PA2 结尾处选做任务声卡后录的纪念视频：</li></ul><iframe width="100%" height="468" src="//player.bilibili.com/player.html?isOutside=true&aid=113527444544674&bvid=BV1KtBBYXETA&cid=26903250566&p=1&autoplay=0" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true"></iframe><h3 id="服务器"><a href="#服务器" class="headerlink" title="服务器"></a>服务器</h3><ul><li>去年租的服务器到期了，第二年续期的费用居然高达接近 1k。记得当时租用一年的费用也不过 100 左右，果然优惠只有新客户才能享受，老客户和狗不得入内。</li><li>在各种主机类的博文中翻来找去，找到一个野草云的半价优惠码。于是浏览了一遍各型号的配置，租了一台 2C4G 的 HK 服务器，费用 ¥150 &#x2F; 年。</li></ul><hr><ul><li>由于懒惰和拖延，直到前一个服务器临近过期我才开始迁移上面的服务和配置。由于匆忙，遗漏了许多配置文件，最终这些破事全都加倍返还了回来……</li><li>另外不知为何，部署在这台服务器上的 Twikoo 后端导致博文中加载评论奇慢无比。但是我已经不愿意再为此付出时间精力了，能用就行吧。</li></ul><h3 id="学校"><a href="#学校" class="headerlink" title="学校"></a>学校</h3><h4 id="辅修专业的毕业设计"><a href="#辅修专业的毕业设计" class="headerlink" title="辅修专业的毕业设计"></a>辅修专业的毕业设计</h4><ul><li>24 年上半年，辅修计算机专业迎来了最后的毕业设计环节。</li><li>分配给我的指导老师实在是让我感觉无语至极，其漫不经心的态度和极差的沟通能力让我数次接近于失去耐心。整个毕业设计的项目源码总共就花了不到两个星期的时间，后面由于沟通不畅导致格式问题愣是修改了一个多月。</li><li>论文工作和家事交织在一起，这个两个月耗干了我所有的心性和精力。我不认为在这种情况下我还能拿出复习考研的精力了，那时候我只想着休息。</li><li>和指导老师沟通后，他为我宽限了一些论文的截止日期。看在这份上，我还是配合了他的工作和修改意见，尽管数次被气的喘不上气。</li></ul><h4 id="恼人的论文课"><a href="#恼人的论文课" class="headerlink" title="恼人的论文课"></a>恼人的论文课</h4><ul><li><p>主专业论文开题在即，或许是为此前被退回的论文感到警醒，学校安排所有学院都添加了一门论文课。</p></li><li><p>我们学院安排了一位经管专业的晋洪涛老师为我们授课。实话实说，这门课简直是一坨屎：</p><ul><li><p>前四周的课都在讲如何为论文拟题，最后发现论文的题目是由指导老师拟定的。</p></li><li><p>所有的范例和论文结构讲解都只适用于经管领域的论文，与我们信管可以说是毫不相干，毫无帮助。</p></li><li><p>该老师简直是精神病，排在大四——许多同学都有升学和实习安排的时期——的课程，愣是想尽办法的提升出勤率：</p><ul><li>旷课代价是平时分 -30，连请假都要扣分</li><li>每节课都有不定次数，不定时间的签到</li><li>每次签到都附带题目，甚至有用于验证的题目</li><li>连已经出国留学（预科）的同学他都不予容忍，硬是逼得同学回国来上课</li></ul></li><li><p>该课程的作业和期末考核可以说是毫无意义：</p><ul><li>论文的具体内容涉及计算机领域的知识，这位经管出身的老师显然是无能为力。</li><li>计算机专业的毕业设计论文结构基本固定，完全不需要加以额外指导。</li></ul></li><li><p><em>虽然现在还没到学期末，不过可想而知最终的期末成绩不可能太好看。</em></p></li></ul></li></ul><hr><ul><li><p>综上所述，我完全无法理解这门课的意义何在——该课程既没有提供有价值的知识，反而还极为注重诸如考勤和作业格式之类的形式要求。</p></li><li><p>学期中的时候我便实在无法忍受，去找辅导员攀谈，得到的结果也仅仅是“可以向学校提出意见”。</p></li><li><p>这位老师让我想起在 <a class="link"   href="https://survivesjtu.gitbook.io/survivesjtumanual" >上海交通大学生存手册<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a> 看到的一则观点：</p><blockquote><p>…… 我们关注是否点名，重点应该看的是这个老师面对学生的态度。有的老师睁一只眼闭一只眼，即使不来上课，也不会太为难学生。**而另外一些比较自卑的老师却把学生不来上课当成对自己的奇耻大辱，甚至会想出课前课后点两次名外加数人头这样的手段防止学生翘课。**其实，如果老师想不计代价查出谁没来上课，这真的是太简单的一件事情。</p></blockquote></li><li><p>这位晋洪涛老师算是让我见识到什么才是大学里最畜生、最恶心的老师，令人作呕。</p></li></ul><h4 id="小组作业"><a href="#小组作业" class="headerlink" title="小组作业"></a>小组作业</h4><ul><li><p>最后一学期的一门信息系统课程，其主要的课程目标是安排我们以小班（25 人左右）为单位，其中每个小班分为 6 个小组，设计并开发一个完整的网页应用。</p></li><li><p>且不提这门课程提供的分工方式如何逆天，我想，只要是经历过小组作业的人都能预想到这将会是怎样的“盛况”，更不要提在我们这个不学无术的学校和学院。</p></li><li><p>同级其他班的绝大部分小组都选择了外包，对此我丝毫没有感到意外。 真正令我感到瞠目结舌的是，居然有人连外包都整不明白？而且很不幸，这一组人就出现在我们小班之中，担任着前端开发的要职。</p></li></ul><hr><ul><li><p>这一组的同学先是外包了一份和第一组递交的设计稿毫不相关的前端网页，在后续的小组提醒之后他们才又递交了一份新的。然而，这份新的前端网页也同样和设计稿毫无交集……</p></li><li><p>就这么扯皮到了 Milestone 2 的提交节点，后续流程中的小组不得以将情况告知了课程老师，最终老师的方案是额外给我们班开个线上会议帮助解决进度问题。</p></li><li><p>谁成想，前端组居然干脆直接缺席线上会议，而且还缺席了两次，其中第二次还有人专门去通知其组长开会。最后外教老师不得以在线下授课期间为了我们小班单独开会解决问题，会上后三组的同学连外教老师说的话都听不懂，这给予了我极大的震撼……</p></li><li><p>最终，我帮助他们拟定了开发计划和时间节点，外教老师为我们小班延期了 2 周 ddl。</p></li><li><p>毫不意外的，最后他们做了一坨屎出来。前端组找的外包用现成的博客框架改了一个网站出来，简直蠢的让人无话可说。更不要提后端开发组使用了已经老掉牙的 PHP 开发，对此我已经无话可说了。</p></li><li><p>早早完成任务的第一组中一位已经保研的同学还曾忧心忡忡的来询问我具体的进度，说这是他第一次担心会在学校课程中挂科。这太荒唐了，简直令我捧腹大笑。</p></li></ul><hr><ul><li>说真的，这个项目可以说是一点难度都没有。现在互联网应用的开发门槛已经非常低了，毫不夸张的说，让我独自一人开发都要不了两个星期。</li><li>至于我的同学们是如何落得如此地步，我只能说可能这就是普通高校的现状吧。</li></ul><hr><ul><li>在我还住在学校里的时候，前端组的组长住在隔壁宿舍。我对他的印象基本上就是一个家境富裕但生活“难以自理”的家伙。</li><li>依稀记得在大一的时候曾在某门通识课就和他在同一组，大一的他和现在可以说是同一副德行：那时候他忙着物色女孩，小组作业分工到他头上的工作一直到截止之前都未能完成。至于这一次他到底在忙些什么，我就无从得知了。</li><li>我没法理解是什么经历促成了他这样对他人漠不关心的性格，以及对学习接近于零的热情。对于他我已经不想说什么“应试教育摧毁了学生的精神”之类的话了，或许他在其他的领域能够有所建树吧。</li></ul><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><ul><li><p>2024 年就像一阵风一样转瞬即逝，正如同在去年的年终总结中写下的， <em>对于时光荏苒的感慨都已经是家常便饭了</em> 。</p></li><li><p>2024 是苦难和解脱的一年，布满了独属于我这个年龄与这个时代的焦虑和迷茫。</p></li><li><p>在这样荒蛮又虚无的世界里，我要成为谁？</p></li></ul>]]>
    </content>
    <id>https://blog.imlast.top/2024/12/30/2024-Summary/</id>
    <link href="https://blog.imlast.top/2024/12/30/2024-Summary/"/>
    <published>2024-12-30T14:17:00.000Z</published>
    <summary>在这稳步下沉的大船上度过又一个荒废的地球年</summary>
    <title>2024 年终总结</title>
    <updated>2024-12-30T14:17:00.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>Last</name>
    </author>
    <category term="开发记录" scheme="https://blog.imlast.top/categories/%E5%BC%80%E5%8F%91%E8%AE%B0%E5%BD%95/"/>
    <category term="python" scheme="https://blog.imlast.top/tags/python/"/>
    <category term="selenium" scheme="https://blog.imlast.top/tags/selenium/"/>
    <category term="web crawler" scheme="https://blog.imlast.top/tags/web-crawler/"/>
    <category term="netease music" scheme="https://blog.imlast.top/tags/netease-music/"/>
    <content>
      <![CDATA[<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><ul><li><p>今日突然在一个 A 科群里发现群友正在用一个机器人玩猜歌名的游戏(Arcaea 开字母)，如下图：</p><p><img src="https://s2.loli.net/2024/12/21/dtQi3T1UjWlXv6b.png" alt="screenshot_21122024_030422.jpg"></p></li><li><p>本古董 A 科玩家已经退坑了四年，最近回坑看着这多出来的几百首新曲实在是无能为力<del>（南村群童欺我老无力）</del>，于是想着能不能写一个 Python 程序帮助我匹配。（绝不是想要作弊</p></li></ul><h2 id="正文"><a href="#正文" class="headerlink" title="正文"></a>正文</h2><h3 id="爬虫"><a href="#爬虫" class="headerlink" title="爬虫"></a>爬虫</h3><ul><li><p>想要做到匹配曲名，首先当然是需要有一个完整的曲名库作为数据源。我首先想到的方法是爬取 <a class="link"   href="https://arcaea.fandom.com/wiki/Songs_by_Date" >Arcaea Fandom - Songs by Date<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a> 页面中的曲名。尝试后发现，该页面的 HTML 组织稍有混乱，难以匹配所有的曲目。</p></li><li><p>具体来说，该页面中包含了曲目名称的 HTML 元素是这样的：</p><div class="code-container" data-rel="Html"><figure class="iseeu highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">a</span> <span class="attr">href</span>=<span class="string">&quot;/wiki/Memory_Forest&quot;</span> <span class="attr">title</span>=<span class="string">&quot;Memory Forest&quot;</span>&gt;</span>Memory Forest<span class="tag">&lt;/<span class="name">a</span>&gt;</span></span><br></pre></td></tr></table></figure></div><ul><li><p>于是我尝试用以下代码来匹配它：</p><div class="code-container" data-rel="Python"><figure class="iseeu highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">a_tags = soup.find_all(<span class="string">&quot;a&quot;</span>, href=re.<span class="built_in">compile</span>(<span class="string">r&quot;^/wiki/&quot;</span>), title=<span class="literal">True</span>)</span><br><span class="line"><span class="keyword">for</span> a_tag <span class="keyword">in</span> a_tags:</span><br><span class="line">    title_value = a_tag[<span class="string">&quot;title&quot;</span>]</span><br><span class="line">    song_title = a_tag.text.strip()</span><br><span class="line">    <span class="keyword">if</span> (</span><br><span class="line">        song_title.lower() == title_value.lower()</span><br><span class="line">        <span class="keyword">and</span> song_title <span class="keyword">not</span> <span class="keyword">in</span> false_titles</span><br><span class="line">        <span class="keyword">and</span> song_title <span class="keyword">not</span> <span class="keyword">in</span> songs</span><br><span class="line">    ):</span><br><span class="line">        songs.append(a_tag.text)</span><br></pre></td></tr></table></figure></div></li><li><p>很快我就发现，有些曲目的 HTML 源码并不能被匹配到，例如：</p><div class="code-container" data-rel="Html"><figure class="iseeu highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">a</span> <span class="attr">href</span>=<span class="string">&quot;/wiki/%CE%9C&quot;</span> <span class="attr">title</span>=<span class="string">&quot;Μ&quot;</span>&gt;</span>µ<span class="tag">&lt;/<span class="name">a</span>&gt;</span></span><br><span class="line">...</span><br><span class="line"><span class="tag">&lt;<span class="name">a</span> <span class="attr">href</span>=<span class="string">&quot;/wiki/Genesis_(Iris)&quot;</span> <span class="attr">title</span>=<span class="string">&quot;Genesis (Iris)&quot;</span>&gt;</span>Genesis<span class="tag">&lt;/<span class="name">a</span>&gt;</span></span><br></pre></td></tr></table></figure></div></li><li><p>实际爬取到的曲目数量仅有 424 首，与实际的 465 首相差甚远。</p></li></ul></li></ul><details class="relative my-4 border border-border-color bg-second-background-color rounded-md  blue" data-header-exclude><summary class="px-4 py-2 rounded-md shadow-[0_0_2px_0_var(--shadow-color-1)] cursor-pointer not-markdown"><i class="fa-solid fa-chevron-right"></i>climb_fandom</summary><div class="content p-4 "><div class="code-container" data-rel="Python"><figure class="iseeu highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> re</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> requests</span><br><span class="line"><span class="keyword">from</span> bs4 <span class="keyword">import</span> BeautifulSoup</span><br><span class="line"></span><br><span class="line">url = <span class="string">&quot;https://arcaea.fandom.com/wiki/Songs_by_Date#List_of_songs&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># Custom headers to mimic a browser</span></span><br><span class="line">headers = &#123;</span><br><span class="line">    <span class="string">&quot;User-Agent&quot;</span>: (</span><br><span class="line">        <span class="string">&quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64) &quot;</span></span><br><span class="line">        <span class="string">&quot;AppleWebKit/537.36 (KHTML, like Gecko) &quot;</span></span><br><span class="line">        <span class="string">&quot;Chrome/114.0.0.0 Safari/537.36&quot;</span></span><br><span class="line">    ),</span><br><span class="line">    <span class="string">&quot;Accept-Language&quot;</span>: <span class="string">&quot;en-US,en;q=0.9&quot;</span>,</span><br><span class="line">    <span class="string">&quot;Referer&quot;</span>: <span class="string">&quot;https://www.google.com&quot;</span>,</span><br><span class="line">&#125;</span><br><span class="line">false_titles = [<span class="string">&quot;Songs by Pack&quot;</span>, <span class="string">&quot;Songs by Level&quot;</span>]</span><br><span class="line">missing_titles = [<span class="string">&quot;Genesis&quot;</span>, <span class="string">&quot;μ&quot;</span>]</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">main</span>() -&gt; <span class="literal">None</span>:</span><br><span class="line">    songs = []</span><br><span class="line"></span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        <span class="comment"># Request the URL with headers</span></span><br><span class="line">        response = requests.get(url, headers=headers)</span><br><span class="line">        response.raise_for_status()  <span class="comment"># Raise an exception for HTTP errors</span></span><br><span class="line"></span><br><span class="line">        <span class="comment"># Parse the HTML content</span></span><br><span class="line">        soup = BeautifulSoup(response.text, <span class="string">&quot;html.parser&quot;</span>)</span><br><span class="line"></span><br><span class="line">        <span class="comment"># Find all &lt;a&gt; elements and extract their content</span></span><br><span class="line">        a_tags = soup.find_all(<span class="string">&quot;a&quot;</span>, href=re.<span class="built_in">compile</span>(<span class="string">r&quot;^/wiki/&quot;</span>), title=<span class="literal">True</span>)</span><br><span class="line">        <span class="keyword">for</span> a_tag <span class="keyword">in</span> a_tags:</span><br><span class="line">            title_value = a_tag[<span class="string">&quot;title&quot;</span>]</span><br><span class="line">            song_title = a_tag.text.strip()</span><br><span class="line">            <span class="keyword">if</span> (</span><br><span class="line">                song_title.lower() == title_value.lower()</span><br><span class="line">                <span class="keyword">and</span> song_title <span class="keyword">not</span> <span class="keyword">in</span> false_titles</span><br><span class="line">                <span class="keyword">and</span> song_title <span class="keyword">not</span> <span class="keyword">in</span> songs</span><br><span class="line">            ):</span><br><span class="line">                songs.append(a_tag.text)</span><br><span class="line"></span><br><span class="line">        <span class="keyword">for</span> t <span class="keyword">in</span> missing_titles:</span><br><span class="line">            songs.append(t)</span><br><span class="line"></span><br><span class="line">        <span class="built_in">print</span>(</span><br><span class="line">            <span class="string">f&quot;Climb complete. Grabbed <span class="subst">&#123;<span class="built_in">len</span>(songs)&#125;</span> songs. This may include false title.&quot;</span></span><br><span class="line">        )</span><br><span class="line">        <span class="keyword">with</span> <span class="built_in">open</span>(<span class="string">&quot;songs.txt&quot;</span>, <span class="string">&quot;w&quot;</span>) <span class="keyword">as</span> file:</span><br><span class="line">            file.write(<span class="string">&quot;\n&quot;</span>.join(songs))</span><br><span class="line"></span><br><span class="line">    <span class="keyword">except</span> requests.exceptions.RequestException <span class="keyword">as</span> e:</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">&quot;An error occurred while requesting the URL:&quot;</span>, e)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&quot;__main__&quot;</span>:</span><br><span class="line">    main()</span><br></pre></td></tr></table></figure></div><p>可以看到，其中定义了列表 <code>false_titles</code> 和 <code>missing_titles</code> 来手动剔除错误的匹配结果以及添加缺少的结果。</p></div></details><hr><ul><li><p>然后我突然想起来，网易云上有个 <a class="link"   href="https://music.163.com/#/djradio?id=350746079" >Arcaea 电台<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a>。</p></li><li><p>不同于一般网站，网易云不知用什么方法使得其音乐列表无法被 requests 库获取，无法使用一般的 <code>bs4</code> &amp; <code>requests</code> 经典组合爬取。猜测是使用了网页脚本刷新内容。</p></li><li><p>本人倒是在很久以前写过的一个网易云爬虫，使用的是 <a class="link"   href="https://github.com/p697/cloudmusic" >cloudmusic<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a> 库。该库已经很久没人维护和使用了，而且似乎也不支持电台查询。</p></li><li><p>于是我便谷歌了一下网易云的爬虫方案，找到了一个使用 <a class="link"   href="https://www.selenium.dev/" >selenium<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a> 自动化测试框架模拟浏览器的方法：</p><div class="code-container" data-rel="Python"><figure class="iseeu highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> random <span class="keyword">import</span> randint</span><br><span class="line"></span><br><span class="line"><span class="keyword">from</span> selenium <span class="keyword">import</span> webdriver</span><br><span class="line"><span class="keyword">from</span> selenium.webdriver.chrome.options <span class="keyword">import</span> Options</span><br><span class="line"><span class="keyword">from</span> selenium.webdriver.common.by <span class="keyword">import</span> By</span><br><span class="line"></span><br><span class="line">base_url = <span class="string">&quot;https://music.163.com/#/djradio?id=350746079&amp;order=1&amp;_hash=programlist&amp;limit=100&amp;offset=&quot;</span></span><br><span class="line">output_file = <span class="string">&quot;./songs.txt&quot;</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">main</span>():</span><br><span class="line">    songs = []</span><br><span class="line"></span><br><span class="line">    chrome_options = Options()</span><br><span class="line"></span><br><span class="line">    <span class="comment"># run without gui window</span></span><br><span class="line">    chrome_options.add_argument(<span class="string">&quot;--headless&quot;</span>)</span><br><span class="line">    browser = webdriver.Chrome(chrome_options)</span><br><span class="line">    <span class="comment"># browser.maximize_window()</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">for</span> page <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">5</span>):</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">f&quot;Grabbing from page <span class="subst">&#123;page + <span class="number">1</span>&#125;</span>...&quot;</span>)</span><br><span class="line"></span><br><span class="line">        <span class="comment"># open radio page</span></span><br><span class="line">        browser.get(base_url + <span class="built_in">str</span>(page * <span class="number">100</span>))</span><br><span class="line"></span><br><span class="line">        <span class="comment"># wait for a random length of period</span></span><br><span class="line">        rand_wait = randint(<span class="number">3</span>, <span class="number">6</span>)</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">f&quot;waiting for <span class="subst">&#123;rand_wait&#125;</span> secs...&quot;</span>)</span><br><span class="line">        browser.implicitly_wait(rand_wait)</span><br><span class="line"></span><br><span class="line">        browser.switch_to.frame(<span class="string">&quot;contentFrame&quot;</span>)</span><br><span class="line"></span><br><span class="line">        song_list = browser.find_elements(</span><br><span class="line">            By.XPATH, <span class="string">&#x27;//*[contains(@href, &quot;program?id=&quot;)]&#x27;</span></span><br><span class="line">        )</span><br><span class="line"></span><br><span class="line">        <span class="keyword">for</span> song <span class="keyword">in</span> song_list:</span><br><span class="line">            <span class="keyword">if</span> song.text <span class="keyword">not</span> <span class="keyword">in</span> songs:</span><br><span class="line">                songs.append(song.text)</span><br><span class="line"></span><br><span class="line">    <span class="built_in">print</span>(<span class="string">f&quot;Writing to file: <span class="subst">&#123;output_file&#125;</span>...&quot;</span>)</span><br><span class="line">    <span class="keyword">with</span> <span class="built_in">open</span>(output_file, <span class="string">&quot;w&quot;</span>) <span class="keyword">as</span> file:</span><br><span class="line">        file.write(<span class="string">&quot;\n&quot;</span>.join(songs))</span><br><span class="line">    <span class="built_in">print</span>(<span class="string">&quot;Done.&quot;</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&quot;__main__&quot;</span>:</span><br><span class="line">    main()</span><br></pre></td></tr></table></figure></div></li><li><p>其中，电台内每个曲目的 HTML 源码如下所示：</p><div class="code-container" data-rel="Html"><figure class="iseeu highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">a</span> <span class="attr">href</span>=<span class="string">&quot;/program?id=1368523734&quot;</span> <span class="attr">title</span>=<span class="string">&quot;Memory Forest&quot;</span>&gt;</span>Memory Forest<span class="tag">&lt;/<span class="name">a</span>&gt;</span></span><br></pre></td></tr></table></figure></div></li><li><p>此处可采用如下方式进行匹配：</p><div class="code-container" data-rel="Python"><figure class="iseeu highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">song_list = browser.find_elements(</span><br><span class="line">    By.XPATH, <span class="string">&#x27;//*[contains(@href, &quot;program?id=&quot;)]&#x27;</span></span><br><span class="line">)</span><br></pre></td></tr></table></figure></div></li><li><p>经简单观察和测试，并未发现多余的结果。</p></li></ul><h3 id="模式匹配"><a href="#模式匹配" class="headerlink" title="模式匹配"></a>模式匹配</h3><ul><li><p>来自群机器人的题目形式如同 <code>?e?e?i?</code>(Genesis)。</p></li><li><p>在 ChatGPT 的帮助下快速的完成了如下的代码：</p><div class="code-container" data-rel="Python"><figure class="iseeu highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> argparse</span><br><span class="line"><span class="keyword">import</span> re</span><br><span class="line"></span><br><span class="line"><span class="keyword">from</span> colorama <span class="keyword">import</span> Fore, Style, init</span><br><span class="line"></span><br><span class="line">DEFAULT_FILE_PATH = <span class="string">&quot;./songs.txt&quot;</span></span><br><span class="line">all_songs = []</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">init_songs</span>(<span class="params">file_path</span>) -&gt; <span class="literal">None</span>:</span><br><span class="line">    <span class="keyword">with</span> <span class="built_in">open</span>(file_path, <span class="string">&quot;r&quot;</span>) <span class="keyword">as</span> file:</span><br><span class="line">        <span class="keyword">for</span> line <span class="keyword">in</span> file:</span><br><span class="line">            all_songs.append(line.strip())</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">match_pattern</span>(<span class="params">pattern: <span class="built_in">str</span></span>) -&gt; <span class="literal">None</span>:</span><br><span class="line">    match_list = []</span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        regex = re.<span class="built_in">compile</span>(pattern.replace(<span class="string">&quot;?&quot;</span>, <span class="string">&quot;.&quot;</span>))</span><br><span class="line">    <span class="keyword">except</span> Exception <span class="keyword">as</span> e:</span><br><span class="line">        <span class="built_in">print</span>(Fore.RED + <span class="string">&quot;Unable to parse pattern.&quot;</span> + Style.RESET_ALL)</span><br><span class="line">        <span class="keyword">return</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">for</span> s <span class="keyword">in</span> all_songs:</span><br><span class="line">        <span class="keyword">if</span> regex.fullmatch(s):</span><br><span class="line">            match_list.append(s)</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> <span class="built_in">len</span>(match_list) == <span class="number">0</span>:</span><br><span class="line">        <span class="built_in">print</span>(Fore.RED + <span class="string">&quot;No result found.&quot;</span> + Style.RESET_ALL)</span><br><span class="line">        <span class="keyword">return</span></span><br><span class="line"></span><br><span class="line">    matched_num = <span class="built_in">len</span>(match_list)</span><br><span class="line">    <span class="comment"># found too much songs, ask user whether to display or not</span></span><br><span class="line">    <span class="keyword">if</span> matched_num &gt;= <span class="number">10</span>:</span><br><span class="line">        <span class="built_in">print</span>(</span><br><span class="line">            Fore.LIGHTYELLOW_EX</span><br><span class="line">            + <span class="string">f&quot;Found <span class="subst">&#123;matched_num&#125;</span>(&gt;= 10) songs, display all? (y/N)&quot;</span></span><br><span class="line">        )</span><br><span class="line">        choice = <span class="built_in">input</span>()</span><br><span class="line">        <span class="keyword">if</span> choice.lower() != <span class="string">&quot;y&quot;</span>:</span><br><span class="line">            <span class="built_in">print</span>(<span class="string">&quot;Skipped.&quot;</span>)</span><br><span class="line">            <span class="keyword">return</span></span><br><span class="line"></span><br><span class="line">    <span class="built_in">print</span>(Fore.GREEN + <span class="string">f&quot;Matched <span class="subst">&#123;<span class="built_in">len</span>(match_list)&#125;</span> song(s):&quot;</span> + Style.RESET_ALL)</span><br><span class="line">    <span class="keyword">for</span> t <span class="keyword">in</span> match_list:</span><br><span class="line">        <span class="built_in">print</span>(t)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">main</span>() -&gt; <span class="literal">None</span>:</span><br><span class="line">    <span class="comment"># colorama</span></span><br><span class="line">    init()</span><br><span class="line"></span><br><span class="line">    parser = argparse.ArgumentParser(description=<span class="string">&quot;Process args.&quot;</span>)</span><br><span class="line">    parser.add_argument(</span><br><span class="line">        <span class="string">&quot;-f&quot;</span>,</span><br><span class="line">        <span class="string">&quot;--songs-file&quot;</span>,</span><br><span class="line">        <span class="built_in">type</span>=<span class="built_in">str</span>,</span><br><span class="line">        default=DEFAULT_FILE_PATH,</span><br><span class="line">        <span class="built_in">help</span>=<span class="string">&quot;File contains all songs of Arcaea&quot;</span>,</span><br><span class="line">    )</span><br><span class="line">    parser.add_argument(<span class="string">&quot;-b&quot;</span>, <span class="string">&quot;--batch&quot;</span>, action=<span class="string">&quot;store_true&quot;</span>, <span class="built_in">help</span>=<span class="string">&quot;Run in batch mode&quot;</span>)</span><br><span class="line"></span><br><span class="line">    args = parser.parse_args()</span><br><span class="line"></span><br><span class="line">    <span class="comment"># read songs from file</span></span><br><span class="line">    <span class="built_in">print</span>(</span><br><span class="line">        Fore.LIGHTMAGENTA_EX</span><br><span class="line">        + <span class="string">f&quot;Using <span class="subst">&#123;args.songs_file&#125;</span> as song list.&quot;</span></span><br><span class="line">        + Style.RESET_ALL</span><br><span class="line">    )</span><br><span class="line">    init_songs(args.songs_file)</span><br><span class="line">    <span class="keyword">if</span> <span class="built_in">len</span>(all_songs) &lt;= <span class="number">400</span>:</span><br><span class="line">        <span class="built_in">print</span>(</span><br><span class="line">            Fore.RED</span><br><span class="line">            + <span class="string">&quot;Initialization Failed. Too few songs.(&lt;= 400, should be around 450)&quot;</span></span><br><span class="line">            + Style.RESET_ALL</span><br><span class="line">        )</span><br><span class="line">        <span class="keyword">return</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> args.batch:</span><br><span class="line">        <span class="comment"># <span class="doctag">TODO:</span> batch mode</span></span><br><span class="line">        <span class="built_in">print</span>(Fore.RED + <span class="string">&quot;Batch mode is not supported yet.&quot;</span> + Style.RESET_ALL)</span><br><span class="line">        <span class="keyword">return</span></span><br><span class="line"></span><br><span class="line">    <span class="built_in">print</span>(Fore.YELLOW + <span class="string">&quot;\033[1mInput pattern to start match.&quot;</span> + Style.RESET_ALL)</span><br><span class="line">    <span class="built_in">print</span>(Fore.LIGHTCYAN_EX + <span class="string">&quot;Pattern is case sensitive.&quot;</span> + Style.RESET_ALL)</span><br><span class="line">    <span class="built_in">print</span>(</span><br><span class="line">        Fore.LIGHTCYAN_EX</span><br><span class="line">        + <span class="string">&quot;Pattern ends with `+` indicates an uncertain length.&quot;</span></span><br><span class="line">        + Style.RESET_ALL</span><br><span class="line">    )</span><br><span class="line">    <span class="built_in">print</span>(<span class="string">&quot;Type Q/q to quit.&quot;</span>)</span><br><span class="line"></span><br><span class="line">    <span class="keyword">while</span> <span class="literal">True</span>:</span><br><span class="line">        usr_input = <span class="built_in">input</span>()</span><br><span class="line">        <span class="keyword">if</span> usr_input.lower() == <span class="string">&quot;q&quot;</span>:</span><br><span class="line">            <span class="built_in">print</span>(<span class="string">&quot;Goodbye.&quot;</span>)</span><br><span class="line">            <span class="keyword">break</span></span><br><span class="line"></span><br><span class="line">        pattern = usr_input</span><br><span class="line">        <span class="keyword">if</span> usr_input[-<span class="number">1</span>] == <span class="string">&quot;+&quot;</span>:</span><br><span class="line">            pattern = pattern[:-<span class="number">1</span>] + <span class="string">&quot;.*&quot;</span></span><br><span class="line"></span><br><span class="line">        match_pattern(pattern)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&quot;__main__&quot;</span>:</span><br><span class="line">    main()</span><br></pre></td></tr></table></figure></div></li><li><p>程序启动后进入一个循环中，持续接受用户输入并与文件中的曲名作匹配。</p></li><li><p>如果用户输入的模式串以 <code>+</code> 结束，则在模式串最后添加一个 <code>.*</code> 来匹配不定长度的曲名。</p></li></ul><div class="callout callout--titled info mb-4 rounded-small shadow-redefine-flat bg-(--callout-bg-color) p-3 pl-1 relative flex flex-row gap-2"><div role="none" class="rounded-full self-stretch w-0.5 bg-(--callout-primary-color) shrink-0 opacity-60"></div><div class="flex flex-col gap-2"><div class="callout__title flex items-center gap-2 font-semibold tracking-tight"><i class="callout__icon fa-code leading-none text-(--callout-primary-color) text-sm shrink-0"></i> Batch_Mode</div><div class="callout__content markdown-body flex-1 min-w-0"><p>可以看到，代码中存在一个未完成的 <code>batch mode</code>。<br>我本来是打算将他用于批量匹配曲名的，但是刚开始实现不久我就发现，在 Hyprland 环境下我的 linuxqq-nt-bwrap 无法将其中的内容复制到系统的粘贴板上。但是我却能够将系统粘贴板中的东西粘贴到 qq 里，颇为神奇。。</p></div></div></div><h2 id="结束"><a href="#结束" class="headerlink" title="结束"></a>结束</h2><ul><li>写的很爽，但是为此熬夜这么晚似乎不是很值得。</li></ul>]]>
    </content>
    <id>https://blog.imlast.top/2024/12/20/arcaea-song-matcher/</id>
    <link href="https://blog.imlast.top/2024/12/20/arcaea-song-matcher/"/>
    <published>2024-12-20T19:00:14.000Z</published>
    <summary>用 Python 写了个用来辅助猜曲名的匹配器，以及网易云电台爬虫</summary>
    <title>Arcaea 曲名匹配器</title>
    <updated>2024-12-20T19:00:14.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>Last</name>
    </author>
    <category term="笔记" scheme="https://blog.imlast.top/categories/%E7%AC%94%E8%AE%B0/"/>
    <category term="c" scheme="https://blog.imlast.top/tags/c/"/>
    <category term="pa" scheme="https://blog.imlast.top/tags/pa/"/>
    <content>
      <![CDATA[<div class="callout callout--titled warning mb-4 rounded-small shadow-redefine-flat bg-(--callout-bg-color) p-3 pl-1 relative flex flex-row gap-2"><div role="none" class="rounded-full self-stretch w-0.5 bg-(--callout-primary-color) shrink-0 opacity-60"></div><div class="flex flex-col gap-2"><div class="callout__title flex items-center gap-2 font-semibold tracking-tight"><i class="callout__icon fa-triangle-exclamation leading-none text-(--callout-primary-color) text-sm shrink-0"></i> Warning</div><div class="callout__content markdown-body flex-1 min-w-0"><p>If someone is reading this blog, please be aware that the writer <strong>DID NOT</strong> consider the experience of the other readers.<br>After all, the most important thing is about writing things down for better memorization.</p></div></div></div><h2 id="Compilation-Process"><a href="#Compilation-Process" class="headerlink" title="Compilation Process"></a>Compilation Process</h2><ul><li><p>We’ve already seen this before in class 1:</p><div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">.c --precompile--&gt; .i --compile--&gt; .s --assemble--&gt; .o --link--&gt; .out</span><br></pre></td></tr></table></figure></div></li><li><p>Today’s lesson would be focusing on the process where the object file(.o) being transformed into an executable(.out).</p></li></ul><h2 id="Static-Linking"><a href="#Static-Linking" class="headerlink" title="Static Linking"></a>Static Linking</h2><h3 id="Introduction"><a href="#Introduction" class="headerlink" title="Introduction"></a>Introduction</h3><ul><li>The process of linking is basically connecting all of the required parts of a program together.</li><li>Say we are using a function from another file in the <code>main.c</code>, the compiler would not know which address to jump to unless we link the other file with <code>main.c</code> together.</li></ul><hr><ul><li><p>For example, if we have these three source files:</p><div class="code-container" data-rel="C"><figure class="iseeu highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// a.c</span></span><br><span class="line"><span class="type">int</span> <span class="title function_">foo</span> <span class="params">(<span class="type">int</span> a, <span class="type">int</span> b)</span> &#123;</span><br><span class="line">    <span class="keyword">return</span> a + b;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// b.c</span></span><br><span class="line"><span class="type">int</span> x = <span class="number">100</span>, y = <span class="number">200</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">// main.c</span></span><br><span class="line"><span class="keyword">extern</span> <span class="type">int</span> x, y;</span><br><span class="line"><span class="type">int</span> <span class="title function_">foo</span><span class="params">(<span class="type">int</span> a, <span class="type">int</span> b)</span>;</span><br><span class="line"><span class="type">int</span> <span class="title function_">main</span><span class="params">()</span> &#123;</span><br><span class="line">    foo(x, y);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></div></li><li><p>And then compile them separately, we would get three object files: <code>a.o</code>, <code>b.o</code> and <code>main.o</code>.</p></li><li><p>Then we will have to link them together to get the final expected executable file:</p><div class="code-container" data-rel="C"><figure class="iseeu highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">gcc -<span class="type">static</span> a.o b.o main.o</span><br></pre></td></tr></table></figure></div><p><em>Note: the flag <code>-static</code> is to explicitly tell gcc to use static linking, as modern versions of gcc would use dynamic linking by default.</em></p></li><li><p>The linking process would fail if we are missing one of the object files:</p><div class="code-container" data-rel="Bash"><figure class="iseeu highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"> gcc -static b.o main.o</span><br><span class="line">/usr/bin/ld: main.o: <span class="keyword">in</span> <span class="keyword">function</span> `main<span class="string">&#x27;:</span></span><br><span class="line"><span class="string">main.c:(.text.startup+0x11): undefined reference to `foo&#x27;</span></span><br><span class="line">collect2: error: ld returned 1 <span class="built_in">exit</span> status</span><br></pre></td></tr></table></figure></div></li><li><p>Without linking, the compiler would never know where the definitions of <code>foo</code> or <code>x</code> <code>y</code> are.</p></li><li><p>But How exactly does the compiler do this?</p></li></ul><h3 id="Know-How"><a href="#Know-How" class="headerlink" title="Know How"></a>Know How</h3><ul><li>Turns out the object files compiled from source files are a type of ELF file called <strong>Relocatable File</strong>. This type of file contains code and data, and could be used for linking.</li></ul><table><thead><tr><th>ELF type</th><th>Explanation</th><th>Example(s)</th></tr></thead><tbody><tr><td>Relocatable File</td><td>Object files that can be combined with other object files during linking to create an executable or shared object</td><td><code>.o</code>, <code>.obj</code></td></tr><tr><td>Executable File</td><td>Files that contain a program ready to be executed directly by the system</td><td><code>.exe</code>, regular Linux programs</td></tr><tr><td>Shared Object File</td><td>Libraries that can be loaded and linked dynamically at runtim by multiple programs</td><td><code>.so</code>, <code>.dll</code></td></tr><tr><td>Core Dump File</td><td>Files containing a snapshot of a program’s memory when it crashes or terminates abnormally</td><td><code>core.1234</code> (<code>1234</code> for the PID)</td></tr></tbody></table><ul><li>Part of the ELF structure looks like this:</li></ul><table><thead><tr><th>Section</th><th>Explanation</th></tr></thead><tbody><tr><td>ELF_Header</td><td>Contains ident_num, version, machine type, entry point, etc.</td></tr><tr><td>.text section</td><td>Contains executable code&#x2F;instructions of the program in machine code format</td></tr><tr><td>.rodata section</td><td>Contains read-only data like string literals, constants and static lookup tables</td></tr><tr><td>.data section</td><td>Contains initialized global and static variables that can be modified at runtime</td></tr><tr><td>.bss section</td><td>Contains uninitialized global and static variables (zeroed at program start)</td></tr><tr><td>…</td><td>…</td></tr></tbody></table><p><em>Note: modern compiler would put variables initialized with value <code>0</code> into .bss section rather than .data section by default</em><br><em>Note: We can use <code>objdump -h</code> to see those sections’ info.</em></p><ul><li>For the structure of an ELF file, also see <a href="https://blog.imlast.top/2024/10/02/nju-pa-2/#Parsing-ELF">this chapter</a>.</li></ul><hr><ul><li>In the linking process, the compiler would join the different parts of those ELF files together to form a bigger file as the executable file. The differenct sections of those object files are merged.</li><li>This process includes two main phases: <strong>Symbol Resolution</strong> and <strong>Relocation</strong>.</li></ul><h4 id="Symbol-Resolution"><a href="#Symbol-Resolution" class="headerlink" title="Symbol Resolution"></a>Symbol Resolution</h4><ul><li><p>When source files are compiled into object files separately, the name of the functions and variables declared in the file are stored as <strong>symbols</strong>.</p></li><li><p>Each object file has a symbol table containing:</p><ul><li>Defined symbols (functions&#x2F;variables defined in the source file being compiled)</li><li>undefined symbols (functions&#x2F;variables defined elsewhere)</li></ul></li><li><p>During linking, the linker would scan all of the object files to match the defined and undefined symbols as much as possible.</p></li><li><p>In the example above, we have function <code>foo</code> and variable <code>x</code> &amp; <code>y</code> defined in other source files other than <code>main.c</code>. It is the linker which put them together to form a complete executable file that include all of those symbols and their definitions.</p></li></ul><h4 id="Relocation"><a href="#Relocation" class="headerlink" title="Relocation"></a>Relocation</h4><ul><li><p>Initially, each object files’s code is written assuming it starts at address 0.</p></li><li><p>The linker would:</p><ol><li>Assign final memory locations to all sections(.text, .data, etc)</li><li>Adjust all memory references to use these new addresses</li><li>Update the machine code with correct addresses</li></ol></li><li><p>Take the example above:</p><div class="code-container" data-rel="Bash"><figure class="iseeu highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"> objdump -d main.o</span><br><span class="line"></span><br><span class="line">main.o:     file format elf64-x86-64</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">Disassembly of section .text.startup.main:</span><br><span class="line"></span><br><span class="line">0000000000000000 &lt;main&gt;:</span><br><span class="line">0:    48 83 ec 08             sub    <span class="variable">$0x8</span>,%rsp</span><br><span class="line">4:    8b 35 00 00 00 00       mov    0x0(%rip),%esi        <span class="comment"># a &lt;main+0xa&gt;</span></span><br><span class="line">a:    8b 3d 00 00 00 00       mov    0x0(%rip),%edi        <span class="comment"># 10 &lt;main+0x10&gt;</span></span><br><span class="line">10:   e8 00 00 00 00          call   15 &lt;main+0x15&gt;</span><br><span class="line">15:   31 c0                   xor    %eax,%eax</span><br><span class="line">17:   48 83 c4 08             add    <span class="variable">$0x8</span>,%rsp</span><br><span class="line">1b:   c3                      ret</span><br></pre></td></tr></table></figure></div><ul><li><p>Notice the zeros in the address references:</p><div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">10:   e8 00 00 00 00          call   15 &lt;main+0x15&gt;</span><br></pre></td></tr></table></figure></div></li><li><p>This is where the relocation placeholder is. This blank address will be filled in when linking happens.</p></li><li><p>Also, notice the instructions before <code>call</code>:</p><div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">4:    8b 35 00 00 00 00       mov    0x0(%rip),%esi        # a &lt;main+0xa&gt;</span><br><span class="line">a:    8b 3d 00 00 00 00       mov    0x0(%rip),%edi        # 10 &lt;main+0x10&gt;</span><br></pre></td></tr></table></figure></div></li><li><p>These are actually calling to variable <code>x</code> and <code>y</code>. As you can see, they are also placeholders like the <code>foo</code> one mentioned above.</p></li><li><p>Inside <code>main.o</code> lies a table(Relocatable Section) indicating the symbols relocated from other elf files.</p></li><li><p><code>readelf -a main.o</code> :</p><div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">Relocation section &#x27;.rela.text.startup.main&#x27; at offset 0x198 contains 3 entries:</span><br><span class="line">Offset          Info           Type           Sym. Value      Sym. Name + Addend</span><br><span class="line">000000000006  000400000002 R_X86_64_PC32     0000000000000000 y - 4</span><br><span class="line">00000000000c  000500000002 R_X86_64_PC32     0000000000000000 x - 4</span><br><span class="line">000000000011  000600000004 R_X86_64_PLT32    0000000000000000 foo - 4</span><br></pre></td></tr></table></figure></div></li><li><p>The reason why the address of <code>foo</code> needs to be substracted by 4 is that, the offset encoded in <code>call</code> instruction is calculated relative to the address of the next instruction, which is 4 bytes ahead of the current instruction on x86-64.</p></li></ul><details class="relative my-4 border border-border-color bg-second-background-color rounded-md  green" data-header-exclude><summary class="px-4 py-2 rounded-md shadow-[0_0_2px_0_var(--shadow-color-1)] cursor-pointer not-markdown"><i class="fa-solid fa-chevron-right"></i>Fun_Fact</summary><div class="content p-4 "><ul><li>This <code>-4</code> adjustment is a platform-related design – pc always points to the next instruction in x86, which is likely intended to make shift for the poor hardware in the age of 1970s.</li><li>On modern platforms like Risc-V <em>(some ARM modes as execption)</em>, pc will always point to the current executing instruction, so there’s no need of <code>-4</code> adjustment.</li></ul></div></details></li></ul><hr><div class="callout callout--titled info mb-4 rounded-small shadow-redefine-flat bg-(--callout-bg-color) p-3 pl-1 relative flex flex-row gap-2"><div role="none" class="rounded-full self-stretch w-0.5 bg-(--callout-primary-color) shrink-0 opacity-60"></div><div class="flex flex-col gap-2"><div class="callout__title flex items-center gap-2 font-semibold tracking-tight"><i class="callout__icon fa-circle-question leading-none text-(--callout-primary-color) text-sm shrink-0"></i> Whimsy</div><div class="callout__content markdown-body flex-1 min-w-0"><ol><li>Is it possible to ‘hack’ someone’s machine by tamperring this relocation process? Hijack the program from executing the original function and redirect it to execute another injected function? <em>(Turns out this way of ‘hacking’ has real-world example, which is GOT overwrite.)</em></li><li>Is it the way of counting the usage(benchmark) of a certain function? Relocating it to a wrapper function which marks the usage and the time consumed and then jump to the intended function? <em>(It seems that there are better options.)</em></li></ol></div></div></div><hr><ul><li><p>Also, we can use <code>nm</code> to take a look at the symbol table stored inside <code>main.o</code>:</p><div class="code-container" data-rel="Bash"><figure class="iseeu highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"> nm main.o</span><br><span class="line">                 U foo</span><br><span class="line">0000000000000000 T main</span><br><span class="line">                 U x</span><br><span class="line">                 U y</span><br></pre></td></tr></table></figure></div></li></ul><div class="callout callout--titled info mb-4 rounded-small shadow-redefine-flat bg-(--callout-bg-color) p-3 pl-1 relative flex flex-row gap-2"><div role="none" class="rounded-full self-stretch w-0.5 bg-(--callout-primary-color) shrink-0 opacity-60"></div><div class="flex flex-col gap-2"><div class="callout__title flex items-center gap-2 font-semibold tracking-tight"><i class="callout__icon fa-circle-exclamation leading-none text-(--callout-primary-color) text-sm shrink-0"></i> Note:</div><div class="callout__content markdown-body flex-1 min-w-0"><p><code>a.out</code> compiled&#x2F;linked with <code>-static</code> flag would contain symbols from <code>glibc</code> as static linkage would link <code>glibc</code> by default.<br>To get an <code>a.out</code> executable with a clean symbol table, one should remove the <code>-static</code> flag from the compilation command.</p></div></div></div><h3 id="What-Else"><a href="#What-Else" class="headerlink" title="What Else?"></a>What Else?</h3><ul><li>Actually, <code>gcc</code> does not only link those code&#x2F;data we’ve written in that three source files. It also links a lot of other standard libraries to ensure the proper execution of the program.</li><li>Take a look at the verbose information output by <code>gcc a.o b.o main.o -Wl,--verbose</code> and you’ll see that gcc uses <code>ld</code> to link a lot of files including <code>a.o</code>, <code>b.o</code> and <code>main.o</code>.</li><li>As a result, linking them only using ld won’t be enough: <code>ld a.o b.o main.o</code> would output an <code>a.out</code> that would trigger a <em>Segmentation Fault</em>.</li></ul><h2 id="Dynamic-Linking"><a href="#Dynamic-Linking" class="headerlink" title="Dynamic Linking"></a>Dynamic Linking</h2><ul><li><p>Static linking would create a large executable file as it includes the entire code of the used libraries. When it comes to larger project which links a certain amount of libraries, the size of the executable may become significantly large, making it impractical for deployment or storage.</p></li><li><p>Dynamic linking was invented to resolve this issue: The system loads the requried shared libraries into memory(if not already loaded) when the executable is run and resolves the symbols.</p></li><li><p>Running executables compiled and linked with dynamic linking strategy is actually passing it to a dynamic linker.</p></li><li><p>We can use <code>readelf -l a.out | grep interpreter</code> to get the dynamic linker used for executing:</p><div class="code-container" data-rel="Bash"><figure class="iseeu highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"> readelf -l a.out | grep interpreter</span><br><span class="line">  [Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]</span><br></pre></td></tr></table></figure></div></li></ul><hr><ul><li>There’s a lot more about dynamic linking not mentioned in this class, as it’s too complicated and has too much details.</li></ul>]]>
    </content>
    <id>https://blog.imlast.top/2024/12/20/nju-pa-w9/</id>
    <link href="https://blog.imlast.top/2024/12/20/nju-pa-w9/"/>
    <published>2024-12-20T03:00:32.000Z</published>
    <summary>Notes taken for class W9 of NJU PA</summary>
    <title>
      <![CDATA[PA W9 - Linking & Loading]]>
    </title>
    <updated>2024-12-20T03:00:32.000Z</updated>
  </entry>
</feed>
