mirror of
https://gitlab.com/Anson-Projects/projects.git
synced 2025-06-15 22:46:48 +00:00
1610 lines
56 KiB
HTML
1610 lines
56 KiB
HTML
<!DOCTYPE html>
|
||
|
||
<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
|
||
|
||
<head>
|
||
<meta charset="utf-8"/>
|
||
<meta name="viewport" content="width=device-width, initial-scale=1"/>
|
||
<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1"/>
|
||
<meta name="generator" content="distill" />
|
||
|
||
<style type="text/css">
|
||
/* Hide doc at startup (prevent jankiness while JS renders/transforms) */
|
||
body {
|
||
visibility: hidden;
|
||
}
|
||
</style>
|
||
|
||
<!--radix_placeholder_import_source-->
|
||
<!--/radix_placeholder_import_source-->
|
||
|
||
<style type="text/css">code{white-space: pre;}</style>
|
||
<style type="text/css" data-origin="pandoc">
|
||
pre > code.sourceCode { white-space: pre; position: relative; }
|
||
pre > code.sourceCode > span { display: inline-block; line-height: 1.25; }
|
||
pre > code.sourceCode > span:empty { height: 1.2em; }
|
||
.sourceCode { overflow: visible; }
|
||
code.sourceCode > span { color: inherit; text-decoration: inherit; }
|
||
div.sourceCode { margin: 1em 0; }
|
||
pre.sourceCode { margin: 0; }
|
||
@media screen {
|
||
div.sourceCode { overflow: auto; }
|
||
}
|
||
@media print {
|
||
pre > code.sourceCode { white-space: pre-wrap; }
|
||
pre > code.sourceCode > span { text-indent: -5em; padding-left: 5em; }
|
||
}
|
||
pre.numberSource code
|
||
{ counter-reset: source-line 0; }
|
||
pre.numberSource code > span
|
||
{ position: relative; left: -4em; counter-increment: source-line; }
|
||
pre.numberSource code > span > a:first-child::before
|
||
{ content: counter(source-line);
|
||
position: relative; left: -1em; text-align: right; vertical-align: baseline;
|
||
border: none; display: inline-block;
|
||
-webkit-touch-callout: none; -webkit-user-select: none;
|
||
-khtml-user-select: none; -moz-user-select: none;
|
||
-ms-user-select: none; user-select: none;
|
||
padding: 0 4px; width: 4em;
|
||
color: #aaaaaa;
|
||
}
|
||
pre.numberSource { margin-left: 3em; border-left: 1px solid #aaaaaa; padding-left: 4px; }
|
||
div.sourceCode
|
||
{ }
|
||
@media screen {
|
||
pre > code.sourceCode > span > a:first-child::before { text-decoration: underline; }
|
||
}
|
||
code span.al { color: #ad0000; } /* Alert */
|
||
code span.an { color: #5e5e5e; } /* Annotation */
|
||
code span.at { } /* Attribute */
|
||
code span.bn { color: #ad0000; } /* BaseN */
|
||
code span.bu { } /* BuiltIn */
|
||
code span.cf { color: #007ba5; } /* ControlFlow */
|
||
code span.ch { color: #20794d; } /* Char */
|
||
code span.cn { color: #8f5902; } /* Constant */
|
||
code span.co { color: #5e5e5e; } /* Comment */
|
||
code span.cv { color: #5e5e5e; font-style: italic; } /* CommentVar */
|
||
code span.do { color: #5e5e5e; font-style: italic; } /* Documentation */
|
||
code span.dt { color: #ad0000; } /* DataType */
|
||
code span.dv { color: #ad0000; } /* DecVal */
|
||
code span.er { color: #ad0000; } /* Error */
|
||
code span.ex { } /* Extension */
|
||
code span.fl { color: #ad0000; } /* Float */
|
||
code span.fu { color: #4758ab; } /* Function */
|
||
code span.im { } /* Import */
|
||
code span.in { color: #5e5e5e; } /* Information */
|
||
code span.kw { color: #007ba5; } /* Keyword */
|
||
code span.op { color: #5e5e5e; } /* Operator */
|
||
code span.ot { color: #007ba5; } /* Other */
|
||
code span.pp { color: #ad0000; } /* Preprocessor */
|
||
code span.sc { color: #5e5e5e; } /* SpecialChar */
|
||
code span.ss { color: #20794d; } /* SpecialString */
|
||
code span.st { color: #20794d; } /* String */
|
||
code span.va { color: #111111; } /* Variable */
|
||
code span.vs { color: #20794d; } /* VerbatimString */
|
||
code span.wa { color: #5e5e5e; font-style: italic; } /* Warning */
|
||
</style>
|
||
|
||
<style>
|
||
div.csl-bib-body { }
|
||
div.csl-entry {
|
||
clear: both;
|
||
}
|
||
.hanging div.csl-entry {
|
||
margin-left:2em;
|
||
text-indent:-2em;
|
||
}
|
||
div.csl-left-margin {
|
||
min-width:2em;
|
||
float:left;
|
||
}
|
||
div.csl-right-inline {
|
||
margin-left:2em;
|
||
padding-left:1em;
|
||
}
|
||
div.csl-indent {
|
||
margin-left: 2em;
|
||
}
|
||
</style>
|
||
|
||
<!--radix_placeholder_meta_tags-->
|
||
<title>Machine Learning Directed Study: Report 2</title>
|
||
|
||
<meta property="description" itemprop="description" content="Advanced processing of 3D meshes using Julia, and data science in Matlab."/>
|
||
|
||
|
||
<!-- https://schema.org/Article -->
|
||
<meta property="article:published" itemprop="datePublished" content="2022-04-03"/>
|
||
<meta property="article:created" itemprop="dateCreated" content="2022-04-03"/>
|
||
<meta name="article:author" content="Anson Biggs"/>
|
||
|
||
<!-- https://developers.facebook.com/docs/sharing/webmasters#markup -->
|
||
<meta property="og:title" content="Machine Learning Directed Study: Report 2"/>
|
||
<meta property="og:type" content="article"/>
|
||
<meta property="og:description" content="Advanced processing of 3D meshes using Julia, and data science in Matlab."/>
|
||
<meta property="og:locale" content="en_US"/>
|
||
|
||
<!-- https://dev.twitter.com/cards/types/summary -->
|
||
<meta property="twitter:card" content="summary"/>
|
||
<meta property="twitter:title" content="Machine Learning Directed Study: Report 2"/>
|
||
<meta property="twitter:description" content="Advanced processing of 3D meshes using Julia, and data science in Matlab."/>
|
||
|
||
<!--/radix_placeholder_meta_tags-->
|
||
|
||
<meta name="citation_reference" content="citation_title=Polyhedral Mass Properties (Revisited);citation_publication_date=2002;citation_author=David Eberly"/>
|
||
<meta name="citation_reference" content="citation_title=Analysis of the DebriSat fragments and comparison to the NASA standard satellite breakup model;citation_publication_date=2019;citation_author=James Murray;citation_author=Heather Cowardin;citation_author=J-C Liou;citation_author=Marlon Sorge;citation_author=Norman Fitz-Coy;citation_author=Tom Huynh"/>
|
||
<meta name="citation_reference" content="citation_title=6U CubeSat model | 3D CAD Model Library | GrabCAD;citation_author=6U CubeSat model | 3D CAD Model Library | GrabCAD"/>
|
||
<!--radix_placeholder_rmarkdown_metadata-->
|
||
|
||
<script type="text/json" id="radix-rmarkdown-metadata">
|
||
{"type":"list","attributes":{"names":{"type":"character","attributes":{},"value":["title","description","author","repository_url","date","output","categories","preview","bibliography","draft"]}},"value":[{"type":"character","attributes":{},"value":["Machine Learning Directed Study: Report 2"]},{"type":"character","attributes":{},"value":["Advanced processing of 3D meshes using Julia, and data science in Matlab.\n"]},{"type":"list","attributes":{},"value":[{"type":"list","attributes":{"names":{"type":"character","attributes":{},"value":["name","url"]}},"value":[{"type":"character","attributes":{},"value":["Anson Biggs"]},{"type":"character","attributes":{},"value":["https://ansonbiggs.com"]}]}]},{"type":"character","attributes":{},"value":["https://gitlab.com/orbital-debris-research/directed-study/report-2"]},{"type":"character","attributes":{},"value":["2022-04-03"]},{"type":"list","attributes":{"names":{"type":"character","attributes":{},"value":["distill::distill_article"]}},"value":[{"type":"list","attributes":{"names":{"type":"character","attributes":{},"value":["self_contained"]}},"value":[{"type":"logical","attributes":{},"value":[false]}]}]},{"type":"character","attributes":{},"value":["Matlab","Orbital Debris","Julia"]},{"type":"character","attributes":{},"value":["Figures/final_scatter.png"]},{"type":"character","attributes":{},"value":["citations.bib"]},{"type":"logical","attributes":{},"value":[false]}]}
|
||
</script>
|
||
<!--/radix_placeholder_rmarkdown_metadata-->
|
||
|
||
<script type="text/json" id="radix-resource-manifest">
|
||
{"type":"character","attributes":{},"value":["citations.bib","Figures/assembly.jpg","Figures/current_process.svg","Figures/inertia3d.png","Figures/kmeans.png","Figures/pca.png","machine-learning-directed-study-report-2_files/anchor-4.2.2/anchor.min.js","machine-learning-directed-study-report-2_files/bowser-1.9.3/bowser.min.js","machine-learning-directed-study-report-2_files/distill-2.2.21/template.v2.js","machine-learning-directed-study-report-2_files/header-attrs-2.13/header-attrs.js","machine-learning-directed-study-report-2_files/jquery-3.6.0/jquery-3.6.0.js","machine-learning-directed-study-report-2_files/jquery-3.6.0/jquery-3.6.0.min.js","machine-learning-directed-study-report-2_files/jquery-3.6.0/jquery-3.6.0.min.map","machine-learning-directed-study-report-2_files/popper-2.6.0/popper.min.js","machine-learning-directed-study-report-2_files/tippy-6.2.7/tippy-bundle.umd.min.js","machine-learning-directed-study-report-2_files/tippy-6.2.7/tippy-light-border.css","machine-learning-directed-study-report-2_files/tippy-6.2.7/tippy.css","machine-learning-directed-study-report-2_files/tippy-6.2.7/tippy.umd.min.js","machine-learning-directed-study-report-2_files/webcomponents-2.0.0/webcomponents.js"]}
|
||
</script>
|
||
<!--radix_placeholder_navigation_in_header-->
|
||
<!--/radix_placeholder_navigation_in_header-->
|
||
<!--radix_placeholder_distill-->
|
||
|
||
<style type="text/css">
|
||
|
||
body {
|
||
background-color: white;
|
||
}
|
||
|
||
.pandoc-table {
|
||
width: 100%;
|
||
}
|
||
|
||
.pandoc-table>caption {
|
||
margin-bottom: 10px;
|
||
}
|
||
|
||
.pandoc-table th:not([align]) {
|
||
text-align: left;
|
||
}
|
||
|
||
.pagedtable-footer {
|
||
font-size: 15px;
|
||
}
|
||
|
||
d-byline .byline {
|
||
grid-template-columns: 2fr 2fr;
|
||
}
|
||
|
||
d-byline .byline h3 {
|
||
margin-block-start: 1.5em;
|
||
}
|
||
|
||
d-byline .byline .authors-affiliations h3 {
|
||
margin-block-start: 0.5em;
|
||
}
|
||
|
||
.authors-affiliations .orcid-id {
|
||
width: 16px;
|
||
height:16px;
|
||
margin-left: 4px;
|
||
margin-right: 4px;
|
||
vertical-align: middle;
|
||
padding-bottom: 2px;
|
||
}
|
||
|
||
d-title .dt-tags {
|
||
margin-top: 1em;
|
||
grid-column: text;
|
||
}
|
||
|
||
.dt-tags .dt-tag {
|
||
text-decoration: none;
|
||
display: inline-block;
|
||
color: rgba(0,0,0,0.6);
|
||
padding: 0em 0.4em;
|
||
margin-right: 0.5em;
|
||
margin-bottom: 0.4em;
|
||
font-size: 70%;
|
||
border: 1px solid rgba(0,0,0,0.2);
|
||
border-radius: 3px;
|
||
text-transform: uppercase;
|
||
font-weight: 500;
|
||
}
|
||
|
||
d-article table.gt_table td,
|
||
d-article table.gt_table th {
|
||
border-bottom: none;
|
||
}
|
||
|
||
.html-widget {
|
||
margin-bottom: 2.0em;
|
||
}
|
||
|
||
.l-screen-inset {
|
||
padding-right: 16px;
|
||
}
|
||
|
||
.l-screen .caption {
|
||
margin-left: 10px;
|
||
}
|
||
|
||
.shaded {
|
||
background: rgb(247, 247, 247);
|
||
padding-top: 20px;
|
||
padding-bottom: 20px;
|
||
border-top: 1px solid rgba(0, 0, 0, 0.1);
|
||
border-bottom: 1px solid rgba(0, 0, 0, 0.1);
|
||
}
|
||
|
||
.shaded .html-widget {
|
||
margin-bottom: 0;
|
||
border: 1px solid rgba(0, 0, 0, 0.1);
|
||
}
|
||
|
||
.shaded .shaded-content {
|
||
background: white;
|
||
}
|
||
|
||
.text-output {
|
||
margin-top: 0;
|
||
line-height: 1.5em;
|
||
}
|
||
|
||
.hidden {
|
||
display: none !important;
|
||
}
|
||
|
||
d-article {
|
||
padding-top: 2.5rem;
|
||
padding-bottom: 30px;
|
||
}
|
||
|
||
d-appendix {
|
||
padding-top: 30px;
|
||
}
|
||
|
||
d-article>p>img {
|
||
width: 100%;
|
||
}
|
||
|
||
d-article h2 {
|
||
margin: 1rem 0 1.5rem 0;
|
||
}
|
||
|
||
d-article h3 {
|
||
margin-top: 1.5rem;
|
||
}
|
||
|
||
d-article iframe {
|
||
border: 1px solid rgba(0, 0, 0, 0.1);
|
||
margin-bottom: 2.0em;
|
||
width: 100%;
|
||
}
|
||
|
||
/* Tweak code blocks */
|
||
|
||
d-article div.sourceCode code,
|
||
d-article pre code {
|
||
font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
|
||
}
|
||
|
||
d-article pre,
|
||
d-article div.sourceCode,
|
||
d-article div.sourceCode pre {
|
||
overflow: auto;
|
||
}
|
||
|
||
d-article div.sourceCode {
|
||
background-color: white;
|
||
}
|
||
|
||
d-article div.sourceCode pre {
|
||
padding-left: 10px;
|
||
font-size: 12px;
|
||
border-left: 2px solid rgba(0,0,0,0.1);
|
||
}
|
||
|
||
d-article pre {
|
||
font-size: 12px;
|
||
color: black;
|
||
background: none;
|
||
margin-top: 0;
|
||
text-align: left;
|
||
white-space: pre;
|
||
word-spacing: normal;
|
||
word-break: normal;
|
||
word-wrap: normal;
|
||
line-height: 1.5;
|
||
|
||
-moz-tab-size: 4;
|
||
-o-tab-size: 4;
|
||
tab-size: 4;
|
||
|
||
-webkit-hyphens: none;
|
||
-moz-hyphens: none;
|
||
-ms-hyphens: none;
|
||
hyphens: none;
|
||
}
|
||
|
||
d-article pre a {
|
||
border-bottom: none;
|
||
}
|
||
|
||
d-article pre a:hover {
|
||
border-bottom: none;
|
||
text-decoration: underline;
|
||
}
|
||
|
||
d-article details {
|
||
grid-column: text;
|
||
margin-bottom: 0.8em;
|
||
}
|
||
|
||
@media(min-width: 768px) {
|
||
|
||
d-article pre,
|
||
d-article div.sourceCode,
|
||
d-article div.sourceCode pre {
|
||
overflow: visible !important;
|
||
}
|
||
|
||
d-article div.sourceCode pre {
|
||
padding-left: 18px;
|
||
font-size: 14px;
|
||
}
|
||
|
||
d-article pre {
|
||
font-size: 14px;
|
||
}
|
||
|
||
}
|
||
|
||
figure img.external {
|
||
background: white;
|
||
border: 1px solid rgba(0, 0, 0, 0.1);
|
||
box-shadow: 0 1px 8px rgba(0, 0, 0, 0.1);
|
||
padding: 18px;
|
||
box-sizing: border-box;
|
||
}
|
||
|
||
/* CSS for d-contents */
|
||
|
||
.d-contents {
|
||
grid-column: text;
|
||
color: rgba(0,0,0,0.8);
|
||
font-size: 0.9em;
|
||
padding-bottom: 1em;
|
||
margin-bottom: 1em;
|
||
padding-bottom: 0.5em;
|
||
margin-bottom: 1em;
|
||
padding-left: 0.25em;
|
||
justify-self: start;
|
||
}
|
||
|
||
@media(min-width: 1000px) {
|
||
.d-contents.d-contents-float {
|
||
height: 0;
|
||
grid-column-start: 1;
|
||
grid-column-end: 4;
|
||
justify-self: center;
|
||
padding-right: 3em;
|
||
padding-left: 2em;
|
||
}
|
||
}
|
||
|
||
.d-contents nav h3 {
|
||
font-size: 18px;
|
||
margin-top: 0;
|
||
margin-bottom: 1em;
|
||
}
|
||
|
||
.d-contents li {
|
||
list-style-type: none
|
||
}
|
||
|
||
.d-contents nav > ul {
|
||
padding-left: 0;
|
||
}
|
||
|
||
.d-contents ul {
|
||
padding-left: 1em
|
||
}
|
||
|
||
.d-contents nav ul li {
|
||
margin-top: 0.6em;
|
||
margin-bottom: 0.2em;
|
||
}
|
||
|
||
.d-contents nav a {
|
||
font-size: 13px;
|
||
border-bottom: none;
|
||
text-decoration: none
|
||
color: rgba(0, 0, 0, 0.8);
|
||
}
|
||
|
||
.d-contents nav a:hover {
|
||
text-decoration: underline solid rgba(0, 0, 0, 0.6)
|
||
}
|
||
|
||
.d-contents nav > ul > li > a {
|
||
font-weight: 600;
|
||
}
|
||
|
||
.d-contents nav > ul > li > ul {
|
||
font-weight: inherit;
|
||
}
|
||
|
||
.d-contents nav > ul > li > ul > li {
|
||
margin-top: 0.2em;
|
||
}
|
||
|
||
|
||
.d-contents nav ul {
|
||
margin-top: 0;
|
||
margin-bottom: 0.25em;
|
||
}
|
||
|
||
.d-article-with-toc h2:nth-child(2) {
|
||
margin-top: 0;
|
||
}
|
||
|
||
|
||
/* Figure */
|
||
|
||
.figure {
|
||
position: relative;
|
||
margin-bottom: 2.5em;
|
||
margin-top: 1.5em;
|
||
}
|
||
|
||
.figure img {
|
||
width: 100%;
|
||
}
|
||
|
||
.figure .caption {
|
||
color: rgba(0, 0, 0, 0.6);
|
||
font-size: 12px;
|
||
line-height: 1.5em;
|
||
}
|
||
|
||
.figure img.external {
|
||
background: white;
|
||
border: 1px solid rgba(0, 0, 0, 0.1);
|
||
box-shadow: 0 1px 8px rgba(0, 0, 0, 0.1);
|
||
padding: 18px;
|
||
box-sizing: border-box;
|
||
}
|
||
|
||
.figure .caption a {
|
||
color: rgba(0, 0, 0, 0.6);
|
||
}
|
||
|
||
.figure .caption b,
|
||
.figure .caption strong, {
|
||
font-weight: 600;
|
||
color: rgba(0, 0, 0, 1.0);
|
||
}
|
||
|
||
/* Citations */
|
||
|
||
d-article .citation {
|
||
color: inherit;
|
||
cursor: inherit;
|
||
}
|
||
|
||
div.hanging-indent{
|
||
margin-left: 1em; text-indent: -1em;
|
||
}
|
||
|
||
/* Citation hover box */
|
||
|
||
.tippy-box[data-theme~=light-border] {
|
||
background-color: rgba(250, 250, 250, 0.95);
|
||
}
|
||
|
||
.tippy-content > p {
|
||
margin-bottom: 0;
|
||
padding: 2px;
|
||
}
|
||
|
||
|
||
/* Tweak 1000px media break to show more text */
|
||
|
||
@media(min-width: 1000px) {
|
||
.base-grid,
|
||
distill-header,
|
||
d-title,
|
||
d-abstract,
|
||
d-article,
|
||
d-appendix,
|
||
distill-appendix,
|
||
d-byline,
|
||
d-footnote-list,
|
||
d-citation-list,
|
||
distill-footer {
|
||
grid-template-columns: [screen-start] 1fr [page-start kicker-start] 80px [middle-start] 50px [text-start kicker-end] 65px 65px 65px 65px 65px 65px 65px 65px [text-end gutter-start] 65px [middle-end] 65px [page-end gutter-end] 1fr [screen-end];
|
||
grid-column-gap: 16px;
|
||
}
|
||
|
||
.grid {
|
||
grid-column-gap: 16px;
|
||
}
|
||
|
||
d-article {
|
||
font-size: 1.06rem;
|
||
line-height: 1.7em;
|
||
}
|
||
figure .caption, .figure .caption, figure figcaption {
|
||
font-size: 13px;
|
||
}
|
||
}
|
||
|
||
@media(min-width: 1180px) {
|
||
.base-grid,
|
||
distill-header,
|
||
d-title,
|
||
d-abstract,
|
||
d-article,
|
||
d-appendix,
|
||
distill-appendix,
|
||
d-byline,
|
||
d-footnote-list,
|
||
d-citation-list,
|
||
distill-footer {
|
||
grid-template-columns: [screen-start] 1fr [page-start kicker-start] 60px [middle-start] 60px [text-start kicker-end] 60px 60px 60px 60px 60px 60px 60px 60px [text-end gutter-start] 60px [middle-end] 60px [page-end gutter-end] 1fr [screen-end];
|
||
grid-column-gap: 32px;
|
||
}
|
||
|
||
.grid {
|
||
grid-column-gap: 32px;
|
||
}
|
||
}
|
||
|
||
|
||
/* Get the citation styles for the appendix (not auto-injected on render since
|
||
we do our own rendering of the citation appendix) */
|
||
|
||
d-appendix .citation-appendix,
|
||
.d-appendix .citation-appendix {
|
||
font-size: 11px;
|
||
line-height: 15px;
|
||
border-left: 1px solid rgba(0, 0, 0, 0.1);
|
||
padding-left: 18px;
|
||
border: 1px solid rgba(0,0,0,0.1);
|
||
background: rgba(0, 0, 0, 0.02);
|
||
padding: 10px 18px;
|
||
border-radius: 3px;
|
||
color: rgba(150, 150, 150, 1);
|
||
overflow: hidden;
|
||
margin-top: -12px;
|
||
white-space: pre-wrap;
|
||
word-wrap: break-word;
|
||
}
|
||
|
||
/* Include appendix styles here so they can be overridden */
|
||
|
||
d-appendix {
|
||
contain: layout style;
|
||
font-size: 0.8em;
|
||
line-height: 1.7em;
|
||
margin-top: 60px;
|
||
margin-bottom: 0;
|
||
border-top: 1px solid rgba(0, 0, 0, 0.1);
|
||
color: rgba(0,0,0,0.5);
|
||
padding-top: 60px;
|
||
padding-bottom: 48px;
|
||
}
|
||
|
||
d-appendix h3 {
|
||
grid-column: page-start / text-start;
|
||
font-size: 15px;
|
||
font-weight: 500;
|
||
margin-top: 1em;
|
||
margin-bottom: 0;
|
||
color: rgba(0,0,0,0.65);
|
||
}
|
||
|
||
d-appendix h3 + * {
|
||
margin-top: 1em;
|
||
}
|
||
|
||
d-appendix ol {
|
||
padding: 0 0 0 15px;
|
||
}
|
||
|
||
@media (min-width: 768px) {
|
||
d-appendix ol {
|
||
padding: 0 0 0 30px;
|
||
margin-left: -30px;
|
||
}
|
||
}
|
||
|
||
d-appendix li {
|
||
margin-bottom: 1em;
|
||
}
|
||
|
||
d-appendix a {
|
||
color: rgba(0, 0, 0, 0.6);
|
||
}
|
||
|
||
d-appendix > * {
|
||
grid-column: text;
|
||
}
|
||
|
||
d-appendix > d-footnote-list,
|
||
d-appendix > d-citation-list,
|
||
d-appendix > distill-appendix {
|
||
grid-column: screen;
|
||
}
|
||
|
||
/* Include footnote styles here so they can be overridden */
|
||
|
||
d-footnote-list {
|
||
contain: layout style;
|
||
}
|
||
|
||
d-footnote-list > * {
|
||
grid-column: text;
|
||
}
|
||
|
||
d-footnote-list a.footnote-backlink {
|
||
color: rgba(0,0,0,0.3);
|
||
padding-left: 0.5em;
|
||
}
|
||
|
||
|
||
|
||
/* Anchor.js */
|
||
|
||
.anchorjs-link {
|
||
/*transition: all .25s linear; */
|
||
text-decoration: none;
|
||
border-bottom: none;
|
||
}
|
||
*:hover > .anchorjs-link {
|
||
margin-left: -1.125em !important;
|
||
text-decoration: none;
|
||
border-bottom: none;
|
||
}
|
||
|
||
/* Social footer */
|
||
|
||
.social_footer {
|
||
margin-top: 30px;
|
||
margin-bottom: 0;
|
||
color: rgba(0,0,0,0.67);
|
||
}
|
||
|
||
.disqus-comments {
|
||
margin-right: 30px;
|
||
}
|
||
|
||
.disqus-comment-count {
|
||
border-bottom: 1px solid rgba(0, 0, 0, 0.4);
|
||
cursor: pointer;
|
||
}
|
||
|
||
#disqus_thread {
|
||
margin-top: 30px;
|
||
}
|
||
|
||
.article-sharing a {
|
||
border-bottom: none;
|
||
margin-right: 8px;
|
||
}
|
||
|
||
.article-sharing a:hover {
|
||
border-bottom: none;
|
||
}
|
||
|
||
.sidebar-section.subscribe {
|
||
font-size: 12px;
|
||
line-height: 1.6em;
|
||
}
|
||
|
||
.subscribe p {
|
||
margin-bottom: 0.5em;
|
||
}
|
||
|
||
|
||
.article-footer .subscribe {
|
||
font-size: 15px;
|
||
margin-top: 45px;
|
||
}
|
||
|
||
|
||
.sidebar-section.custom {
|
||
font-size: 12px;
|
||
line-height: 1.6em;
|
||
}
|
||
|
||
.custom p {
|
||
margin-bottom: 0.5em;
|
||
}
|
||
|
||
/* Styles for listing layout (hide title) */
|
||
.layout-listing d-title, .layout-listing .d-title {
|
||
display: none;
|
||
}
|
||
|
||
/* Styles for posts lists (not auto-injected) */
|
||
|
||
|
||
.posts-with-sidebar {
|
||
padding-left: 45px;
|
||
padding-right: 45px;
|
||
}
|
||
|
||
.posts-list .description h2,
|
||
.posts-list .description p {
|
||
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", Arial, sans-serif;
|
||
}
|
||
|
||
.posts-list .description h2 {
|
||
font-weight: 700;
|
||
border-bottom: none;
|
||
padding-bottom: 0;
|
||
}
|
||
|
||
.posts-list h2.post-tag {
|
||
border-bottom: 1px solid rgba(0, 0, 0, 0.2);
|
||
padding-bottom: 12px;
|
||
}
|
||
.posts-list {
|
||
margin-top: 60px;
|
||
margin-bottom: 24px;
|
||
}
|
||
|
||
.posts-list .post-preview {
|
||
text-decoration: none;
|
||
overflow: hidden;
|
||
display: block;
|
||
border-bottom: 1px solid rgba(0, 0, 0, 0.1);
|
||
padding: 24px 0;
|
||
}
|
||
|
||
.post-preview-last {
|
||
border-bottom: none !important;
|
||
}
|
||
|
||
.posts-list .posts-list-caption {
|
||
grid-column: screen;
|
||
font-weight: 400;
|
||
}
|
||
|
||
.posts-list .post-preview h2 {
|
||
margin: 0 0 6px 0;
|
||
line-height: 1.2em;
|
||
font-style: normal;
|
||
font-size: 24px;
|
||
}
|
||
|
||
.posts-list .post-preview p {
|
||
margin: 0 0 12px 0;
|
||
line-height: 1.4em;
|
||
font-size: 16px;
|
||
}
|
||
|
||
.posts-list .post-preview .thumbnail {
|
||
box-sizing: border-box;
|
||
margin-bottom: 24px;
|
||
position: relative;
|
||
max-width: 500px;
|
||
}
|
||
.posts-list .post-preview img {
|
||
width: 100%;
|
||
display: block;
|
||
}
|
||
|
||
.posts-list .metadata {
|
||
font-size: 12px;
|
||
line-height: 1.4em;
|
||
margin-bottom: 18px;
|
||
}
|
||
|
||
.posts-list .metadata > * {
|
||
display: inline-block;
|
||
}
|
||
|
||
.posts-list .metadata .publishedDate {
|
||
margin-right: 2em;
|
||
}
|
||
|
||
.posts-list .metadata .dt-authors {
|
||
display: block;
|
||
margin-top: 0.3em;
|
||
margin-right: 2em;
|
||
}
|
||
|
||
.posts-list .dt-tags {
|
||
display: block;
|
||
line-height: 1em;
|
||
}
|
||
|
||
.posts-list .dt-tags .dt-tag {
|
||
display: inline-block;
|
||
color: rgba(0,0,0,0.6);
|
||
padding: 0.3em 0.4em;
|
||
margin-right: 0.2em;
|
||
margin-bottom: 0.4em;
|
||
font-size: 60%;
|
||
border: 1px solid rgba(0,0,0,0.2);
|
||
border-radius: 3px;
|
||
text-transform: uppercase;
|
||
font-weight: 500;
|
||
}
|
||
|
||
.posts-list img {
|
||
opacity: 1;
|
||
}
|
||
|
||
.posts-list img[data-src] {
|
||
opacity: 0;
|
||
}
|
||
|
||
.posts-more {
|
||
clear: both;
|
||
}
|
||
|
||
|
||
.posts-sidebar {
|
||
font-size: 16px;
|
||
}
|
||
|
||
.posts-sidebar h3 {
|
||
font-size: 16px;
|
||
margin-top: 0;
|
||
margin-bottom: 0.5em;
|
||
font-weight: 400;
|
||
text-transform: uppercase;
|
||
}
|
||
|
||
.sidebar-section {
|
||
margin-bottom: 30px;
|
||
}
|
||
|
||
.categories ul {
|
||
list-style-type: none;
|
||
margin: 0;
|
||
padding: 0;
|
||
}
|
||
|
||
.categories li {
|
||
color: rgba(0, 0, 0, 0.8);
|
||
margin-bottom: 0;
|
||
}
|
||
|
||
.categories li>a {
|
||
border-bottom: none;
|
||
}
|
||
|
||
.categories li>a:hover {
|
||
border-bottom: 1px solid rgba(0, 0, 0, 0.4);
|
||
}
|
||
|
||
.categories .active {
|
||
font-weight: 600;
|
||
}
|
||
|
||
.categories .category-count {
|
||
color: rgba(0, 0, 0, 0.4);
|
||
}
|
||
|
||
|
||
@media(min-width: 768px) {
|
||
.posts-list .post-preview h2 {
|
||
font-size: 26px;
|
||
}
|
||
.posts-list .post-preview .thumbnail {
|
||
float: right;
|
||
width: 30%;
|
||
margin-bottom: 0;
|
||
}
|
||
.posts-list .post-preview .description {
|
||
float: left;
|
||
width: 45%;
|
||
}
|
||
.posts-list .post-preview .metadata {
|
||
float: left;
|
||
width: 20%;
|
||
margin-top: 8px;
|
||
}
|
||
.posts-list .post-preview p {
|
||
margin: 0 0 12px 0;
|
||
line-height: 1.5em;
|
||
font-size: 16px;
|
||
}
|
||
.posts-with-sidebar .posts-list {
|
||
float: left;
|
||
width: 75%;
|
||
}
|
||
.posts-with-sidebar .posts-sidebar {
|
||
float: right;
|
||
width: 20%;
|
||
margin-top: 60px;
|
||
padding-top: 24px;
|
||
padding-bottom: 24px;
|
||
}
|
||
}
|
||
|
||
|
||
/* Improve display for browsers without grid (IE/Edge <= 15) */
|
||
|
||
.downlevel {
|
||
line-height: 1.6em;
|
||
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", Arial, sans-serif;
|
||
margin: 0;
|
||
}
|
||
|
||
.downlevel .d-title {
|
||
padding-top: 6rem;
|
||
padding-bottom: 1.5rem;
|
||
}
|
||
|
||
.downlevel .d-title h1 {
|
||
font-size: 50px;
|
||
font-weight: 700;
|
||
line-height: 1.1em;
|
||
margin: 0 0 0.5rem;
|
||
}
|
||
|
||
.downlevel .d-title p {
|
||
font-weight: 300;
|
||
font-size: 1.2rem;
|
||
line-height: 1.55em;
|
||
margin-top: 0;
|
||
}
|
||
|
||
.downlevel .d-byline {
|
||
padding-top: 0.8em;
|
||
padding-bottom: 0.8em;
|
||
font-size: 0.8rem;
|
||
line-height: 1.8em;
|
||
}
|
||
|
||
.downlevel .section-separator {
|
||
border: none;
|
||
border-top: 1px solid rgba(0, 0, 0, 0.1);
|
||
}
|
||
|
||
.downlevel .d-article {
|
||
font-size: 1.06rem;
|
||
line-height: 1.7em;
|
||
padding-top: 1rem;
|
||
padding-bottom: 2rem;
|
||
}
|
||
|
||
|
||
.downlevel .d-appendix {
|
||
padding-left: 0;
|
||
padding-right: 0;
|
||
max-width: none;
|
||
font-size: 0.8em;
|
||
line-height: 1.7em;
|
||
margin-bottom: 0;
|
||
color: rgba(0,0,0,0.5);
|
||
padding-top: 40px;
|
||
padding-bottom: 48px;
|
||
}
|
||
|
||
.downlevel .footnotes ol {
|
||
padding-left: 13px;
|
||
}
|
||
|
||
.downlevel .base-grid,
|
||
.downlevel .distill-header,
|
||
.downlevel .d-title,
|
||
.downlevel .d-abstract,
|
||
.downlevel .d-article,
|
||
.downlevel .d-appendix,
|
||
.downlevel .distill-appendix,
|
||
.downlevel .d-byline,
|
||
.downlevel .d-footnote-list,
|
||
.downlevel .d-citation-list,
|
||
.downlevel .distill-footer,
|
||
.downlevel .appendix-bottom,
|
||
.downlevel .posts-container {
|
||
padding-left: 40px;
|
||
padding-right: 40px;
|
||
}
|
||
|
||
@media(min-width: 768px) {
|
||
.downlevel .base-grid,
|
||
.downlevel .distill-header,
|
||
.downlevel .d-title,
|
||
.downlevel .d-abstract,
|
||
.downlevel .d-article,
|
||
.downlevel .d-appendix,
|
||
.downlevel .distill-appendix,
|
||
.downlevel .d-byline,
|
||
.downlevel .d-footnote-list,
|
||
.downlevel .d-citation-list,
|
||
.downlevel .distill-footer,
|
||
.downlevel .appendix-bottom,
|
||
.downlevel .posts-container {
|
||
padding-left: 150px;
|
||
padding-right: 150px;
|
||
max-width: 900px;
|
||
}
|
||
}
|
||
|
||
.downlevel pre code {
|
||
display: block;
|
||
border-left: 2px solid rgba(0, 0, 0, .1);
|
||
padding: 0 0 0 20px;
|
||
font-size: 14px;
|
||
}
|
||
|
||
.downlevel code, .downlevel pre {
|
||
color: black;
|
||
background: none;
|
||
font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
|
||
text-align: left;
|
||
white-space: pre;
|
||
word-spacing: normal;
|
||
word-break: normal;
|
||
word-wrap: normal;
|
||
line-height: 1.5;
|
||
|
||
-moz-tab-size: 4;
|
||
-o-tab-size: 4;
|
||
tab-size: 4;
|
||
|
||
-webkit-hyphens: none;
|
||
-moz-hyphens: none;
|
||
-ms-hyphens: none;
|
||
hyphens: none;
|
||
}
|
||
|
||
.downlevel .posts-list .post-preview {
|
||
color: inherit;
|
||
}
|
||
|
||
|
||
|
||
</style>
|
||
|
||
<script type="application/javascript">
|
||
|
||
function is_downlevel_browser() {
|
||
if (bowser.isUnsupportedBrowser({ msie: "12", msedge: "16"},
|
||
window.navigator.userAgent)) {
|
||
return true;
|
||
} else {
|
||
return window.load_distill_framework === undefined;
|
||
}
|
||
}
|
||
|
||
// show body when load is complete
|
||
function on_load_complete() {
|
||
|
||
// add anchors
|
||
if (window.anchors) {
|
||
window.anchors.options.placement = 'left';
|
||
window.anchors.add('d-article > h2, d-article > h3, d-article > h4, d-article > h5');
|
||
}
|
||
|
||
|
||
// set body to visible
|
||
document.body.style.visibility = 'visible';
|
||
|
||
// force redraw for leaflet widgets
|
||
if (window.HTMLWidgets) {
|
||
var maps = window.HTMLWidgets.findAll(".leaflet");
|
||
$.each(maps, function(i, el) {
|
||
var map = this.getMap();
|
||
map.invalidateSize();
|
||
map.eachLayer(function(layer) {
|
||
if (layer instanceof L.TileLayer)
|
||
layer.redraw();
|
||
});
|
||
});
|
||
}
|
||
|
||
// trigger 'shown' so htmlwidgets resize
|
||
$('d-article').trigger('shown');
|
||
}
|
||
|
||
function init_distill() {
|
||
|
||
init_common();
|
||
|
||
// create front matter
|
||
var front_matter = $('<d-front-matter></d-front-matter>');
|
||
$('#distill-front-matter').wrap(front_matter);
|
||
|
||
// create d-title
|
||
$('.d-title').changeElementType('d-title');
|
||
|
||
// create d-byline
|
||
var byline = $('<d-byline></d-byline>');
|
||
$('.d-byline').replaceWith(byline);
|
||
|
||
// create d-article
|
||
var article = $('<d-article></d-article>');
|
||
$('.d-article').wrap(article).children().unwrap();
|
||
|
||
// move posts container into article
|
||
$('.posts-container').appendTo($('d-article'));
|
||
|
||
// create d-appendix
|
||
$('.d-appendix').changeElementType('d-appendix');
|
||
|
||
// flag indicating that we have appendix items
|
||
var appendix = $('.appendix-bottom').children('h3').length > 0;
|
||
|
||
// replace footnotes with <d-footnote>
|
||
$('.footnote-ref').each(function(i, val) {
|
||
appendix = true;
|
||
var href = $(this).attr('href');
|
||
var id = href.replace('#', '');
|
||
var fn = $('#' + id);
|
||
var fn_p = $('#' + id + '>p');
|
||
fn_p.find('.footnote-back').remove();
|
||
var text = fn_p.html();
|
||
var dtfn = $('<d-footnote></d-footnote>');
|
||
dtfn.html(text);
|
||
$(this).replaceWith(dtfn);
|
||
});
|
||
// remove footnotes
|
||
$('.footnotes').remove();
|
||
|
||
// move refs into #references-listing
|
||
$('#references-listing').replaceWith($('#refs'));
|
||
|
||
$('h1.appendix, h2.appendix').each(function(i, val) {
|
||
$(this).changeElementType('h3');
|
||
});
|
||
$('h3.appendix').each(function(i, val) {
|
||
var id = $(this).attr('id');
|
||
$('.d-contents a[href="#' + id + '"]').parent().remove();
|
||
appendix = true;
|
||
$(this).nextUntil($('h1, h2, h3')).addBack().appendTo($('d-appendix'));
|
||
});
|
||
|
||
// show d-appendix if we have appendix content
|
||
$("d-appendix").css('display', appendix ? 'grid' : 'none');
|
||
|
||
// localize layout chunks to just output
|
||
$('.layout-chunk').each(function(i, val) {
|
||
|
||
// capture layout
|
||
var layout = $(this).attr('data-layout');
|
||
|
||
// apply layout to markdown level block elements
|
||
var elements = $(this).children().not('details, div.sourceCode, pre, script');
|
||
elements.each(function(i, el) {
|
||
var layout_div = $('<div class="' + layout + '"></div>');
|
||
if (layout_div.hasClass('shaded')) {
|
||
var shaded_content = $('<div class="shaded-content"></div>');
|
||
$(this).wrap(shaded_content);
|
||
$(this).parent().wrap(layout_div);
|
||
} else {
|
||
$(this).wrap(layout_div);
|
||
}
|
||
});
|
||
|
||
|
||
// unwrap the layout-chunk div
|
||
$(this).children().unwrap();
|
||
});
|
||
|
||
// remove code block used to force highlighting css
|
||
$('.distill-force-highlighting-css').parent().remove();
|
||
|
||
// remove empty line numbers inserted by pandoc when using a
|
||
// custom syntax highlighting theme
|
||
$('code.sourceCode a:empty').remove();
|
||
|
||
// load distill framework
|
||
load_distill_framework();
|
||
|
||
// wait for window.distillRunlevel == 4 to do post processing
|
||
function distill_post_process() {
|
||
|
||
if (!window.distillRunlevel || window.distillRunlevel < 4)
|
||
return;
|
||
|
||
// hide author/affiliations entirely if we have no authors
|
||
var front_matter = JSON.parse($("#distill-front-matter").html());
|
||
var have_authors = front_matter.authors && front_matter.authors.length > 0;
|
||
if (!have_authors)
|
||
$('d-byline').addClass('hidden');
|
||
|
||
// article with toc class
|
||
$('.d-contents').parent().addClass('d-article-with-toc');
|
||
|
||
// strip links that point to #
|
||
$('.authors-affiliations').find('a[href="#"]').removeAttr('href');
|
||
|
||
// add orcid ids
|
||
$('.authors-affiliations').find('.author').each(function(i, el) {
|
||
var orcid_id = front_matter.authors[i].orcidID;
|
||
if (orcid_id) {
|
||
var a = $('<a></a>');
|
||
a.attr('href', 'https://orcid.org/' + orcid_id);
|
||
var img = $('<img></img>');
|
||
img.addClass('orcid-id');
|
||
img.attr('alt', 'ORCID ID');
|
||
img.attr('src','data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo1N0NEMjA4MDI1MjA2ODExOTk0QzkzNTEzRjZEQTg1NyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDozM0NDOEJGNEZGNTcxMUUxODdBOEVCODg2RjdCQ0QwOSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDozM0NDOEJGM0ZGNTcxMUUxODdBOEVCODg2RjdCQ0QwOSIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IE1hY2ludG9zaCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkZDN0YxMTc0MDcyMDY4MTE5NUZFRDc5MUM2MUUwNEREIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjU3Q0QyMDgwMjUyMDY4MTE5OTRDOTM1MTNGNkRBODU3Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+84NovQAAAR1JREFUeNpiZEADy85ZJgCpeCB2QJM6AMQLo4yOL0AWZETSqACk1gOxAQN+cAGIA4EGPQBxmJA0nwdpjjQ8xqArmczw5tMHXAaALDgP1QMxAGqzAAPxQACqh4ER6uf5MBlkm0X4EGayMfMw/Pr7Bd2gRBZogMFBrv01hisv5jLsv9nLAPIOMnjy8RDDyYctyAbFM2EJbRQw+aAWw/LzVgx7b+cwCHKqMhjJFCBLOzAR6+lXX84xnHjYyqAo5IUizkRCwIENQQckGSDGY4TVgAPEaraQr2a4/24bSuoExcJCfAEJihXkWDj3ZAKy9EJGaEo8T0QSxkjSwORsCAuDQCD+QILmD1A9kECEZgxDaEZhICIzGcIyEyOl2RkgwAAhkmC+eAm0TAAAAABJRU5ErkJggg==');
|
||
a.append(img);
|
||
$(this).append(a);
|
||
}
|
||
});
|
||
|
||
// hide elements of author/affiliations grid that have no value
|
||
function hide_byline_column(caption) {
|
||
$('d-byline').find('h3:contains("' + caption + '")').parent().css('visibility', 'hidden');
|
||
}
|
||
|
||
// affiliations
|
||
var have_affiliations = false;
|
||
for (var i = 0; i<front_matter.authors.length; ++i) {
|
||
var author = front_matter.authors[i];
|
||
if (author.affiliation !== " ") {
|
||
have_affiliations = true;
|
||
break;
|
||
}
|
||
}
|
||
if (!have_affiliations)
|
||
$('d-byline').find('h3:contains("Affiliations")').css('visibility', 'hidden');
|
||
|
||
// published date
|
||
if (!front_matter.publishedDate)
|
||
hide_byline_column("Published");
|
||
|
||
// document object identifier
|
||
var doi = $('d-byline').find('h3:contains("DOI")');
|
||
var doi_p = doi.next().empty();
|
||
if (!front_matter.doi) {
|
||
// if we have a citation and valid citationText then link to that
|
||
if ($('#citation').length > 0 && front_matter.citationText) {
|
||
doi.html('Citation');
|
||
$('<a href="#citation"></a>')
|
||
.text(front_matter.citationText)
|
||
.appendTo(doi_p);
|
||
} else {
|
||
hide_byline_column("DOI");
|
||
}
|
||
} else {
|
||
$('<a></a>')
|
||
.attr('href', "https://doi.org/" + front_matter.doi)
|
||
.html(front_matter.doi)
|
||
.appendTo(doi_p);
|
||
}
|
||
|
||
// change plural form of authors/affiliations
|
||
if (front_matter.authors.length === 1) {
|
||
var grid = $('.authors-affiliations');
|
||
grid.children('h3:contains("Authors")').text('Author');
|
||
grid.children('h3:contains("Affiliations")').text('Affiliation');
|
||
}
|
||
|
||
// remove d-appendix and d-footnote-list local styles
|
||
$('d-appendix > style:first-child').remove();
|
||
$('d-footnote-list > style:first-child').remove();
|
||
|
||
// move appendix-bottom entries to the bottom
|
||
$('.appendix-bottom').appendTo('d-appendix').children().unwrap();
|
||
$('.appendix-bottom').remove();
|
||
|
||
// hoverable references
|
||
$('span.citation[data-cites]').each(function() {
|
||
var refs = $(this).attr('data-cites').split(" ");
|
||
var refHtml = refs.map(function(ref) {
|
||
return "<p>" + $('#ref-' + ref).html() + "</p>";
|
||
}).join("\n");
|
||
window.tippy(this, {
|
||
allowHTML: true,
|
||
content: refHtml,
|
||
maxWidth: 500,
|
||
interactive: true,
|
||
interactiveBorder: 10,
|
||
theme: 'light-border',
|
||
placement: 'bottom-start'
|
||
});
|
||
});
|
||
|
||
// clear polling timer
|
||
clearInterval(tid);
|
||
|
||
// show body now that everything is ready
|
||
on_load_complete();
|
||
}
|
||
|
||
var tid = setInterval(distill_post_process, 50);
|
||
distill_post_process();
|
||
|
||
}
|
||
|
||
function init_downlevel() {
|
||
|
||
init_common();
|
||
|
||
// insert hr after d-title
|
||
$('.d-title').after($('<hr class="section-separator"/>'));
|
||
|
||
// check if we have authors
|
||
var front_matter = JSON.parse($("#distill-front-matter").html());
|
||
var have_authors = front_matter.authors && front_matter.authors.length > 0;
|
||
|
||
// manage byline/border
|
||
if (!have_authors)
|
||
$('.d-byline').remove();
|
||
$('.d-byline').after($('<hr class="section-separator"/>'));
|
||
$('.d-byline a').remove();
|
||
|
||
// remove toc
|
||
$('.d-contents').remove();
|
||
|
||
// move appendix elements
|
||
$('h1.appendix, h2.appendix').each(function(i, val) {
|
||
$(this).changeElementType('h3');
|
||
});
|
||
$('h3.appendix').each(function(i, val) {
|
||
$(this).nextUntil($('h1, h2, h3')).addBack().appendTo($('.d-appendix'));
|
||
});
|
||
|
||
|
||
// inject headers into references and footnotes
|
||
var refs_header = $('<h3></h3>');
|
||
refs_header.text('References');
|
||
$('#refs').prepend(refs_header);
|
||
|
||
var footnotes_header = $('<h3></h3');
|
||
footnotes_header.text('Footnotes');
|
||
$('.footnotes').children('hr').first().replaceWith(footnotes_header);
|
||
|
||
// move appendix-bottom entries to the bottom
|
||
$('.appendix-bottom').appendTo('.d-appendix').children().unwrap();
|
||
$('.appendix-bottom').remove();
|
||
|
||
// remove appendix if it's empty
|
||
if ($('.d-appendix').children().length === 0)
|
||
$('.d-appendix').remove();
|
||
|
||
// prepend separator above appendix
|
||
$('.d-appendix').before($('<hr class="section-separator" style="clear: both"/>'));
|
||
|
||
// trim code
|
||
$('pre>code').each(function(i, val) {
|
||
$(this).html($.trim($(this).html()));
|
||
});
|
||
|
||
// move posts-container right before article
|
||
$('.posts-container').insertBefore($('.d-article'));
|
||
|
||
$('body').addClass('downlevel');
|
||
|
||
on_load_complete();
|
||
}
|
||
|
||
|
||
function init_common() {
|
||
|
||
// jquery plugin to change element types
|
||
(function($) {
|
||
$.fn.changeElementType = function(newType) {
|
||
var attrs = {};
|
||
|
||
$.each(this[0].attributes, function(idx, attr) {
|
||
attrs[attr.nodeName] = attr.nodeValue;
|
||
});
|
||
|
||
this.replaceWith(function() {
|
||
return $("<" + newType + "/>", attrs).append($(this).contents());
|
||
});
|
||
};
|
||
})(jQuery);
|
||
|
||
// prevent underline for linked images
|
||
$('a > img').parent().css({'border-bottom' : 'none'});
|
||
|
||
// mark non-body figures created by knitr chunks as 100% width
|
||
$('.layout-chunk').each(function(i, val) {
|
||
var figures = $(this).find('img, .html-widget');
|
||
if ($(this).attr('data-layout') !== "l-body") {
|
||
figures.css('width', '100%');
|
||
} else {
|
||
figures.css('max-width', '100%');
|
||
figures.filter("[width]").each(function(i, val) {
|
||
var fig = $(this);
|
||
fig.css('width', fig.attr('width') + 'px');
|
||
});
|
||
|
||
}
|
||
});
|
||
|
||
// auto-append index.html to post-preview links in file: protocol
|
||
// and in rstudio ide preview
|
||
$('.post-preview').each(function(i, val) {
|
||
if (window.location.protocol === "file:")
|
||
$(this).attr('href', $(this).attr('href') + "index.html");
|
||
});
|
||
|
||
// get rid of index.html references in header
|
||
if (window.location.protocol !== "file:") {
|
||
$('.distill-site-header a[href]').each(function(i,val) {
|
||
$(this).attr('href', $(this).attr('href').replace("index.html", "./"));
|
||
});
|
||
}
|
||
|
||
// add class to pandoc style tables
|
||
$('tr.header').parent('thead').parent('table').addClass('pandoc-table');
|
||
$('.kable-table').children('table').addClass('pandoc-table');
|
||
|
||
// add figcaption style to table captions
|
||
$('caption').parent('table').addClass("figcaption");
|
||
|
||
// initialize posts list
|
||
if (window.init_posts_list)
|
||
window.init_posts_list();
|
||
|
||
// implmement disqus comment link
|
||
$('.disqus-comment-count').click(function() {
|
||
window.headroom_prevent_pin = true;
|
||
$('#disqus_thread').toggleClass('hidden');
|
||
if (!$('#disqus_thread').hasClass('hidden')) {
|
||
var offset = $(this).offset();
|
||
$(window).resize();
|
||
$('html, body').animate({
|
||
scrollTop: offset.top - 35
|
||
});
|
||
}
|
||
});
|
||
}
|
||
|
||
document.addEventListener('DOMContentLoaded', function() {
|
||
if (is_downlevel_browser())
|
||
init_downlevel();
|
||
else
|
||
window.addEventListener('WebComponentsReady', init_distill);
|
||
});
|
||
|
||
</script>
|
||
|
||
<!--/radix_placeholder_distill-->
|
||
<script src="machine-learning-directed-study-report-2_files/header-attrs-2.13/header-attrs.js"></script>
|
||
<script src="machine-learning-directed-study-report-2_files/jquery-3.6.0/jquery-3.6.0.min.js"></script>
|
||
<script src="machine-learning-directed-study-report-2_files/popper-2.6.0/popper.min.js"></script>
|
||
<link href="machine-learning-directed-study-report-2_files/tippy-6.2.7/tippy.css" rel="stylesheet" />
|
||
<link href="machine-learning-directed-study-report-2_files/tippy-6.2.7/tippy-light-border.css" rel="stylesheet" />
|
||
<script src="machine-learning-directed-study-report-2_files/tippy-6.2.7/tippy.umd.min.js"></script>
|
||
<script src="machine-learning-directed-study-report-2_files/anchor-4.2.2/anchor.min.js"></script>
|
||
<script src="machine-learning-directed-study-report-2_files/bowser-1.9.3/bowser.min.js"></script>
|
||
<script src="machine-learning-directed-study-report-2_files/webcomponents-2.0.0/webcomponents.js"></script>
|
||
<script src="machine-learning-directed-study-report-2_files/distill-2.2.21/template.v2.js"></script>
|
||
<!--radix_placeholder_site_in_header-->
|
||
<!--/radix_placeholder_site_in_header-->
|
||
|
||
|
||
</head>
|
||
|
||
<body>
|
||
|
||
<!--radix_placeholder_front_matter-->
|
||
|
||
<script id="distill-front-matter" type="text/json">
|
||
{"title":"Machine Learning Directed Study: Report 2","description":"Advanced processing of 3D meshes using Julia, and data science in Matlab.","authors":[{"author":"Anson Biggs","authorURL":"https://ansonbiggs.com","affiliation":" ","affiliationURL":"#","orcidID":""}],"publishedDate":"2022-04-03T00:00:00.000-07:00","citationText":"Biggs, 2022"}
|
||
</script>
|
||
|
||
<!--/radix_placeholder_front_matter-->
|
||
<!--radix_placeholder_navigation_before_body-->
|
||
<!--/radix_placeholder_navigation_before_body-->
|
||
<!--radix_placeholder_site_before_body-->
|
||
<!--/radix_placeholder_site_before_body-->
|
||
|
||
<div class="d-title">
|
||
<h1>Machine Learning Directed Study: Report 2</h1>
|
||
<!--radix_placeholder_categories-->
|
||
<div class="dt-tags">
|
||
<div class="dt=tag">Matlab</div>
|
||
<div class="dt=tag">Orbital Debris</div>
|
||
<div class="dt=tag">Julia</div>
|
||
</div>
|
||
<!--/radix_placeholder_categories-->
|
||
<p><p>Advanced processing of 3D meshes using Julia, and data science in Matlab.</p></p>
|
||
</div>
|
||
|
||
<div class="d-byline">
|
||
Anson Biggs <a href="https://ansonbiggs.com" class="uri">https://ansonbiggs.com</a>
|
||
|
||
<br/>2022-04-03
|
||
</div>
|
||
|
||
<div class="d-article">
|
||
<h2 id="gathering-data">Gathering Data</h2>
|
||
<p>To get started on the project before any scans of the actual debris are made available, I opted to find 3D models online and process them as if they were data collected by my team. GrabCAD is an excellent source of high-quality 3D models, and all the models have, at worst, a non-commercial license making them suitable for this study. The current dataset uses three separate satellite assemblies found on GrabCAD, below is an example of one of the satellites that was used.</p>
|
||
<figure>
|
||
<img src="Figures/assembly.jpg" alt="Example CubeSat Used for Analysis, Interfluo (n.d.)" /><figcaption aria-hidden="true">Example CubeSat Used for Analysis, <span class="citation" data-cites="interfluo6UCubeSatModel">Interfluo (<a href="#ref-interfluo6UCubeSatModel" role="doc-biblioref">n.d.</a>)</span></figcaption>
|
||
</figure>
|
||
<h2 id="data-preparation">Data Preparation</h2>
|
||
<p>The models were processed in Blender, which quickly converted the assemblies to <code>stl</code> files, giving 108 unique parts to be processed. Since the expected final size of the dataset is expected to be in the magnitude of the thousands, an algorithm capable of getting the required properties of each part is the only feasible solution. From the analysis performed in <a href="https://gitlab.com/orbital-debris-research/directed-study/report-1/-/blob/main/README.md">Report 1</a>, we know that the essential debris property is the moments of inertia which helped narrow down potential algorithms. Unfortunately, this is one of the more complicated things to calculate from a mesh, but thanks to a paper from <span class="citation" data-cites="eberlyPolyhedralMassProperties2002">(<a href="#ref-eberlyPolyhedralMassProperties2002" role="doc-biblioref">Eberly 2002</a>)</span> titled <a href="https://www.geometrictools.com/Documentation/PolyhedralMassProperties.pdf">Polyhedral Mass Properties</a>, his algorithm was implemented in the Julia programming language. The current implementation of the algorithm calculates a moment of inertia tensor, volume, center of gravity, characteristic length, and surface body dimensions in a few milliseconds per part. The library can be found <a href="https://gitlab.com/MisterBiggs/stl-process">here.</a> The characteristic length is a value that is heavily used by the NASA DebriSat project <span class="citation" data-cites="DebriSat2019">(<a href="#ref-DebriSat2019" role="doc-biblioref">Murray et al. 2019</a>)</span> that is doing very similar work to this project. The characteristic length takes the maximum orthogonal dimension of a body, sums the dimensions then divides by 3 to produce a single scalar value that can be used to get an idea of thesize of a 3D object.</p>
|
||
<figure>
|
||
<img src="Figures/current_process.svg" alt="Current mesh processing pipeline" /><figcaption aria-hidden="true">Current mesh processing pipeline</figcaption>
|
||
</figure>
|
||
<p>The algorithm’s speed is critical not only for the eventual large number of debris pieces that have to be processed, but many of the data science algorithms we plan on performing on the compiled data need the data to be normalized. For the current dataset and properties, it makes the most sense to normalize the dataset based on volume. Volume was chosen for multiple reasons, namely because it was easy to implement an efficient algorithm to calculate volume, and currently, volume produces the least amount of variation out of the current set of properties calculated. Unfortunately, scaling a model to a specific volume is an iterative process, but can be done very efficiently using derivative-free numerical root-finding algorithms. The current implementation can scale and process all the properties using only 30% more time than getting the properties without first scaling.</p>
|
||
<div class="sourceCode" id="cb1"><pre class="sourceCode txt"><code class="sourceCode default"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true" tabindex="-1"></a> Row │ variable mean min median max</span>
|
||
<span id="cb1-2"><a href="#cb1-2" aria-hidden="true" tabindex="-1"></a>─────┼───────────────────────────────────────────────────────────────────</span>
|
||
<span id="cb1-3"><a href="#cb1-3" aria-hidden="true" tabindex="-1"></a> 1 │ surface_area 25.2002 5.60865 13.3338 159.406</span>
|
||
<span id="cb1-4"><a href="#cb1-4" aria-hidden="true" tabindex="-1"></a> 2 │ characteristic_length 79.5481 0.158521 1.55816 1582.23</span>
|
||
<span id="cb1-5"><a href="#cb1-5" aria-hidden="true" tabindex="-1"></a> 3 │ sbx 1.40222 0.0417367 0.967078 10.0663</span>
|
||
<span id="cb1-6"><a href="#cb1-6" aria-hidden="true" tabindex="-1"></a> 4 │ sby 3.3367 0.0125824 2.68461 9.68361</span>
|
||
<span id="cb1-7"><a href="#cb1-7" aria-hidden="true" tabindex="-1"></a> 5 │ sbz 3.91184 0.29006 1.8185 14.7434</span>
|
||
<span id="cb1-8"><a href="#cb1-8" aria-hidden="true" tabindex="-1"></a> 6 │ Ix 1.58725 0.0311782 0.23401 11.1335</span>
|
||
<span id="cb1-9"><a href="#cb1-9" aria-hidden="true" tabindex="-1"></a> 7 │ Iy 3.74345 0.178598 1.01592 24.6735</span>
|
||
<span id="cb1-10"><a href="#cb1-10" aria-hidden="true" tabindex="-1"></a> 8 │ Iz 5.20207 0.178686 1.742 32.0083</span></code></pre></div>
|
||
<p>Above is a summary of the current 108 part with scaling. Since all the volumes are the same it is left out of the dataset, the center of gravity is also left out of the dataset since it currently is just an artifact of the <code>stl</code> file format. There are many ways to determine the ‘center’ of a 3D mesh, but since only one is being implemented at the moment comparisons to other properties doesn’t make sense. The other notable part of the data is the model is rotated so that the magnitudes of <code>Iz</code>, <code>Iy</code>, and <code>Ix</code> are in descending order. This makes sure that the rotation of a model doesn’t matter for characterization. The dataset is available for download here:</p>
|
||
<ul>
|
||
<li><a href="https://gitlab.com/orbital-debris-research/directed-study/report-3/-/blob/main/scaled_dataset.csv">scaled_dataset.csv</a></li>
|
||
</ul>
|
||
<h2 id="characterization">Characterization</h2>
|
||
<p>The first step toward characterization is to perform a principal component analysis to determine what properties of the data capture the most variation. <code>PCA</code> also requires that the data is scaled, so as discussed above the dataset that is scaled by <code>volume</code> will be used. <code>PCA</code> is implemented manually instead of the Matlab built-in function as shown below:</p>
|
||
<div class="sourceCode" id="cb2"><pre class="sourceCode matlab"><code class="sourceCode matlab"><span id="cb2-1"><a href="#cb2-1" aria-hidden="true" tabindex="-1"></a><span class="co">% covaraince matrix of data points</span></span>
|
||
<span id="cb2-2"><a href="#cb2-2" aria-hidden="true" tabindex="-1"></a><span class="va">S</span><span class="op">=</span><span class="va">cov</span>(<span class="va">scaled_data</span>)<span class="op">;</span></span>
|
||
<span id="cb2-3"><a href="#cb2-3" aria-hidden="true" tabindex="-1"></a></span>
|
||
<span id="cb2-4"><a href="#cb2-4" aria-hidden="true" tabindex="-1"></a><span class="co">% eigenvalues of S</span></span>
|
||
<span id="cb2-5"><a href="#cb2-5" aria-hidden="true" tabindex="-1"></a><span class="va">eig_vals</span> <span class="op">=</span> <span class="va">eig</span>(<span class="va">S</span>)<span class="op">;</span></span>
|
||
<span id="cb2-6"><a href="#cb2-6" aria-hidden="true" tabindex="-1"></a></span>
|
||
<span id="cb2-7"><a href="#cb2-7" aria-hidden="true" tabindex="-1"></a><span class="co">% sorting eigenvalues from largest to smallest </span></span>
|
||
<span id="cb2-8"><a href="#cb2-8" aria-hidden="true" tabindex="-1"></a>[<span class="va">lambda</span><span class="op">,</span> <span class="va">sort_index</span>] <span class="op">=</span> <span class="va">sort</span>(<span class="va">eig_vals</span><span class="op">,</span><span class="ss">'descend'</span>)<span class="op">;</span></span>
|
||
<span id="cb2-9"><a href="#cb2-9" aria-hidden="true" tabindex="-1"></a></span>
|
||
<span id="cb2-10"><a href="#cb2-10" aria-hidden="true" tabindex="-1"></a></span>
|
||
<span id="cb2-11"><a href="#cb2-11" aria-hidden="true" tabindex="-1"></a><span class="va">lambda_ratio</span> <span class="op">=</span> <span class="va">cumsum</span>(<span class="va">lambda</span>) <span class="op">./</span> <span class="va">sum</span>(<span class="va">lambda</span>)</span></code></pre></div>
|
||
<p>Then plotting <code>lambda_ratio</code>, which is the <code>cumsum</code>/<code>sum</code> produces the following plot:</p>
|
||
<figure>
|
||
<img src="Figures/pca.png" alt="PCA Plot" /><figcaption aria-hidden="true">PCA Plot</figcaption>
|
||
</figure>
|
||
<p>The current dataset can be described incredibly well just by looking at <code>Iz</code>, which again the models are rotated so that <code>Iz</code> is the largest moment of inertia. Then including <code>Iy</code> and <code>Iz</code> means that a 3D plot of the principle moments of inertia almost capture all the variation in the data.</p>
|
||
<p>The next step for characterization is to get only the inertia’s from the dataset. Since the current dataset is so small, the scaled dataset will be used for rest of the characterization process. Once more parts are added to the database it will make sense to start looking at the raw dataset. Now we can proceed to cluster the data using the k-means method of clustering. To properly use k-means a value of k, which is the number of clusters, needs to be determined. This can be done by creating an elbow plot using the following code:</p>
|
||
<div class="sourceCode" id="cb3"><pre class="sourceCode matlab"><code class="sourceCode matlab"><span id="cb3-1"><a href="#cb3-1" aria-hidden="true" tabindex="-1"></a><span class="kw">for</span> <span class="va">ii</span><span class="op">=</span><span class="fl">1</span><span class="op">:</span><span class="fl">20</span></span>
|
||
<span id="cb3-2"><a href="#cb3-2" aria-hidden="true" tabindex="-1"></a> [<span class="va">idx</span><span class="op">,~,</span><span class="va">sumd</span>] <span class="op">=</span> <span class="va">kmeans</span>(<span class="va">inertia</span><span class="op">,</span><span class="va">ii</span>)<span class="op">;</span></span>
|
||
<span id="cb3-3"><a href="#cb3-3" aria-hidden="true" tabindex="-1"></a> <span class="va">J</span>(<span class="va">ii</span>)<span class="op">=</span><span class="va">norm</span>(<span class="va">sumd</span>)<span class="op">;</span></span>
|
||
<span id="cb3-4"><a href="#cb3-4" aria-hidden="true" tabindex="-1"></a><span class="kw">end</span></span></code></pre></div>
|
||
<p>Which produces the following plot:</p>
|
||
<figure>
|
||
<img src="Figures/kmeans.png" alt="Elbow method to determine the required number of clusters." /><figcaption aria-hidden="true">Elbow method to determine the required number of clusters.</figcaption>
|
||
</figure>
|
||
<p>As can be seen in the above elbow plot, at 6 clusters there is an “elbow” which is where there is a large drop in the sum distance to the centroid of each cluster which means that it is the optimal number of clusters. The inertia’s can then be plotted using 6 k-means clusters produces the following plot:</p>
|
||
<figure>
|
||
<img src="Figures/inertia3d.png" alt="Moments of Inertia plotted with 6 clusters." /><figcaption aria-hidden="true">Moments of Inertia plotted with 6 clusters.</figcaption>
|
||
</figure>
|
||
<p>From this plot it is immediately clear that there are clusters of outliers. These are due to the different shapes and the extreme values are slender rods or flat plates while the clusters closer to the center more closely resemble a sphere. As the dataset grows it should become more apparent what kind of clusters actually make up a satellite, and eventually space debris in general.</p>
|
||
<h2 id="next-steps">Next Steps</h2>
|
||
<p>The current dataset needs to be grown in both the amount of data and the variety of data. The most glaring issue with the current dataset is the lack of any debris since the parts are straight from satellite assemblies. Getting accurate properties from the current scans we have is an entire research project in itself, so hopefully, getting pieces that are easier to scan can help bring the project back on track. The other and harder-to-fix issue is finding/deriving more data properties. Properties such as cross-sectional or aerodynamic drag would be very insightful but are likely to be difficult to implement in code and significantly more resource intensive than the current properties the code can derive.</p>
|
||
<div class="sourceCode" id="cb4"><pre class="sourceCode r distill-force-highlighting-css"><code class="sourceCode r"></code></pre></div>
|
||
<div id="refs" class="references csl-bib-body hanging-indent" role="doc-bibliography">
|
||
<div id="ref-eberlyPolyhedralMassProperties2002" class="csl-entry" role="doc-biblioentry">
|
||
Eberly, David. 2002. <span>“Polyhedral <span>Mass Properties</span> (<span>Revisited</span>).”</span> <a href="https://www.geometrictools.com/Documentation/PolyhedralMassProperties.pdf">https://www.geometrictools.com/Documentation/PolyhedralMassProperties.pdf</a>.
|
||
</div>
|
||
<div id="ref-interfluo6UCubeSatModel" class="csl-entry" role="doc-biblioentry">
|
||
Interfluo. n.d. <span>“<span>6u CubeSat</span> Model | <span>3d CAD Model Library</span> | <span>GrabCAD</span>.”</span> Accessed February 15, 2022. <a href="https://grabcad.com/library/6u-cubesat-model-1">https://grabcad.com/library/6u-cubesat-model-1</a>.
|
||
</div>
|
||
<div id="ref-DebriSat2019" class="csl-entry" role="doc-biblioentry">
|
||
Murray, James, Heather Cowardin, J-C Liou, Marlon Sorge, Norman Fitz-Coy, and Tom Huynh. 2019. <span>“Analysis of the DebriSat Fragments and Comparison to the NASA Standard Satellite Breakup Model.”</span> In <em>International Orbital Debris Conference (IOC)</em>. JSC-E-DAA-TN73918. <a href="https://ntrs.nasa.gov/citations/20190034081">https://ntrs.nasa.gov/citations/20190034081</a>.
|
||
</div>
|
||
</div>
|
||
<!--radix_placeholder_article_footer-->
|
||
<!--/radix_placeholder_article_footer-->
|
||
</div>
|
||
|
||
<div class="d-appendix">
|
||
</div>
|
||
|
||
|
||
<!--radix_placeholder_site_after_body-->
|
||
<!--/radix_placeholder_site_after_body-->
|
||
<!--radix_placeholder_appendices-->
|
||
<div class="appendix-bottom">
|
||
<h3 id="references">References</h3>
|
||
<div id="references-listing"></div>
|
||
<h3 id="updates-and-corrections">Corrections</h3>
|
||
<p>If you see mistakes or want to suggest changes, please <a href="https://gitlab.com/orbital-debris-research/directed-study/report-2">create an issue</a> on the source repository.</p>
|
||
</div>
|
||
<!--/radix_placeholder_appendices-->
|
||
<!--radix_placeholder_navigation_after_body-->
|
||
<!--/radix_placeholder_navigation_after_body-->
|
||
|
||
</body>
|
||
|
||
</html>
|