839 lines
160 KiB
HTML
839 lines
160 KiB
HTML
![]() |
<!doctype html>
|
|||
|
<html>
|
|||
|
<head>
|
|||
|
<meta charset='UTF-8'><meta name='viewport' content='width=device-width initial-scale=1'>
|
|||
|
|
|||
|
<link href='https://fonts.loli.net/css?family=Open+Sans:400italic,700italic,700,400&subset=latin,latin-ext' rel='stylesheet' type='text/css' /><style type='text/css'>html {overflow-x: initial !important;}:root { --bg-color:#ffffff; --text-color:#333333; --select-text-bg-color:#B5D6FC; --select-text-font-color:auto; --monospace:"Lucida Console",Consolas,"Courier",monospace; --title-bar-height:20px; }
|
|||
|
.mac-os-11 { --title-bar-height:28px; }
|
|||
|
html { font-size: 14px; background-color: var(--bg-color); color: var(--text-color); font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; -webkit-font-smoothing: antialiased; }
|
|||
|
body { margin: 0px; padding: 0px; height: auto; inset: 0px; font-size: 1rem; line-height: 1.42857; overflow-x: hidden; background: inherit; tab-size: 4; }
|
|||
|
iframe { margin: auto; }
|
|||
|
a.url { word-break: break-all; }
|
|||
|
a:active, a:hover { outline: 0px; }
|
|||
|
.in-text-selection, ::selection { text-shadow: none; background: var(--select-text-bg-color); color: var(--select-text-font-color); }
|
|||
|
#write { margin: 0px auto; height: auto; width: inherit; word-break: normal; overflow-wrap: break-word; position: relative; white-space: normal; overflow-x: visible; padding-top: 36px; }
|
|||
|
#write.first-line-indent p { text-indent: 2em; }
|
|||
|
#write.first-line-indent li p, #write.first-line-indent p * { text-indent: 0px; }
|
|||
|
#write.first-line-indent li { margin-left: 2em; }
|
|||
|
.for-image #write { padding-left: 8px; padding-right: 8px; }
|
|||
|
body.typora-export { padding-left: 30px; padding-right: 30px; }
|
|||
|
.typora-export .footnote-line, .typora-export li, .typora-export p { white-space: pre-wrap; }
|
|||
|
.typora-export .task-list-item input { pointer-events: none; }
|
|||
|
@media screen and (max-width: 500px) {
|
|||
|
body.typora-export { padding-left: 0px; padding-right: 0px; }
|
|||
|
#write { padding-left: 20px; padding-right: 20px; }
|
|||
|
.CodeMirror-sizer { margin-left: 0px !important; }
|
|||
|
.CodeMirror-gutters { display: none !important; }
|
|||
|
}
|
|||
|
#write li > figure:last-child { margin-bottom: 0.5rem; }
|
|||
|
#write ol, #write ul { position: relative; }
|
|||
|
img { max-width: 100%; vertical-align: middle; image-orientation: from-image; }
|
|||
|
button, input, select, textarea { color: inherit; font: inherit; }
|
|||
|
input[type="checkbox"], input[type="radio"] { line-height: normal; padding: 0px; }
|
|||
|
*, ::after, ::before { box-sizing: border-box; }
|
|||
|
#write h1, #write h2, #write h3, #write h4, #write h5, #write h6, #write p, #write pre { width: inherit; }
|
|||
|
#write h1, #write h2, #write h3, #write h4, #write h5, #write h6, #write p { position: relative; }
|
|||
|
p { line-height: inherit; }
|
|||
|
h1, h2, h3, h4, h5, h6 { break-after: avoid-page; break-inside: avoid; orphans: 4; }
|
|||
|
p { orphans: 4; }
|
|||
|
h1 { font-size: 2rem; }
|
|||
|
h2 { font-size: 1.8rem; }
|
|||
|
h3 { font-size: 1.6rem; }
|
|||
|
h4 { font-size: 1.4rem; }
|
|||
|
h5 { font-size: 1.2rem; }
|
|||
|
h6 { font-size: 1rem; }
|
|||
|
.md-math-block, .md-rawblock, h1, h2, h3, h4, h5, h6, p { margin-top: 1rem; margin-bottom: 1rem; }
|
|||
|
.hidden { display: none; }
|
|||
|
.md-blockmeta { color: rgb(204, 204, 204); font-weight: 700; font-style: italic; }
|
|||
|
a { cursor: pointer; }
|
|||
|
sup.md-footnote { padding: 2px 4px; background-color: rgba(238, 238, 238, 0.7); color: rgb(85, 85, 85); border-radius: 4px; cursor: pointer; }
|
|||
|
sup.md-footnote a, sup.md-footnote a:hover { color: inherit; text-transform: inherit; text-decoration: inherit; }
|
|||
|
#write input[type="checkbox"] { cursor: pointer; width: inherit; height: inherit; }
|
|||
|
figure { overflow-x: auto; margin: 1.2em 0px; max-width: calc(100% + 16px); padding: 0px; }
|
|||
|
figure > table { margin: 0px; }
|
|||
|
tr { break-inside: avoid; break-after: auto; }
|
|||
|
thead { display: table-header-group; }
|
|||
|
table { border-collapse: collapse; border-spacing: 0px; width: 100%; overflow: auto; break-inside: auto; text-align: left; }
|
|||
|
table.md-table td { min-width: 32px; }
|
|||
|
.CodeMirror-gutters { border-right: 0px; background-color: inherit; }
|
|||
|
.CodeMirror-linenumber { user-select: none; }
|
|||
|
.CodeMirror { text-align: left; }
|
|||
|
.CodeMirror-placeholder { opacity: 0.3; }
|
|||
|
.CodeMirror pre { padding: 0px 4px; }
|
|||
|
.CodeMirror-lines { padding: 0px; }
|
|||
|
div.hr:focus { cursor: none; }
|
|||
|
#write pre { white-space: pre-wrap; }
|
|||
|
#write.fences-no-line-wrapping pre { white-space: pre; }
|
|||
|
#write pre.ty-contain-cm { white-space: normal; }
|
|||
|
.CodeMirror-gutters { margin-right: 4px; }
|
|||
|
.md-fences { font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; overflow: visible; white-space: pre; background: inherit; position: relative !important; }
|
|||
|
.md-fences-adv-panel { width: 100%; margin-top: 10px; text-align: center; padding-top: 0px; padding-bottom: 8px; overflow-x: auto; }
|
|||
|
#write .md-fences.mock-cm { white-space: pre-wrap; }
|
|||
|
.md-fences.md-fences-with-lineno { padding-left: 0px; }
|
|||
|
#write.fences-no-line-wrapping .md-fences.mock-cm { white-space: pre; overflow-x: auto; }
|
|||
|
.md-fences.mock-cm.md-fences-with-lineno { padding-left: 8px; }
|
|||
|
.CodeMirror-line, twitterwidget { break-inside: avoid; }
|
|||
|
.footnotes { opacity: 0.8; font-size: 0.9rem; margin-top: 1em; margin-bottom: 1em; }
|
|||
|
.footnotes + .footnotes { margin-top: 0px; }
|
|||
|
.md-reset { margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: top; background: 0px 0px; text-decoration: none; text-shadow: none; float: none; position: static; width: auto; height: auto; white-space: nowrap; cursor: inherit; -webkit-tap-highlight-color: transparent; line-height: normal; font-weight: 400; text-align: left; box-sizing: content-box; direction: ltr; }
|
|||
|
li div { padding-top: 0px; }
|
|||
|
blockquote { margin: 1rem 0px; }
|
|||
|
li .mathjax-block, li p { margin: 0.5rem 0px; }
|
|||
|
li blockquote { margin: 1rem 0px; }
|
|||
|
li { margin: 0px; position: relative; }
|
|||
|
blockquote > :last-child { margin-bottom: 0px; }
|
|||
|
blockquote > :first-child, li > :first-child { margin-top: 0px; }
|
|||
|
.footnotes-area { color: rgb(136, 136, 136); margin-top: 0.714rem; padding-bottom: 0.143rem; white-space: normal; }
|
|||
|
#write .footnote-line { white-space: pre-wrap; }
|
|||
|
@media print {
|
|||
|
body, html { border: 1px solid transparent; height: 99%; break-after: avoid; break-before: avoid; font-variant-ligatures: no-common-ligatures; }
|
|||
|
#write { margin-top: 0px; padding-top: 0px; border-color: transparent !important; }
|
|||
|
.typora-export * { -webkit-print-color-adjust: exact; }
|
|||
|
.typora-export #write { break-after: avoid; }
|
|||
|
.typora-export #write::after { height: 0px; }
|
|||
|
.is-mac table { break-inside: avoid; }
|
|||
|
.typora-export-show-outline .typora-export-sidebar { display: none; }
|
|||
|
}
|
|||
|
.footnote-line { margin-top: 0.714em; font-size: 0.7em; }
|
|||
|
a img, img a { cursor: pointer; }
|
|||
|
pre.md-meta-block { font-size: 0.8rem; min-height: 0.8rem; white-space: pre-wrap; background: rgb(204, 204, 204); display: block; overflow-x: hidden; }
|
|||
|
p > .md-image:only-child:not(.md-img-error) img, p > img:only-child { display: block; margin: auto; }
|
|||
|
#write.first-line-indent p > .md-image:only-child:not(.md-img-error) img { left: -2em; position: relative; }
|
|||
|
p > .md-image:only-child { display: inline-block; width: 100%; }
|
|||
|
#write .MathJax_Display { margin: 0.8em 0px 0px; }
|
|||
|
.md-math-block { width: 100%; }
|
|||
|
.md-math-block:not(:empty)::after { display: none; }
|
|||
|
.MathJax_ref { fill: currentcolor; }
|
|||
|
[contenteditable="true"]:active, [contenteditable="true"]:focus, [contenteditable="false"]:active, [contenteditable="false"]:focus { outline: 0px; box-shadow: none; }
|
|||
|
.md-task-list-item { position: relative; list-style-type: none; }
|
|||
|
.task-list-item.md-task-list-item { padding-left: 0px; }
|
|||
|
.md-task-list-item > input { position: absolute; top: 0px; left: 0px; margin-left: -1.2em; margin-top: calc(1em - 10px); border: none; }
|
|||
|
.math { font-size: 1rem; }
|
|||
|
.md-toc { min-height: 3.58rem; position: relative; font-size: 0.9rem; border-radius: 10px; }
|
|||
|
.md-toc-content { position: relative; margin-left: 0px; }
|
|||
|
.md-toc-content::after, .md-toc::after { display: none; }
|
|||
|
.md-toc-item { display: block; color: rgb(65, 131, 196); }
|
|||
|
.md-toc-item a { text-decoration: none; }
|
|||
|
.md-toc-inner:hover { text-decoration: underline; }
|
|||
|
.md-toc-inner { display: inline-block; cursor: pointer; }
|
|||
|
.md-toc-h1 .md-toc-inner { margin-left: 0px; font-weight: 700; }
|
|||
|
.md-toc-h2 .md-toc-inner { margin-left: 2em; }
|
|||
|
.md-toc-h3 .md-toc-inner { margin-left: 4em; }
|
|||
|
.md-toc-h4 .md-toc-inner { margin-left: 6em; }
|
|||
|
.md-toc-h5 .md-toc-inner { margin-left: 8em; }
|
|||
|
.md-toc-h6 .md-toc-inner { margin-left: 10em; }
|
|||
|
@media screen and (max-width: 48em) {
|
|||
|
.md-toc-h3 .md-toc-inner { margin-left: 3.5em; }
|
|||
|
.md-toc-h4 .md-toc-inner { margin-left: 5em; }
|
|||
|
.md-toc-h5 .md-toc-inner { margin-left: 6.5em; }
|
|||
|
.md-toc-h6 .md-toc-inner { margin-left: 8em; }
|
|||
|
}
|
|||
|
a.md-toc-inner { font-size: inherit; font-style: inherit; font-weight: inherit; line-height: inherit; }
|
|||
|
.footnote-line a:not(.reversefootnote) { color: inherit; }
|
|||
|
.md-attr { display: none; }
|
|||
|
.md-fn-count::after { content: "."; }
|
|||
|
code, pre, samp, tt { font-family: var(--monospace); }
|
|||
|
kbd { margin: 0px 0.1em; padding: 0.1em 0.6em; font-size: 0.8em; color: rgb(36, 39, 41); background: rgb(255, 255, 255); border: 1px solid rgb(173, 179, 185); border-radius: 3px; box-shadow: rgba(12, 13, 14, 0.2) 0px 1px 0px, rgb(255, 255, 255) 0px 0px 0px 2px inset; white-space: nowrap; vertical-align: middle; }
|
|||
|
.md-comment { color: rgb(162, 127, 3); opacity: 0.8; font-family: var(--monospace); }
|
|||
|
code { text-align: left; vertical-align: initial; }
|
|||
|
a.md-print-anchor { white-space: pre !important; border-width: initial !important; border-style: none !important; border-color: initial !important; display: inline-block !important; position: absolute !important; width: 1px !important; right: 0px !important; outline: 0px !important; background: 0px 0px !important; text-decoration: initial !important; text-shadow: initial !important; }
|
|||
|
.os-windows.monocolor-emoji .md-emoji { font-family: "Segoe UI Symbol", sans-serif; }
|
|||
|
.md-diagram-panel > svg { max-width: 100%; }
|
|||
|
[lang="flow"] svg, [lang="mermaid"] svg { max-width: 100%; height: auto; }
|
|||
|
[lang="mermaid"] .node text { font-size: 1rem; }
|
|||
|
table tr th { border-bottom: 0px; }
|
|||
|
video { max-width: 100%; display: block; margin: 0px auto; }
|
|||
|
iframe { max-width: 100%; width: 100%; border: none; }
|
|||
|
.highlight td, .highlight tr { border: 0px; }
|
|||
|
mark { background: rgb(255, 255, 0); color: rgb(0, 0, 0); }
|
|||
|
.md-html-inline .md-plain, .md-html-inline strong, mark .md-inline-math, mark strong { color: inherit; }
|
|||
|
.md-expand mark .md-meta { opacity: 0.3 !important; }
|
|||
|
mark .md-meta { color: rgb(0, 0, 0); }
|
|||
|
@media print {
|
|||
|
.typora-export h1, .typora-export h2, .typora-export h3, .typora-export h4, .typora-export h5, .typora-export h6 { break-inside: avoid; }
|
|||
|
}
|
|||
|
.md-diagram-panel .messageText { stroke: none !important; }
|
|||
|
.md-diagram-panel .start-state { fill: var(--node-fill); }
|
|||
|
.md-diagram-panel .edgeLabel rect { opacity: 1 !important; }
|
|||
|
.md-require-zoom-fix { height: auto; margin-top: 16px; margin-bottom: 16px; }
|
|||
|
.md-require-zoom-fix foreignobject { font-size: var(--mermaid-font-zoom); }
|
|||
|
.md-fences.md-fences-math { font-size: 1em; }
|
|||
|
.md-fences-advanced:not(.md-focus) { padding: 0px; white-space: nowrap; border: 0px; }
|
|||
|
.md-fences-advanced:not(.md-focus) { background: inherit; }
|
|||
|
.typora-export-show-outline .typora-export-content { max-width: 1440px; margin: auto; display: flex; flex-direction: row; }
|
|||
|
.typora-export-sidebar { width: 300px; font-size: 0.8rem; margin-top: 80px; margin-right: 18px; }
|
|||
|
.typora-export-show-outline #write { --webkit-flex:2; flex: 2 1 0%; }
|
|||
|
.typora-export-sidebar .outline-content { position: fixed; top: 0px; max-height: 100%; overflow: hidden auto; padding-bottom: 30px; padding-top: 60px; width: 300px; }
|
|||
|
@media screen and (max-width: 1024px) {
|
|||
|
.typora-export-sidebar, .typora-export-sidebar .outline-content { width: 240px; }
|
|||
|
}
|
|||
|
@media screen and (max-width: 800px) {
|
|||
|
.typora-export-sidebar { display: none; }
|
|||
|
}
|
|||
|
.outline-content li, .outline-content ul { margin-left: 0px; margin-right: 0px; padding-left: 0px; padding-right: 0px; list-style: none; }
|
|||
|
.outline-content ul { margin-top: 0px; margin-bottom: 0px; }
|
|||
|
.outline-content strong { font-weight: 400; }
|
|||
|
.outline-expander { width: 1rem; height: 1.42857rem; position: relative; display: table-cell; vertical-align: middle; cursor: pointer; padding-left: 4px; }
|
|||
|
.outline-expander::before { content: ""; position: relative; font-family: Ionicons; display: inline-block; font-size: 8px; vertical-align: middle; }
|
|||
|
.outline-item { padding-top: 3px; padding-bottom: 3px; cursor: pointer; }
|
|||
|
.outline-expander:hover::before { content: ""; }
|
|||
|
.outline-h1 > .outline-item { padding-left: 0px; }
|
|||
|
.outline-h2 > .outline-item { padding-left: 1em; }
|
|||
|
.outline-h3 > .outline-item { padding-left: 2em; }
|
|||
|
.outline-h4 > .outline-item { padding-left: 3em; }
|
|||
|
.outline-h5 > .outline-item { padding-left: 4em; }
|
|||
|
.outline-h6 > .outline-item { padding-left: 5em; }
|
|||
|
.outline-label { cursor: pointer; display: table-cell; vertical-align: middle; text-decoration: none; color: inherit; }
|
|||
|
.outline-label:hover { text-decoration: underline; }
|
|||
|
.outline-item:hover { border-color: rgb(245, 245, 245); background-color: var(--item-hover-bg-color); }
|
|||
|
.outline-item:hover { margin-left: -28px; margin-right: -28px; border-left: 28px solid transparent; border-right: 28px solid transparent; }
|
|||
|
.outline-item-single .outline-expander::before, .outline-item-single .outline-expander:hover::before { display: none; }
|
|||
|
.outline-item-open > .outline-item > .outline-expander::before { content: ""; }
|
|||
|
.outline-children { display: none; }
|
|||
|
.info-panel-tab-wrapper { display: none; }
|
|||
|
.outline-item-open > .outline-children { display: block; }
|
|||
|
.typora-export .outline-item { padding-top: 1px; padding-bottom: 1px; }
|
|||
|
.typora-export .outline-item:hover { margin-right: -8px; border-right: 8px solid transparent; }
|
|||
|
.typora-export .outline-expander::before { content: "+"; font-family: inherit; top: -1px; }
|
|||
|
.typora-export .outline-expander:hover::before, .typora-export .outline-item-open > .outline-item > .outline-expander::before { content: "−"; }
|
|||
|
.typora-export-collapse-outline .outline-children { display: none; }
|
|||
|
.typora-export-collapse-outline .outline-item-open > .outline-children, .typora-export-no-collapse-outline .outline-children { display: block; }
|
|||
|
.typora-export-no-collapse-outline .outline-expander::before { content: "" !important; }
|
|||
|
.typora-export-show-outline .outline-item-active > .outline-item .outline-label { font-weight: 700; }
|
|||
|
.md-inline-math-container mjx-container { zoom: 0.95; }
|
|||
|
|
|||
|
|
|||
|
.CodeMirror { height: auto; }
|
|||
|
.CodeMirror.cm-s-inner { background: inherit; }
|
|||
|
.CodeMirror-scroll { overflow: auto hidden; z-index: 3; }
|
|||
|
.CodeMirror-gutter-filler, .CodeMirror-scrollbar-filler { background-color: rgb(255, 255, 255); }
|
|||
|
.CodeMirror-gutters { border-right: 1px solid rgb(221, 221, 221); background: inherit; white-space: nowrap; }
|
|||
|
.CodeMirror-linenumber { padding: 0px 3px 0px 5px; text-align: right; color: rgb(153, 153, 153); }
|
|||
|
.cm-s-inner .cm-keyword { color: rgb(119, 0, 136); }
|
|||
|
.cm-s-inner .cm-atom, .cm-s-inner.cm-atom { color: rgb(34, 17, 153); }
|
|||
|
.cm-s-inner .cm-number { color: rgb(17, 102, 68); }
|
|||
|
.cm-s-inner .cm-def { color: rgb(0, 0, 255); }
|
|||
|
.cm-s-inner .cm-variable { color: rgb(0, 0, 0); }
|
|||
|
.cm-s-inner .cm-variable-2 { color: rgb(0, 85, 170); }
|
|||
|
.cm-s-inner .cm-variable-3 { color: rgb(0, 136, 85); }
|
|||
|
.cm-s-inner .cm-string { color: rgb(170, 17, 17); }
|
|||
|
.cm-s-inner .cm-property { color: rgb(0, 0, 0); }
|
|||
|
.cm-s-inner .cm-operator { color: rgb(152, 26, 26); }
|
|||
|
.cm-s-inner .cm-comment, .cm-s-inner.cm-comment { color: rgb(170, 85, 0); }
|
|||
|
.cm-s-inner .cm-string-2 { color: rgb(255, 85, 0); }
|
|||
|
.cm-s-inner .cm-meta { color: rgb(85, 85, 85); }
|
|||
|
.cm-s-inner .cm-qualifier { color: rgb(85, 85, 85); }
|
|||
|
.cm-s-inner .cm-builtin { color: rgb(51, 0, 170); }
|
|||
|
.cm-s-inner .cm-bracket { color: rgb(153, 153, 119); }
|
|||
|
.cm-s-inner .cm-tag { color: rgb(17, 119, 0); }
|
|||
|
.cm-s-inner .cm-attribute { color: rgb(0, 0, 204); }
|
|||
|
.cm-s-inner .cm-header, .cm-s-inner.cm-header { color: rgb(0, 0, 255); }
|
|||
|
.cm-s-inner .cm-quote, .cm-s-inner.cm-quote { color: rgb(0, 153, 0); }
|
|||
|
.cm-s-inner .cm-hr, .cm-s-inner.cm-hr { color: rgb(153, 153, 153); }
|
|||
|
.cm-s-inner .cm-link, .cm-s-inner.cm-link { color: rgb(0, 0, 204); }
|
|||
|
.cm-negative { color: rgb(221, 68, 68); }
|
|||
|
.cm-positive { color: rgb(34, 153, 34); }
|
|||
|
.cm-header, .cm-strong { font-weight: 700; }
|
|||
|
.cm-del { text-decoration: line-through; }
|
|||
|
.cm-em { font-style: italic; }
|
|||
|
.cm-link { text-decoration: underline; }
|
|||
|
.cm-error { color: red; }
|
|||
|
.cm-invalidchar { color: red; }
|
|||
|
.cm-constant { color: rgb(38, 139, 210); }
|
|||
|
.cm-defined { color: rgb(181, 137, 0); }
|
|||
|
div.CodeMirror span.CodeMirror-matchingbracket { color: rgb(0, 255, 0); }
|
|||
|
div.CodeMirror span.CodeMirror-nonmatchingbracket { color: rgb(255, 34, 34); }
|
|||
|
.cm-s-inner .CodeMirror-activeline-background { background: inherit; }
|
|||
|
.CodeMirror { position: relative; overflow: hidden; }
|
|||
|
.CodeMirror-scroll { height: 100%; outline: 0px; position: relative; box-sizing: content-box; background: inherit; }
|
|||
|
.CodeMirror-sizer { position: relative; }
|
|||
|
.CodeMirror-gutter-filler, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-vscrollbar { position: absolute; z-index: 6; display: none; outline: 0px; }
|
|||
|
.CodeMirror-vscrollbar { right: 0px; top: 0px; overflow: hidden; }
|
|||
|
.CodeMirror-hscrollbar { bottom: 0px; left: 0px; overflow: auto hidden; }
|
|||
|
.CodeMirror-scrollbar-filler { right: 0px; bottom: 0px; }
|
|||
|
.CodeMirror-gutter-filler { left: 0px; bottom: 0px; }
|
|||
|
.CodeMirror-gutters { position: absolute; left: 0px; top: 0px; padding-bottom: 10px; z-index: 3; overflow-y: hidden; }
|
|||
|
.CodeMirror-gutter { white-space: normal; height: 100%; box-sizing: content-box; padding-bottom: 30px; margin-bottom: -32px; display: inline-block; }
|
|||
|
.CodeMirror-gutter-wrapper { position: absolute; z-index: 4; background: 0px 0px !important; border: none !important; }
|
|||
|
.CodeMirror-gutter-background { position: absolute; top: 0px; bottom: 0px; z-index: 4; }
|
|||
|
.CodeMirror-gutter-elt { position: absolute; cursor: default; z-index: 4; }
|
|||
|
.CodeMirror-lines { cursor: text; }
|
|||
|
.CodeMirror pre { border-radius: 0px; border-width: 0px; background: 0px 0px; font-family: inherit; font-size: inherit; margin: 0px; white-space: pre; overflow-wrap: normal; color: inherit; z-index: 2; position: relative; overflow: visible; }
|
|||
|
.CodeMirror-wrap pre { overflow-wrap: break-word; white-space: pre-wrap; word-break: normal; }
|
|||
|
.CodeMirror-code pre { border-right: 30px solid transparent; width: fit-content; }
|
|||
|
.CodeMirror-wrap .CodeMirror-code pre { border-right: none; width: auto; }
|
|||
|
.CodeMirror-linebackground { position: absolute; inset: 0px; z-index: 0; }
|
|||
|
.CodeMirror-linewidget { position: relative; z-index: 2; overflow: auto; }
|
|||
|
.CodeMirror-wrap .CodeMirror-scroll { overflow-x: hidden; }
|
|||
|
.CodeMirror-measure { position: absolute; width: 100%; height: 0px; overflow: hidden; visibility: hidden; }
|
|||
|
.CodeMirror-measure pre { position: static; }
|
|||
|
.CodeMirror div.CodeMirror-cursor { position: absolute; visibility: hidden; border-right: none; width: 0px; }
|
|||
|
.CodeMirror div.CodeMirror-cursor { visibility: hidden; }
|
|||
|
.CodeMirror-focused div.CodeMirror-cursor { visibility: inherit; }
|
|||
|
.cm-searching { background: rgba(255, 255, 0, 0.4); }
|
|||
|
span.cm-underlined { text-decoration: underline; }
|
|||
|
span.cm-strikethrough { text-decoration: line-through; }
|
|||
|
.cm-tw-syntaxerror { color: rgb(255, 255, 255); background-color: rgb(153, 0, 0); }
|
|||
|
.cm-tw-deleted { text-decoration: line-through; }
|
|||
|
.cm-tw-header5 { font-weight: 700; }
|
|||
|
.cm-tw-listitem:first-child { padding-left: 10px; }
|
|||
|
.cm-tw-box { border-style: solid; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-color: inherit; border-top-width: 0px !important; }
|
|||
|
.cm-tw-underline { text-decoration: underline; }
|
|||
|
@media print {
|
|||
|
.CodeMirror div.CodeMirror-cursor { visibility: hidden; }
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
:root {
|
|||
|
--side-bar-bg-color: #fafafa;
|
|||
|
--control-text-color: #777;
|
|||
|
}
|
|||
|
|
|||
|
@include-when-export url(https://fonts.loli.net/css?family=Open+Sans:400italic,700italic,700,400&subset=latin,latin-ext);
|
|||
|
|
|||
|
/* open-sans-regular - latin-ext_latin */
|
|||
|
/* open-sans-italic - latin-ext_latin */
|
|||
|
/* open-sans-700 - latin-ext_latin */
|
|||
|
/* open-sans-700italic - latin-ext_latin */
|
|||
|
html {
|
|||
|
font-size: 16px;
|
|||
|
-webkit-font-smoothing: antialiased;
|
|||
|
}
|
|||
|
|
|||
|
body {
|
|||
|
font-family: "Open Sans","Clear Sans", "Helvetica Neue", Helvetica, Arial, 'Segoe UI Emoji', sans-serif;
|
|||
|
color: rgb(51, 51, 51);
|
|||
|
line-height: 1.6;
|
|||
|
}
|
|||
|
|
|||
|
#write {
|
|||
|
max-width: 860px;
|
|||
|
margin: 0 auto;
|
|||
|
padding: 30px;
|
|||
|
padding-bottom: 100px;
|
|||
|
}
|
|||
|
|
|||
|
@media only screen and (min-width: 1400px) {
|
|||
|
#write {
|
|||
|
max-width: 1024px;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
@media only screen and (min-width: 1800px) {
|
|||
|
#write {
|
|||
|
max-width: 1200px;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
#write > ul:first-child,
|
|||
|
#write > ol:first-child{
|
|||
|
margin-top: 30px;
|
|||
|
}
|
|||
|
|
|||
|
a {
|
|||
|
color: #4183C4;
|
|||
|
}
|
|||
|
h1,
|
|||
|
h2,
|
|||
|
h3,
|
|||
|
h4,
|
|||
|
h5,
|
|||
|
h6 {
|
|||
|
position: relative;
|
|||
|
margin-top: 1rem;
|
|||
|
margin-bottom: 1rem;
|
|||
|
font-weight: bold;
|
|||
|
line-height: 1.4;
|
|||
|
cursor: text;
|
|||
|
}
|
|||
|
h1:hover a.anchor,
|
|||
|
h2:hover a.anchor,
|
|||
|
h3:hover a.anchor,
|
|||
|
h4:hover a.anchor,
|
|||
|
h5:hover a.anchor,
|
|||
|
h6:hover a.anchor {
|
|||
|
text-decoration: none;
|
|||
|
}
|
|||
|
h1 tt,
|
|||
|
h1 code {
|
|||
|
font-size: inherit;
|
|||
|
}
|
|||
|
h2 tt,
|
|||
|
h2 code {
|
|||
|
font-size: inherit;
|
|||
|
}
|
|||
|
h3 tt,
|
|||
|
h3 code {
|
|||
|
font-size: inherit;
|
|||
|
}
|
|||
|
h4 tt,
|
|||
|
h4 code {
|
|||
|
font-size: inherit;
|
|||
|
}
|
|||
|
h5 tt,
|
|||
|
h5 code {
|
|||
|
font-size: inherit;
|
|||
|
}
|
|||
|
h6 tt,
|
|||
|
h6 code {
|
|||
|
font-size: inherit;
|
|||
|
}
|
|||
|
h1 {
|
|||
|
font-size: 2.25em;
|
|||
|
line-height: 1.2;
|
|||
|
border-bottom: 1px solid #eee;
|
|||
|
}
|
|||
|
h2 {
|
|||
|
font-size: 1.75em;
|
|||
|
line-height: 1.225;
|
|||
|
border-bottom: 1px solid #eee;
|
|||
|
}
|
|||
|
|
|||
|
/*@media print {
|
|||
|
.typora-export h1,
|
|||
|
.typora-export h2 {
|
|||
|
border-bottom: none;
|
|||
|
padding-bottom: initial;
|
|||
|
}
|
|||
|
|
|||
|
.typora-export h1::after,
|
|||
|
.typora-export h2::after {
|
|||
|
content: "";
|
|||
|
display: block;
|
|||
|
height: 100px;
|
|||
|
margin-top: -96px;
|
|||
|
border-top: 1px solid #eee;
|
|||
|
}
|
|||
|
}*/
|
|||
|
|
|||
|
h3 {
|
|||
|
font-size: 1.5em;
|
|||
|
line-height: 1.43;
|
|||
|
}
|
|||
|
h4 {
|
|||
|
font-size: 1.25em;
|
|||
|
}
|
|||
|
h5 {
|
|||
|
font-size: 1em;
|
|||
|
}
|
|||
|
h6 {
|
|||
|
font-size: 1em;
|
|||
|
color: #777;
|
|||
|
}
|
|||
|
p,
|
|||
|
blockquote,
|
|||
|
ul,
|
|||
|
ol,
|
|||
|
dl,
|
|||
|
table{
|
|||
|
margin: 0.8em 0;
|
|||
|
}
|
|||
|
li>ol,
|
|||
|
li>ul {
|
|||
|
margin: 0 0;
|
|||
|
}
|
|||
|
hr {
|
|||
|
height: 2px;
|
|||
|
padding: 0;
|
|||
|
margin: 16px 0;
|
|||
|
background-color: #e7e7e7;
|
|||
|
border: 0 none;
|
|||
|
overflow: hidden;
|
|||
|
box-sizing: content-box;
|
|||
|
}
|
|||
|
|
|||
|
li p.first {
|
|||
|
display: inline-block;
|
|||
|
}
|
|||
|
ul,
|
|||
|
ol {
|
|||
|
padding-left: 30px;
|
|||
|
}
|
|||
|
ul:first-child,
|
|||
|
ol:first-child {
|
|||
|
margin-top: 0;
|
|||
|
}
|
|||
|
ul:last-child,
|
|||
|
ol:last-child {
|
|||
|
margin-bottom: 0;
|
|||
|
}
|
|||
|
blockquote {
|
|||
|
border-left: 4px solid #dfe2e5;
|
|||
|
padding: 0 15px;
|
|||
|
color: #777777;
|
|||
|
}
|
|||
|
blockquote blockquote {
|
|||
|
padding-right: 0;
|
|||
|
}
|
|||
|
table {
|
|||
|
padding: 0;
|
|||
|
word-break: initial;
|
|||
|
}
|
|||
|
table tr {
|
|||
|
border: 1px solid #dfe2e5;
|
|||
|
margin: 0;
|
|||
|
padding: 0;
|
|||
|
}
|
|||
|
table tr:nth-child(2n),
|
|||
|
thead {
|
|||
|
background-color: #f8f8f8;
|
|||
|
}
|
|||
|
table th {
|
|||
|
font-weight: bold;
|
|||
|
border: 1px solid #dfe2e5;
|
|||
|
border-bottom: 0;
|
|||
|
margin: 0;
|
|||
|
padding: 6px 13px;
|
|||
|
}
|
|||
|
table td {
|
|||
|
border: 1px solid #dfe2e5;
|
|||
|
margin: 0;
|
|||
|
padding: 6px 13px;
|
|||
|
}
|
|||
|
table th:first-child,
|
|||
|
table td:first-child {
|
|||
|
margin-top: 0;
|
|||
|
}
|
|||
|
table th:last-child,
|
|||
|
table td:last-child {
|
|||
|
margin-bottom: 0;
|
|||
|
}
|
|||
|
|
|||
|
.CodeMirror-lines {
|
|||
|
padding-left: 4px;
|
|||
|
}
|
|||
|
|
|||
|
.code-tooltip {
|
|||
|
box-shadow: 0 1px 1px 0 rgba(0,28,36,.3);
|
|||
|
border-top: 1px solid #eef2f2;
|
|||
|
}
|
|||
|
|
|||
|
.md-fences,
|
|||
|
code,
|
|||
|
tt {
|
|||
|
border: 1px solid #e7eaed;
|
|||
|
background-color: #f8f8f8;
|
|||
|
border-radius: 3px;
|
|||
|
padding: 0;
|
|||
|
padding: 2px 4px 0px 4px;
|
|||
|
font-size: 0.9em;
|
|||
|
}
|
|||
|
|
|||
|
code {
|
|||
|
background-color: #f3f4f4;
|
|||
|
padding: 0 2px 0 2px;
|
|||
|
}
|
|||
|
|
|||
|
.md-fences {
|
|||
|
margin-bottom: 15px;
|
|||
|
margin-top: 15px;
|
|||
|
padding-top: 8px;
|
|||
|
padding-bottom: 6px;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
.md-task-list-item > input {
|
|||
|
margin-left: -1.3em;
|
|||
|
}
|
|||
|
|
|||
|
@media print {
|
|||
|
html {
|
|||
|
font-size: 13px;
|
|||
|
}
|
|||
|
table,
|
|||
|
pre {
|
|||
|
page-break-inside: avoid;
|
|||
|
}
|
|||
|
pre {
|
|||
|
word-wrap: break-word;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
.md-fences {
|
|||
|
background-color: #f8f8f8;
|
|||
|
}
|
|||
|
#write pre.md-meta-block {
|
|||
|
padding: 1rem;
|
|||
|
font-size: 85%;
|
|||
|
line-height: 1.45;
|
|||
|
background-color: #f7f7f7;
|
|||
|
border: 0;
|
|||
|
border-radius: 3px;
|
|||
|
color: #777777;
|
|||
|
margin-top: 0 !important;
|
|||
|
}
|
|||
|
|
|||
|
.mathjax-block>.code-tooltip {
|
|||
|
bottom: .375rem;
|
|||
|
}
|
|||
|
|
|||
|
.md-mathjax-midline {
|
|||
|
background: #fafafa;
|
|||
|
}
|
|||
|
|
|||
|
#write>h3.md-focus:before{
|
|||
|
left: -1.5625rem;
|
|||
|
top: .375rem;
|
|||
|
}
|
|||
|
#write>h4.md-focus:before{
|
|||
|
left: -1.5625rem;
|
|||
|
top: .285714286rem;
|
|||
|
}
|
|||
|
#write>h5.md-focus:before{
|
|||
|
left: -1.5625rem;
|
|||
|
top: .285714286rem;
|
|||
|
}
|
|||
|
#write>h6.md-focus:before{
|
|||
|
left: -1.5625rem;
|
|||
|
top: .285714286rem;
|
|||
|
}
|
|||
|
.md-image>.md-meta {
|
|||
|
/*border: 1px solid #ddd;*/
|
|||
|
border-radius: 3px;
|
|||
|
padding: 2px 0px 0px 4px;
|
|||
|
font-size: 0.9em;
|
|||
|
color: inherit;
|
|||
|
}
|
|||
|
|
|||
|
.md-tag {
|
|||
|
color: #a7a7a7;
|
|||
|
opacity: 1;
|
|||
|
}
|
|||
|
|
|||
|
.md-toc {
|
|||
|
margin-top:20px;
|
|||
|
padding-bottom:20px;
|
|||
|
}
|
|||
|
|
|||
|
.sidebar-tabs {
|
|||
|
border-bottom: none;
|
|||
|
}
|
|||
|
|
|||
|
#typora-quick-open {
|
|||
|
border: 1px solid #ddd;
|
|||
|
background-color: #f8f8f8;
|
|||
|
}
|
|||
|
|
|||
|
#typora-quick-open-item {
|
|||
|
background-color: #FAFAFA;
|
|||
|
border-color: #FEFEFE #e5e5e5 #e5e5e5 #eee;
|
|||
|
border-style: solid;
|
|||
|
border-width: 1px;
|
|||
|
}
|
|||
|
|
|||
|
/** focus mode */
|
|||
|
.on-focus-mode blockquote {
|
|||
|
border-left-color: rgba(85, 85, 85, 0.12);
|
|||
|
}
|
|||
|
|
|||
|
header, .context-menu, .megamenu-content, footer{
|
|||
|
font-family: "Segoe UI", "Arial", sans-serif;
|
|||
|
}
|
|||
|
|
|||
|
.file-node-content:hover .file-node-icon,
|
|||
|
.file-node-content:hover .file-node-open-state{
|
|||
|
visibility: visible;
|
|||
|
}
|
|||
|
|
|||
|
.mac-seamless-mode #typora-sidebar {
|
|||
|
background-color: #fafafa;
|
|||
|
background-color: var(--side-bar-bg-color);
|
|||
|
}
|
|||
|
|
|||
|
.md-lang {
|
|||
|
color: #b4654d;
|
|||
|
}
|
|||
|
|
|||
|
/*.html-for-mac {
|
|||
|
--item-hover-bg-color: #E6F0FE;
|
|||
|
}*/
|
|||
|
|
|||
|
#md-notification .btn {
|
|||
|
border: 0;
|
|||
|
}
|
|||
|
|
|||
|
.dropdown-menu .divider {
|
|||
|
border-color: #e5e5e5;
|
|||
|
opacity: 0.4;
|
|||
|
}
|
|||
|
|
|||
|
.ty-preferences .window-content {
|
|||
|
background-color: #fafafa;
|
|||
|
}
|
|||
|
|
|||
|
.ty-preferences .nav-group-item.active {
|
|||
|
color: white;
|
|||
|
background: #999;
|
|||
|
}
|
|||
|
|
|||
|
.menu-item-container a.menu-style-btn {
|
|||
|
background-color: #f5f8fa;
|
|||
|
background-image: linear-gradient( 180deg , hsla(0, 0%, 100%, 0.8), hsla(0, 0%, 100%, 0));
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
mjx-container[jax="SVG"] {
|
|||
|
direction: ltr;
|
|||
|
}
|
|||
|
|
|||
|
mjx-container[jax="SVG"] > svg {
|
|||
|
overflow: visible;
|
|||
|
min-height: 1px;
|
|||
|
min-width: 1px;
|
|||
|
}
|
|||
|
|
|||
|
mjx-container[jax="SVG"] > svg a {
|
|||
|
fill: blue;
|
|||
|
stroke: blue;
|
|||
|
}
|
|||
|
|
|||
|
mjx-assistive-mml {
|
|||
|
position: absolute !important;
|
|||
|
top: 0px;
|
|||
|
left: 0px;
|
|||
|
clip: rect(1px, 1px, 1px, 1px);
|
|||
|
padding: 1px 0px 0px 0px !important;
|
|||
|
border: 0px !important;
|
|||
|
display: block !important;
|
|||
|
width: auto !important;
|
|||
|
overflow: hidden !important;
|
|||
|
-webkit-touch-callout: none;
|
|||
|
-webkit-user-select: none;
|
|||
|
-khtml-user-select: none;
|
|||
|
-moz-user-select: none;
|
|||
|
-ms-user-select: none;
|
|||
|
user-select: none;
|
|||
|
}
|
|||
|
|
|||
|
mjx-assistive-mml[display="block"] {
|
|||
|
width: 100% !important;
|
|||
|
}
|
|||
|
|
|||
|
mjx-container[jax="SVG"][display="true"] {
|
|||
|
display: block;
|
|||
|
text-align: center;
|
|||
|
margin: 1em 0;
|
|||
|
}
|
|||
|
|
|||
|
mjx-container[jax="SVG"][display="true"][width="full"] {
|
|||
|
display: flex;
|
|||
|
}
|
|||
|
|
|||
|
mjx-container[jax="SVG"][justify="left"] {
|
|||
|
text-align: left;
|
|||
|
}
|
|||
|
|
|||
|
mjx-container[jax="SVG"][justify="right"] {
|
|||
|
text-align: right;
|
|||
|
}
|
|||
|
|
|||
|
g[data-mml-node="merror"] > g {
|
|||
|
fill: red;
|
|||
|
stroke: red;
|
|||
|
}
|
|||
|
|
|||
|
g[data-mml-node="merror"] > rect[data-background] {
|
|||
|
fill: yellow;
|
|||
|
stroke: none;
|
|||
|
}
|
|||
|
|
|||
|
g[data-mml-node="mtable"] > line[data-line], svg[data-table] > g > line[data-line] {
|
|||
|
stroke-width: 70px;
|
|||
|
fill: none;
|
|||
|
}
|
|||
|
|
|||
|
g[data-mml-node="mtable"] > rect[data-frame], svg[data-table] > g > rect[data-frame] {
|
|||
|
stroke-width: 70px;
|
|||
|
fill: none;
|
|||
|
}
|
|||
|
|
|||
|
g[data-mml-node="mtable"] > .mjx-dashed, svg[data-table] > g > .mjx-dashed {
|
|||
|
stroke-dasharray: 140;
|
|||
|
}
|
|||
|
|
|||
|
g[data-mml-node="mtable"] > .mjx-dotted, svg[data-table] > g > .mjx-dotted {
|
|||
|
stroke-linecap: round;
|
|||
|
stroke-dasharray: 0,140;
|
|||
|
}
|
|||
|
|
|||
|
g[data-mml-node="mtable"] > g > svg {
|
|||
|
overflow: visible;
|
|||
|
}
|
|||
|
|
|||
|
[jax="SVG"] mjx-tool {
|
|||
|
display: inline-block;
|
|||
|
position: relative;
|
|||
|
width: 0;
|
|||
|
height: 0;
|
|||
|
}
|
|||
|
|
|||
|
[jax="SVG"] mjx-tool > mjx-tip {
|
|||
|
position: absolute;
|
|||
|
top: 0;
|
|||
|
left: 0;
|
|||
|
}
|
|||
|
|
|||
|
mjx-tool > mjx-tip {
|
|||
|
display: inline-block;
|
|||
|
padding: .2em;
|
|||
|
border: 1px solid #888;
|
|||
|
font-size: 70%;
|
|||
|
background-color: #F8F8F8;
|
|||
|
color: black;
|
|||
|
box-shadow: 2px 2px 5px #AAAAAA;
|
|||
|
}
|
|||
|
|
|||
|
g[data-mml-node="maction"][data-toggle] {
|
|||
|
cursor: pointer;
|
|||
|
}
|
|||
|
|
|||
|
mjx-status {
|
|||
|
display: block;
|
|||
|
position: fixed;
|
|||
|
left: 1em;
|
|||
|
bottom: 1em;
|
|||
|
min-width: 25%;
|
|||
|
padding: .2em .4em;
|
|||
|
border: 1px solid #888;
|
|||
|
font-size: 90%;
|
|||
|
background-color: #F8F8F8;
|
|||
|
color: black;
|
|||
|
}
|
|||
|
|
|||
|
foreignObject[data-mjx-xml] {
|
|||
|
font-family: initial;
|
|||
|
line-height: normal;
|
|||
|
overflow: visible;
|
|||
|
}
|
|||
|
|
|||
|
mjx-container[jax="SVG"] path[data-c], mjx-container[jax="SVG"] use[data-c] {
|
|||
|
stroke-width: 3;
|
|||
|
}
|
|||
|
|
|||
|
g[data-mml-node="xypic"] path {
|
|||
|
stroke-width: inherit;
|
|||
|
}
|
|||
|
|
|||
|
.MathJax g[data-mml-node="xypic"] path {
|
|||
|
stroke-width: inherit;
|
|||
|
}
|
|||
|
|
|||
|
</style><title>zadanie_2</title>
|
|||
|
</head>
|
|||
|
<body class='typora-export os-windows'><div class='typora-export-content'>
|
|||
|
<div id='write' class=''><h1 id='interpolacja-kwaternionów-1'><span>Interpolacja kwaternionów</span></h1><p><span>Celem tego zadania jest przećwiczenie interpolacji obrotów przy użyciu kwaternionów. </span></p><h2 id='opis-projektu'><span>Opis projektu </span></h2><p><span>Plik </span><code>main7</code><span> rysuje futurystyczne miasto i latające samochody, które startują z jednego wieżowca, okrążają miasto i lądują na drugim. Jeżeli rysowanie miasta jest zbyt wymagające dla komputera, to w funkcji </span><code>initModels</code><span> można podmienić model na mniej złożony, zmniejszenie wartości dla multisamplingu też powinno poprawić wydajność (linijka </span><code>glutSetOption(GLUT_MULTISAMPLE, 4);</code><span>). Do ładowania obiektów jest wykorzystywana biblioteka Assimp z prostą obsługą materiałów. </span></p><p><span>Statki poruszają się po krzywej wyznaczonej przez punkty kontrolne zapisane w </span><code>keyPoints</code><span> i interpolowane liniowo. Nie mają one zdefiniowanych obrotów, zadaniem jest wyliczenie im obrotów. </span></p><p><span>Dla łatwiejszego debugowania kamera została rozwinięta o następujące opcje:</span></p><ul><li><span>obroty przy pomocy kwaternionów </span></li><li><span>przyciski </span><strong><span>q</span></strong><span> i </span><strong><span>e</span></strong><span> przenoszą kamerę w okolicę następnego/poprzedniego punktu kontrolnego</span></li><li><span>przycisk </span><strong><span>0</span></strong><span> przenosi do pierwszego punktu kontrolnego</span></li><li><span>przycisk </span><strong><span>1</span></strong><span> przyczepia kamerę do statku. </span></li></ul><h1 id='materiały-i-graf-sceny'><span>Materiały i graf sceny</span></h1><h2 id='import'><span>Import</span></h2><p><span>modele które importujemy w trakcie tych zajęć mają rozszerzenie </span><strong><span>fbx</span></strong><span> są to dużo bardziej skomplikowane pliki, mogą one zawierać więcej niż jeden </span><em><span>mesh</span></em><span> lokalne macierze transformacji i informację o materiałach. </span></p><h2 id='materiały'><span>Materiały</span></h2><p><span>Do tej pory ręcznie wybieraliśmy program, którym rysowaliśmy. wiązało się to z tym, że trzeba było pamiętać jakie parametry należy przesłać do danego obiektu. Rozwiązaniem jest przechowywanie w materiałach. W projekcie w klasie </span><code>RenderContext</code><span> jest wskaźnik na zmienną typu </span><code>Material</code><span>, której zadaniem jest przechowywanie tej informacji.</span></p><h2 id='graf-sceny'><span>Graf sceny</span></h2><p><span>Sceny w bardziej złożonych projektach potrafią być skomplikowane. Obiekty w scenie są umieszczane hierarchicznie. przykładowo bohater posiada ręce, które poruszają się razem z nim (z reguły) jednak mogą same z siebie się poruszać, gdy postać atakuje. w ręku tej postaci może znajdować się miecz lub inna broń i ta broń będzie poruszać zawsze gdy bohater się się będzie przemieszczać, ale też gdy się zamachnie. W poprzednich projektach przykładem takich zależności była planeta i krążący wokół niej księżyc. Takich zależności może być więcej i pamiętanie wszystkich poprzednich interakcji staje się kłopotliwe. Rozwiązaniem, które pozwala wprowadzić taką hierarchię jest graf sceny. Graf sceny jest drzewem, w którym każdy węzeł jest jakimś obiektem w grze oraz zawiera informację o lokalnej transformacji względem obiektu nadrzędnego-ojca. To rozwiązanie pozwala myśleć tylko o lokalnych transformacjach, a globalne pobrać z nadrzędnych węzłów. </span></p><h3 ><span> </span></h3><p><span>W naszym projekcie graf sceny jest zrealizowany w formie tablicy. To znaczy w projekcie znajdują się 2 tablice </span><code>city</code><span> i </span><code>car</code><span>. Odpowiadają one za grafy dla miasta i pojazdu, jak nazwa wskazuje. Tablice zawierają struktury </span><code>Core::Node</code><span>:</span></p><pre class="md-fences md-end-block ty-contain-cm modeLoaded" spellchec
|
|||
|
<span>Nastęnie należy obliczyć kwaterniony odpowiadające za obrót z początkowej orientacji statku (opisywanej przez wektor (0,0,1)) do orientaci wyznaczonej przez wektory kietunkowe.</span>
|
|||
|
<span>Żeby obliczyć obrót między jednym wektorem a drugim, należy obliczyć oś obrotu, oblicza się go za pomocą iloczynu wektorowego, oraz kąt obrotu, oblicza się za pomocą iloczynu skalarnego. </span>
|
|||
|
<span>Może być kuszące policzenie wektora obrotu pomiędzy początkowym wektorem kierunkowym a kolejnymi wektorami, ale takie rozwiązanie może prowadzić do niepożądanych zachowań. Dlatego należy obliczać obroty pomiędzy kolejnymi wektorami i je akumulować.</span></p><h3 id='zadanie-2'><span>Zadanie</span></h3><p><span>Uzupełnij funkcję </span><code>initKeyRoation</code><span> o wypełnienie </span><code>std::vector<glm::quat> keyRotation</code><span> kwaternionami. </span></p><ol start='' ><li><p><span>Zainicjalizuj zmienną </span><code>glm::vec3 oldDirection</code><span> wektorem o współrzędnych (0,0,1), czyli początkowej orientacji pojazdu</span></p></li><li><p><span>Zainicjalizuj zmienną </span><code>glm::quat oldRotationCamera</code><span> kwaternionem identycznościom (1,0,0,0).</span></p></li><li><p><span>W pętli for po i od 0 do liczba keyPoints odjąć 1.</span></p><ol start='' ><li><span>Oblicz nowy kierunek: odejmij od punktu końcowego: </span><code>keyPoints[i+1]</code><span> punkt początkowy: </span><code>keyPoints[i]</code><span>.</span></li><li><span>Oblicz nową rotację, skorzystaj z funkcji </span><code>glm::rotationCamera</code><span> przemnóż jej wynik przez </span><code>oldRotationCamera</code><span> od prawej i całość znormalizuj.</span></li><li><span>Dodaj nowy obrót do </span><code>keyRotation</code><span>.</span></li><li><span>Podmień </span><code>oldDritection</code><span> na nowy kierunek i </span><code>oldRotationCamera</code><span> na nowy obrót.</span></li></ol></li><li><p><span>Po wszystkim kwaternionów jest o jeden mniej niż punktów dodaj jeszcze jeden o wartościach (1,0,0,0) na koniec.</span></p></li></ol><h2 id='interpolacja-2'><span>Interpolacja </span></h2><p><span>Do interpolacji użyjemy funkcji </span><code>slerp</code><span> opisanej wzorem</span></p><p><mjx-container class="MathJax" jax="SVG" style="position: relative;"><svg xmlns="http://www.w3.org/2000/svg" width="41.164ex" height="3.607ex" role="img" focusable="false" viewBox="0 -1047.1 18194.6 1594.2" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" style="vertical-align: -1.238ex;"><defs><path id="MJX-19-TEX-I-1D460" d="M131 289Q131 321 147 354T203 415T300 442Q362 442 390 415T419 355Q419 323 402 308T364 292Q351 292 340 300T328 326Q328 342 337 354T354 372T367 378Q368 378 368 379Q368 382 361 388T336 399T297 405Q249 405 227 379T204 326Q204 301 223 291T278 274T330 259Q396 230 396 163Q396 135 385 107T352 51T289 7T195 -10Q118 -10 86 19T53 87Q53 126 74 143T118 160Q133 160 146 151T160 120Q160 94 142 76T111 58Q109 57 108 57T107 55Q108 52 115 47T146 34T201 27Q237 27 263 38T301 66T318 97T323 122Q323 150 302 164T254 181T195 196T148 231Q131 256 131 289Z"></path><path id="MJX-19-TEX-I-1D459" d="M117 59Q117 26 142 26Q179 26 205 131Q211 151 215 152Q217 153 225 153H229Q238 153 241 153T246 151T248 144Q247 138 245 128T234 90T214 43T183 6T137 -11Q101 -11 70 11T38 85Q38 97 39 102L104 360Q167 615 167 623Q167 626 166 628T162 632T157 634T149 635T141 636T132 637T122 637Q112 637 109 637T101 638T95 641T94 647Q94 649 96 661Q101 680 107 682T179 688Q194 689 213 690T243 693T254 694Q266 694 266 686Q266 675 193 386T118 83Q118 81 118 75T117 65V59Z"></path><path id="MJX-19-TEX-I-1D452" d="M39 168Q39 225 58 272T107 350T174 402T244 433T307 442H310Q355 442 388 420T421 355Q421 265 310 237Q261 224 176 223Q139 223 138 221Q138 219 132 186T125 128Q125 81 146 54T209 26T302 45T394 111Q403 121 406 121Q410 121 419 112T429 98T420 82T390 55T344 24T281 -1T205 -11Q126 -11 83 42T39 168ZM373 353Q367 405 305 405Q272 405 244 391T199 357T170 316T154 280T149 261Q149 260 169 260Q282 260 327 284T373 353Z"></path><path id="MJX-19-TEX-I-1D45F" d="M21 287Q22 290 23 295T28 317T38 348T53 381T73 411T99 433T132 442Q161 442 183 430T214 408T225 388Q227 382 228 382T236 389Q284 441 347 441H350Q398 441 422 400Q430 381 430 363Q430 333 417 315T391 292T366 288Q346 288 334 299T322 328Q322 376 378 392Q356 405 342 405Q286 405 239 331Q229 315 224 298T190 165Q156 25 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 114 189T154 366Q154 405 128 405
|
|||
|
<mjx-container class="MathJax" jax="SVG" style="position: relative;"><svg xmlns="http://www.w3.org/2000/svg" width="32.597ex" height="2.237ex" role="img" focusable="false" viewBox="0 -694 14408 989" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" style="vertical-align: -0.667ex;"><defs><path id="MJX-23-TEX-I-1D450" d="M34 159Q34 268 120 355T306 442Q362 442 394 418T427 355Q427 326 408 306T360 285Q341 285 330 295T319 325T330 359T352 380T366 386H367Q367 388 361 392T340 400T306 404Q276 404 249 390Q228 381 206 359Q162 315 142 235T121 119Q121 73 147 50Q169 26 205 26H209Q321 26 394 111Q403 121 406 121Q410 121 419 112T429 98T420 83T391 55T346 25T282 0T202 -11Q127 -11 81 37T34 159Z"></path><path id="MJX-23-TEX-I-1D45C" d="M201 -11Q126 -11 80 38T34 156Q34 221 64 279T146 380Q222 441 301 441Q333 441 341 440Q354 437 367 433T402 417T438 387T464 338T476 268Q476 161 390 75T201 -11ZM121 120Q121 70 147 48T206 26Q250 26 289 58T351 142Q360 163 374 216T388 308Q388 352 370 375Q346 405 306 405Q243 405 195 347Q158 303 140 230T121 120Z"></path><path id="MJX-23-TEX-I-1D460" d="M131 289Q131 321 147 354T203 415T300 442Q362 442 390 415T419 355Q419 323 402 308T364 292Q351 292 340 300T328 326Q328 342 337 354T354 372T367 378Q368 378 368 379Q368 382 361 388T336 399T297 405Q249 405 227 379T204 326Q204 301 223 291T278 274T330 259Q396 230 396 163Q396 135 385 107T352 51T289 7T195 -10Q118 -10 86 19T53 87Q53 126 74 143T118 160Q133 160 146 151T160 120Q160 94 142 76T111 58Q109 57 108 57T107 55Q108 52 115 47T146 34T201 27Q237 27 263 38T301 66T318 97T323 122Q323 150 302 164T254 181T195 196T148 231Q131 256 131 289Z"></path><path id="MJX-23-TEX-I-1D719" d="M409 688Q413 694 421 694H429H442Q448 688 448 686Q448 679 418 563Q411 535 404 504T392 458L388 442Q388 441 397 441T429 435T477 418Q521 397 550 357T579 260T548 151T471 65T374 11T279 -10H275L251 -105Q245 -128 238 -160Q230 -192 227 -198T215 -205H209Q189 -205 189 -198Q189 -193 211 -103L234 -11Q234 -10 226 -10Q221 -10 206 -8T161 6T107 36T62 89T43 171Q43 231 76 284T157 370T254 422T342 441Q347 441 348 445L378 567Q409 686 409 688ZM122 150Q122 116 134 91T167 53T203 35T237 27H244L337 404Q333 404 326 403T297 395T255 379T211 350T170 304Q152 276 137 237Q122 191 122 150ZM500 282Q500 320 484 347T444 385T405 400T381 404H378L332 217L284 29Q284 27 285 27Q293 27 317 33T357 47Q400 66 431 100T475 170T494 234T500 282Z"></path><path id="MJX-23-TEX-N-3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z"></path><path id="MJX-23-TEX-I-1D45E" d="M33 157Q33 258 109 349T280 441Q340 441 372 389Q373 390 377 395T388 406T404 418Q438 442 450 442Q454 442 457 439T460 434Q460 425 391 149Q320 -135 320 -139Q320 -147 365 -148H390Q396 -156 396 -157T393 -175Q389 -188 383 -194H370Q339 -192 262 -192Q234 -192 211 -192T174 -192T157 -193Q143 -193 143 -185Q143 -182 145 -170Q149 -154 152 -151T172 -148Q220 -148 230 -141Q238 -136 258 -53T279 32Q279 33 272 29Q224 -10 172 -10Q117 -10 75 30T33 157ZM352 326Q329 405 277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q233 26 290 98L298 109L352 326Z"></path><path id="MJX-23-TEX-I-1D465" d="M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z"></path><path id="MJX-23-TEX-I-1D45F" d="M21 287Q22 290 23 295T28 317T38 348T53 381T73 411T99 433T132 442Q161 442 183 430T214 408T225 388Q227 382 228 382T236 389Q284 441 347 441H350Q398 441 422 400Q430 381 430 363Q430 333 417 315T3
|
|||
|
</span></span></pre></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-variable">glm::mat4</span> <span class="cm-def">animationMatrix</span>(<span class="cm-variable-3">float</span> <span class="cm-variable">time</span>) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> ...</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-comment">//index of first keyPoint</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-variable-3">int</span> <span class="cm-variable">index</span> <span class="cm-operator">=</span> <span class="cm-number">0</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
|
|||
|
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-keyword">while</span> (<span class="cm-variable">distances</span>[<span class="cm-variable">index</span>] <span class="cm-operator"><=</span> <span class="cm-variable">time</span>) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-variable">time</span> <span class="cm-operator">=</span> <span class="cm-variable">time</span> <span class="cm-operator">-</span> <span class="cm-variable">distances</span>[<span class="cm-variable">index</span>];</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-variable">index</span> <span class="cm-operator">+=</span> <span class="cm-number">1</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span>}</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
|
|||
|
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-comment">//t coefitient between 0 and 1 for interpolation</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-variable-3">float</span> <span class="cm-variable">t</span> <span class="cm-operator">=</span> <span class="cm-variable">time</span> <span class="cm-operator">/</span> <span class="cm-variable">distances</span>[<span class="cm-variable">index</span>];</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> ...</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-comment">//implement corect animation</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-keyword">auto</span> <span class="cm-variable">animationRotation</span> <span class="cm-operator">=</span> <span class="cm-variable">glm::quat</span>(<span class="cm-number">1</span>,<span class="cm-number">0</span>,<span class="cm-number">0</span>,<span class="cm-number">0</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
|
|||
|
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-variable">glm::mat4</span> <span class="cm-variable">result</span> <span class="cm-operator">=</span> <span class="cm-variable">glm::translate</span>(<span class="cm-variable">pos</span>) <span class="cm-operator">*</span> <span class="cm-variable">glm::mat4_cast</span>(<span class="cm-variable">animationRotation</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
|
|||
|
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
|
|||
|
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-keyword">return</span> <span class="cm-variable">result</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
|
|||
|
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;">}</span></pre></div></div></div></div></div><div style="position: absolute; height: 0px; width: 1px; border-bottom: 0px solid transparent; top: 529px;"></div><div class="CodeMirror-gutters" style="display: none; height: 529px;"></div></div></div></pre><p><span>Pobierz z </span><code>keyRotation</code><span> kwaterniony o indeksach </span><code>index</code><span> i </span><code>index+1</code><span> wywołaj </span><code>glm::slerp</code><span> z nimi jako argumentami. Trzecim parametrem powinna być wartość </span><code>t</code><span>.</span></p><blockquote><p><span>Uwaga! pobierając wartości z wektora </span><code>keyRotation</code><span> pamiętaj, żeby nie wyjść poza jego zakres, najlepiej weż maksimum z indeksu i zera oraz minimum z indeksu i rozmiaru wektora.</span></p></blockquote><p><span>Otrzymana animacja będzie ciągła, ale w punktach kontrolnych będzie widoczne szarpnięcie wywołane przez to, że funkcja slerp nie jest gładka, gdy przechodzimy do kolejnej pary kwaternionów. By zniwelować ten efekt użyjemy funkcji </span><code>glm::squat</code><span>.</span></p><p><span>Funkcja squat podobnie jak Catmull-Rom przyjmuje 4 wartości jednak zamiast przyjmować 4 kolejne wektory, przyjmuje 2 kwaterniony interpolowane i 2 kwaterniony pośrednie. opisana jes</span>
|
|||
|
<span>t wzorem:</span></p><p><mjx-container class="MathJax" jax="SVG" style="position: relative;"><svg xmlns="http://www.w3.org/2000/svg" width="74.523ex" height="2.398ex" role="img" focusable="false" viewBox="0 -810 32939 1060" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" style="vertical-align: -0.566ex;"><defs><path id="MJX-25-TEX-I-1D460" d="M131 289Q131 321 147 354T203 415T300 442Q362 442 390 415T419 355Q419 323 402 308T364 292Q351 292 340 300T328 326Q328 342 337 354T354 372T367 378Q368 378 368 379Q368 382 361 388T336 399T297 405Q249 405 227 379T204 326Q204 301 223 291T278 274T330 259Q396 230 396 163Q396 135 385 107T352 51T289 7T195 -10Q118 -10 86 19T53 87Q53 126 74 143T118 160Q133 160 146 151T160 120Q160 94 142 76T111 58Q109 57 108 57T107 55Q108 52 115 47T146 34T201 27Q237 27 263 38T301 66T318 97T323 122Q323 150 302 164T254 181T195 196T148 231Q131 256 131 289Z"></path><path id="MJX-25-TEX-I-1D45E" d="M33 157Q33 258 109 349T280 441Q340 441 372 389Q373 390 377 395T388 406T404 418Q438 442 450 442Q454 442 457 439T460 434Q460 425 391 149Q320 -135 320 -139Q320 -147 365 -148H390Q396 -156 396 -157T393 -175Q389 -188 383 -194H370Q339 -192 262 -192Q234 -192 211 -192T174 -192T157 -193Q143 -193 143 -185Q143 -182 145 -170Q149 -154 152 -151T172 -148Q220 -148 230 -141Q238 -136 258 -53T279 32Q279 33 272 29Q224 -10 172 -10Q117 -10 75 30T33 157ZM352 326Q329 405 277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q233 26 290 98L298 109L352 326Z"></path><path id="MJX-25-TEX-I-1D462" d="M21 287Q21 295 30 318T55 370T99 420T158 442Q204 442 227 417T250 358Q250 340 216 246T182 105Q182 62 196 45T238 27T291 44T328 78L339 95Q341 99 377 247Q407 367 413 387T427 416Q444 431 463 431Q480 431 488 421T496 402L420 84Q419 79 419 68Q419 43 426 35T447 26Q469 29 482 57T512 145Q514 153 532 153Q551 153 551 144Q550 139 549 130T540 98T523 55T498 17T462 -8Q454 -10 438 -10Q372 -10 347 46Q345 45 336 36T318 21T296 6T267 -6T233 -11Q189 -11 155 7Q103 38 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Z"></path><path id="MJX-25-TEX-I-1D44E" d="M33 157Q33 258 109 349T280 441Q331 441 370 392Q386 422 416 422Q429 422 439 414T449 394Q449 381 412 234T374 68Q374 43 381 35T402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487Q506 153 506 144Q506 138 501 117T481 63T449 13Q436 0 417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157ZM351 328Q351 334 346 350T323 385T277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q217 26 254 59T298 110Q300 114 325 217T351 328Z"></path><path id="MJX-25-TEX-I-1D451" d="M366 683Q367 683 438 688T511 694Q523 694 523 686Q523 679 450 384T375 83T374 68Q374 26 402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487H491Q506 153 506 145Q506 140 503 129Q490 79 473 48T445 8T417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157Q33 205 53 255T101 341Q148 398 195 420T280 442Q336 442 364 400Q369 394 369 396Q370 400 396 505T424 616Q424 629 417 632T378 637H357Q351 643 351 645T353 664Q358 683 366 683ZM352 326Q329 405 277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q233 26 290 98L298 109L352 326Z"></path><path id="MJX-25-TEX-N-28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z"></path><path id="MJX-25-TEX-N-5E" d="M112 560L249 694L257 686Q387 562 387 560L361 531Q359 532 303 581L250 627L195 580Q182 569 169 557T148 538L140 532Q138 530 125 546L112 560Z"></path><path id="MJX-25-TEX-I-1D456" d="M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 23
|
|||
|
</body>
|
|||
|
</html>
|