<?xml version="1.0" encoding="UTF-8"?>
<!-- This XML file has been created by Easy JavaScript Simulations (EjsS). Visit http://www.um.es/fem/Ejs. -->
<!-- Please, save the file to your hard disk on your Ejs' user directory and open it with Ejs. -->
<Osejs version="6.1 BETA">
<Osejs.Information>
<Title><![CDATA[Light Transmission and Scattering Through Materials]]></Title>
<Copyright><![CDATA[]]></Copyright>
<Keywords><![CDATA[]]></Keywords>
<Level><![CDATA[]]></Level>
<Language><![CDATA[]]></Language>
<Abstract><![CDATA[Explore how transmission and scattering affect whether a material appears transparent, translucent, or opaque.]]></Abstract>
<FixedNavigationBar>false</FixedNavigationBar>
<RunAlways>true</RunAlways>
<UseInterpreter>true</UseInterpreter>
<UseDeltaForODE>false</UseDeltaForODE>
<ModelTab></ModelTab>
<ModelTabTitle><![CDATA[]]></ModelTabTitle>
<ModelName><![CDATA[]]></ModelName>
<CSSFile></CSSFile>
<StaticImages>
</StaticImages>
<HTMLHead><![CDATA[<script async="true" src="https://www.googletagmanager.com/gtag/js?id=UA-3326007-19"></script>
<script>
  window.dataLayer = window.dataLayer || [];
  function gtag(){dataLayer.push(arguments);}
  gtag('js', new Date());
  gtag('config', 'UA-3326007-19');
</script>
<script data-ad-client="ca-pub-0121577198857509" async="true" src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>]]></HTMLHead>
<Logo>./blurImage/Screenshot 2021-04-16 at 9.29.01 AM (2).png</Logo>
<Author><![CDATA[shaun; lookang]]></Author>
<AuthorLogo>;</AuthorLogo>
<DetectedFiles><![CDATA[%imageUrl%;./blurImage/Screenshot 2021-04-16 at 9.29.01 AM (2).png;]]></DetectedFiles>
<AuxiliaryFiles><![CDATA[./blurImage/;]]></AuxiliaryFiles>
</Osejs.Information>
<Osejs.Description>
</Osejs.Description>
<Osejs.Model>
<Osejs.Model.FramesPerSecond>5</Osejs.Model.FramesPerSecond>
<Osejs.Model.StepsPerDisplay>1</Osejs.Model.StepsPerDisplay>
<Osejs.Model.Autostart>true</Osejs.Model.Autostart>
<Osejs.Model.Variables>
<Osejs.Model.Variables.Page>
<Type>VARIABLE_EDITOR</Type>
<Name>Var Table</Name>
<Active>true</Active>
<Internal>false</Internal>
<Content>
<PageComment><![CDATA[]]></PageComment>
<Variable>
<Name><![CDATA[lensLength]]></Name>
<Value><![CDATA[4]]></Value>
<Type><![CDATA[double]]></Type>
<Dimension><![CDATA[]]></Dimension>
<Domain><![CDATA[public]]></Domain>
<Comment><![CDATA[null]]></Comment>
</Variable>
<Variable>
<Name><![CDATA[lensColor]]></Name>
<Value><![CDATA["rgba(0, 0, 0, 0.2)"]]></Value>
<Type><![CDATA[String]]></Type>
<Dimension><![CDATA[]]></Dimension>
<Domain><![CDATA[public]]></Domain>
<Comment><![CDATA[null]]></Comment>
</Variable>
<Variable>
<Name><![CDATA[imageUrl]]></Name>
<Value><![CDATA["./blurImage/sample_img1.jpg"]]></Value>
<Type><![CDATA[String]]></Type>
<Dimension><![CDATA[]]></Dimension>
<Domain><![CDATA[public]]></Domain>
<Comment><![CDATA[null]]></Comment>
</Variable>
<Variable>
<Name><![CDATA[opacity]]></Name>
<Value><![CDATA[0.8]]></Value>
<Type><![CDATA[double]]></Type>
<Dimension><![CDATA[]]></Dimension>
<Domain><![CDATA[public]]></Domain>
<Comment><![CDATA[Transmission of light]]></Comment>
</Variable>
<Variable>
<Name><![CDATA[scattering]]></Name>
<Value><![CDATA[0.1]]></Value>
<Type><![CDATA[double]]></Type>
<Dimension><![CDATA[]]></Dimension>
<Domain><![CDATA[public]]></Domain>
<Comment><![CDATA[How much the transmitted light is scattered]]></Comment>
</Variable>
<Variable>
<Name><![CDATA[font]]></Name>
<Value><![CDATA["normal normal 2vw"]]></Value>
<Type><![CDATA[String]]></Type>
<Dimension><![CDATA[]]></Dimension>
<Domain><![CDATA[public]]></Domain>
<Comment><![CDATA[null]]></Comment>
</Variable>
<Variable>
<Name><![CDATA[state]]></Name>
<Value><![CDATA["Mostly Transparent"]]></Value>
<Type><![CDATA[String]]></Type>
<Dimension><![CDATA[]]></Dimension>
<Domain><![CDATA[public]]></Domain>
<Comment><![CDATA[null]]></Comment>
</Variable>
<Variable>
<Name><![CDATA[behaviorText]]></Name>
<Value><![CDATA["Light passes through clearly."]]></Value>
<Type><![CDATA[String]]></Type>
<Dimension><![CDATA[]]></Dimension>
<Domain><![CDATA[public]]></Domain>
<Comment><![CDATA[null]]></Comment>
</Variable>
<Variable>
<Name><![CDATA[promptText]]></Name>
<Value><![CDATA["Prediction: Will the image stay sharp, become fuzzy, or disappear?"]]></Value>
<Type><![CDATA[String]]></Type>
<Dimension><![CDATA[]]></Dimension>
<Domain><![CDATA[public]]></Domain>
<Comment><![CDATA[null]]></Comment>
</Variable>
<Variable>
<Name><![CDATA[transmissionText]]></Name>
<Value><![CDATA["Light transmitted: 80%"]]></Value>
<Type><![CDATA[String]]></Type>
<Dimension><![CDATA[]]></Dimension>
<Domain><![CDATA[public]]></Domain>
<Comment><![CDATA[null]]></Comment>
</Variable>
<Variable>
<Name><![CDATA[scatteringText]]></Name>
<Value><![CDATA["Scattering: 10%"]]></Value>
<Type><![CDATA[String]]></Type>
<Dimension><![CDATA[]]></Dimension>
<Domain><![CDATA[public]]></Domain>
<Comment><![CDATA[null]]></Comment>
</Variable>
</Content>
</Osejs.Model.Variables.Page>
</Osejs.Model.Variables>
<Osejs.Model.Initialization>
<Osejs.Model.Initialization.Page>
<Type>CODE_EDITOR</Type>
<Name>Init Page</Name>
<Active>true</Active>
<Internal>false</Internal>
<Content>
<Comment><![CDATA[]]></Comment>
<Code><![CDATA[
if (_isMobile){
  // keep defaults on smaller screens
}
else{
  _view.plottingPanel.getMessageDecoration("TL").getFont().setFontSize("2vw");
  _view.plottingPanel.getMessageDecoration("TR").getFont().setFontSize("2vw");
  _view.plottingPanel.getMessageDecoration("BL").getFont().setFontSize("2vw");
  _view.plottingPanel.getMessageDecoration("BR").getFont().setFontSize("2vw");
}
updateMaterialModel();
]]></Code>
</Content>
</Osejs.Model.Initialization.Page>
</Osejs.Model.Initialization>
<Osejs.Model.Evolution>
</Osejs.Model.Evolution>
<Osejs.Model.Constraints>
<Osejs.Model.Constraints.Page>
<Type>CODE_EDITOR</Type>
<Name>FixRel Page</Name>
<Active>true</Active>
<Internal>false</Internal>
<Content>
<Comment><![CDATA[]]></Comment>
<Code><![CDATA[
/*
Creates the SVG blur filter and clip path once.
The lens region shows how transmitted light can also be scattered.
*/
_view._update();
_view._render();
ensureSvgEffects();
syncClipCircle();
syncSvgVisuals();
]]></Code>
</Content>
</Osejs.Model.Constraints.Page>
</Osejs.Model.Constraints>
<Osejs.Model.Library>
<Osejs.Model.Library.Page>
<Type>LIBRARY_EDITOR</Type>
<Name>setAttributes</Name>
<Active>true</Active>
<Internal>false</Internal>
<Content>
<Comment><![CDATA[]]></Comment>
<Code><![CDATA[
function setAttributes (ele, attrs) {
  for (var key in attrs) {
    ele.setAttribute(key, attrs[key]);
  }
}

function formatPercent(value) {
  return Math.round(100 * value) + "%";
}

function updateMaterialModel() {
  var transmission = Math.max(0, Math.min(1, opacity));
  var haze = Math.max(0, Math.min(1, scattering));

  opacity = transmission;
  scattering = haze;
  lensColor = "rgba(0, 0, 0, " + (1 - transmission) + ")";
  transmissionText = "Light transmitted: " + formatPercent(transmission);
  scatteringText = "Scattering: " + formatPercent(haze);

  if (transmission <= 0.15) {
    state = "Opaque";
    behaviorText = "Very little light gets through, so the image is blocked.";
  }
  else if (haze >= 0.35) {
    state = "Translucent";
    behaviorText = "Light passes through, but scattering makes the image look fuzzy.";
  }
  else if (transmission >= 0.85) {
    state = "Transparent";
    behaviorText = "Most light passes through in an orderly way, so the image stays sharp.";
  }
  else {
    state = "Mostly Transparent";
    behaviorText = "A lot of light gets through, but the material still dims the image a little.";
  }

  syncSvgVisuals();
}

function ensureSvgEffects() {
  var lens = document.getElementById('lens');
  if (lens == null || document.getElementById('blurFilter') != null) {
    return;
  }

  var defs = document.querySelector('#plottingPanel');
  if (defs == null) {
    return;
  }

  var filter = document.createElementNS("http://www.w3.org/2000/svg", "filter");
  setAttributes(filter, {
    id: "blurFilter"
  });

  var gaussBlur = document.createElementNS("http://www.w3.org/2000/svg", "feGaussianBlur");
  setAttributes(gaussBlur, {
    id: "gaussBlur",
    in: "SourceGraphic",
    stdDeviation: 10 * scattering
  });
  filter.append(gaussBlur);

  var blurClip = document.createElementNS("http://www.w3.org/2000/svg", "clipPath");
  setAttributes(blurClip, {
    id: "blurClip"
  });

  var clipCircle = document.createElementNS("http://www.w3.org/2000/svg", "circle");
  setAttributes(clipCircle, {
    id: "clipCircle",
    cx: lens.getAttribute('cx'),
    cy: lens.getAttribute('cy'),
    r: lens.getAttribute('rx')
  });

  blurClip.prepend(clipCircle);
  defs.prepend(filter, blurClip);
}

function syncClipCircle() {
  var lens = document.getElementById('lens');
  var clipCircle = document.getElementById('clipCircle');
  if (lens == null || clipCircle == null) {
    return;
  }

  setAttributes(clipCircle, {
    cx: lens.getAttribute('cx'),
    cy: lens.getAttribute('cy'),
    r: lens.getAttribute('rx')
  });
}

function syncSvgVisuals() {
  var gaussBlur = document.getElementById("gaussBlur");
  if (gaussBlur != null) {
    setAttributes(gaussBlur, {
      stdDeviation: 10 * scattering
    });
  }

  var blurImage = document.getElementById("blurImage");
  if (blurImage != null) {
    setAttributes(blurImage, {
      opacity: opacity
    });
  }
}

function applyPreset(name) {
  if (name === "glass") {
    opacity = 0.95;
    scattering = 0.05;
  }
  else if (name === "paper") {
    opacity = 0.75;
    scattering = 0.75;
  }
  else if (name === "wood") {
    opacity = 0.05;
    scattering = 0.05;
  }
  updateMaterialModel();
}
]]></Code>
</Content>
</Osejs.Model.Library.Page>
</Osejs.Model.Library>
<Osejs.Model.Elements>
</Osejs.Model.Elements>
</Osejs.Model>
<Osejs.HtmlView>
<Osejs.HtmlView.Page>
<Type>HTML_VIEW_EDITOR</Type>
<Name>HtmlView Page</Name>
<Active>true</Active>
<Internal>false</Internal>
<Content>
<RootProperties>
</RootProperties>
<Tree>
<HtmlView.Element>
<Expanded>true</Expanded>
<Type>Elements.Panel</Type>
<Name><![CDATA[topPanel]]></Name>
</HtmlView.Element>
<HtmlView.Element>
<Type>Elements.Label</Type>
<Name><![CDATA[imageLabel]]></Name>
<Parent><![CDATA[topPanel]]></Parent>
<Property name="Text"><![CDATA["Choose Image: "]]></Property>
<Property name="Font"><![CDATA[font]]></Property>
</HtmlView.Element>
<HtmlView.Element>
<Type>Elements.ComboBox</Type>
<Name><![CDATA[comboBox]]></Name>
<Parent><![CDATA[topPanel]]></Parent>
<Property name="Options"><![CDATA[["Image 1", "Image 2", "Image 3", "Image 4"]]]></Property>
<Property name="OnChange"><![CDATA[var selected = _view.comboBox.getProperty("SelectedOptions");
if(selected == "Image 1"){
  imageUrl = "./blurImage/sample_img1.jpg";
}
else if(selected == "Image 2"){
  imageUrl = "./blurImage/sample_img2.jpg";
}
else if(selected == "Image 3"){
  imageUrl = "./blurImage/sample_img3.jpg";
}
else{
  imageUrl = "./blurImage/sample_img4.jpg";
}
]]></Property>
<Property name="Font"><![CDATA[font]]></Property>
</HtmlView.Element>
<HtmlView.Element>
<Type>Elements.Label</Type>
<Name><![CDATA[opacityLabel]]></Name>
<Parent><![CDATA[topPanel]]></Parent>
<Property name="Background"><![CDATA[lensColor]]></Property>
<Property name="Text"><![CDATA[transmissionText]]></Property>
<Property name="Font"><![CDATA[font]]></Property>
</HtmlView.Element>
<HtmlView.Element>
<Type>Elements.Slider</Type>
<Name><![CDATA[opacitySlider]]></Name>
<Parent><![CDATA[topPanel]]></Parent>
<Property name="Minimum"><![CDATA[0]]></Property>
<Property name="Maximum"><![CDATA[1]]></Property>
<Property name="Background"><![CDATA[lensColor]]></Property>
<Property name="Value"><![CDATA[opacity]]></Property>
<Property name="OnChange"><![CDATA[updateMaterialModel();]]></Property>
<Property name="Step"><![CDATA[0.1]]></Property>
<Property name="Width"><![CDATA["20%"]]></Property>
</HtmlView.Element>
<HtmlView.Element>
<Type>Elements.Label</Type>
<Name><![CDATA[scatteringLabel]]></Name>
<Parent><![CDATA[topPanel]]></Parent>
<Property name="Background"><![CDATA["rgba(220,220,220,0.9)"]]></Property>
<Property name="Text"><![CDATA[scatteringText]]></Property>
<Property name="Font"><![CDATA[font]]></Property>
</HtmlView.Element>
<HtmlView.Element>
<Type>Elements.Slider</Type>
<Name><![CDATA[scatteringSlider]]></Name>
<Parent><![CDATA[topPanel]]></Parent>
<Property name="Minimum"><![CDATA[0]]></Property>
<Property name="Maximum"><![CDATA[1]]></Property>
<Property name="Value"><![CDATA[scattering]]></Property>
<Property name="OnChange"><![CDATA[updateMaterialModel();]]></Property>
<Property name="Step"><![CDATA[0.1]]></Property>
<Property name="Width"><![CDATA["20%"]]></Property>
</HtmlView.Element>
<HtmlView.Element>
<Type>Elements.Button</Type>
<Name><![CDATA[glassButton]]></Name>
<Parent><![CDATA[topPanel]]></Parent>
<Property name="Text"><![CDATA["Clear Glass"]]></Property>
<Property name="OnClick"><![CDATA[applyPreset("glass");]]></Property>
<Property name="Font"><![CDATA[font]]></Property>
</HtmlView.Element>
<HtmlView.Element>
<Type>Elements.Button</Type>
<Name><![CDATA[paperButton]]></Name>
<Parent><![CDATA[topPanel]]></Parent>
<Property name="Text"><![CDATA["Tracing Paper"]]></Property>
<Property name="OnClick"><![CDATA[applyPreset("paper");]]></Property>
<Property name="Font"><![CDATA[font]]></Property>
</HtmlView.Element>
<HtmlView.Element>
<Type>Elements.Button</Type>
<Name><![CDATA[woodButton]]></Name>
<Parent><![CDATA[topPanel]]></Parent>
<Property name="Text"><![CDATA["Wood"]]></Property>
<Property name="OnClick"><![CDATA[applyPreset("wood");]]></Property>
<Property name="Font"><![CDATA[font]]></Property>
</HtmlView.Element>
<HtmlView.Element>
<Expanded>true</Expanded>
<Type>Elements.Panel</Type>
<Name><![CDATA[mainPanel]]></Name>
</HtmlView.Element>
<HtmlView.Element>
<Expanded>true</Expanded>
<Type>Elements.PlottingPanel</Type>
<Name><![CDATA[plottingPanel]]></Name>
<Parent><![CDATA[mainPanel]]></Parent>
<Property name="Gutters"><![CDATA[[0,0,0,0]]]></Property>
<Property name="YScalePrecision"><![CDATA[0]]></Property>
<Property name="XFixedTick"><![CDATA[0]]></Property>
<Property name="Enabled"><![CDATA[true]]></Property>
<Property name="SquareAspect"><![CDATA[true]]></Property>
<Property name="MaximumY"><![CDATA[4.5]]></Property>
<Property name="YFixedTick"><![CDATA[0]]></Property>
<Property name="YAutoTicks"><![CDATA[false]]></Property>
<Property name="TLMessage"><![CDATA[promptText]]></Property>
<Property name="TRMessage"><![CDATA[state]]></Property>
<Property name="BLMessage"><![CDATA[transmissionText + " | " + scatteringText]]></Property>
<Property name="BRMessage"><![CDATA[behaviorText]]></Property>
<Property name="MinimumY"><![CDATA[-4.5]]></Property>
<Property name="XTickStep"><![CDATA[1]]></Property>
<Property name="YTickStep"><![CDATA[1]]></Property>
<Property name="AutoScaleY"><![CDATA[false]]></Property>
<Property name="AutoScaleX"><![CDATA[false]]></Property>
<Property name="XAutoTicks"><![CDATA[false]]></Property>
<Property name="Height"><![CDATA["90vh"]]></Property>
<Property name="XScalePrecision"><![CDATA[0]]></Property>
<Property name="Width"><![CDATA["100%"]]></Property>
</HtmlView.Element>
<HtmlView.Element>
<Type>Elements.Image2D</Type>
<Name><![CDATA[image]]></Name>
<Parent><![CDATA[plottingPanel]]></Parent>
<Property name="SizeX"><![CDATA[16]]></Property>
<Property name="ImageUrl"><![CDATA[%imageUrl%]]></Property>
<Property name="SizeY"><![CDATA[9]]></Property>
</HtmlView.Element>
<HtmlView.Element>
<Type>Elements.Image2D</Type>
<Name><![CDATA[blurImage]]></Name>
<Parent><![CDATA[plottingPanel]]></Parent>
<Property name="SizeX"><![CDATA[16]]></Property>
<Property name="Attributes"><![CDATA[{
  "filter": "url(#blurFilter)",
  "clip-path": "url(#blurClip)",
  "opacity": opacity
}
]]></Property>
<Property name="ImageUrl"><![CDATA[%imageUrl%]]></Property>
<Property name="SizeY"><![CDATA[9]]></Property>
</HtmlView.Element>
<HtmlView.Element>
<Type>Elements.Shape2D</Type>
<Name><![CDATA[lens]]></Name>
<Parent><![CDATA[plottingPanel]]></Parent>
<Property name="FillColor"><![CDATA[lensColor]]></Property>
<Property name="Sensitivity"><![CDATA[100]]></Property>
<Property name="SizeX"><![CDATA[lensLength]]></Property>
<Property name="ShapeType"><![CDATA["ELLIPSE"]]></Property>
<Property name="LineColor"><![CDATA["black"]]></Property>
<Property name="SizeY"><![CDATA[lensLength]]></Property>
<Property name="LineWidth"><![CDATA[10]]></Property>
<Property name="EnabledPosition"><![CDATA["ENABLED_ANY"]]></Property>
<Property name="OnDrag"><![CDATA[syncClipCircle();]]></Property>
</HtmlView.Element>
</Tree>
</Content>
</Osejs.HtmlView.Page>
</Osejs.HtmlView>
</Osejs>
