Files
Terrarum/work_files/JoiseDoc/Modules.html
2018-12-24 22:49:08 +09:00

1114 lines
74 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<!--<html manifest="/manifest.appcache">-->
<html class="gr__joise_sudoplaygames_com"><script type="text/javascript" charset="utf-8" id="zm-extension" src="Modules_files/webrtc-patch.js" async=""></script><head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>Modules</title>
<meta name="viewport" content="width=device-width">
<meta name="description" content="SudoPlay Games is a small, independent game studio located in Oregon, USA.">
<link rel="canonical" href="http://www.sudoplaygames.com/modules/">
<link href="Modules_files/css_002.css" rel="stylesheet" type="text/css">
<link href="Modules_files/css.css" rel="stylesheet" type="text/css">
<link rel="stylesheet" href="Modules_files/font-awesome.css">
<link rel="stylesheet" href="Modules_files/bootstrap.css">
<link rel="stylesheet" href="Modules_files/colorbox.css">
<link rel="stylesheet" href="Modules_files/bootstrap-toc.css">
<!-- Custom Site CSS -->
<link rel="stylesheet" href="Modules_files/main.css">
<link rel="stylesheet" href="Modules_files/custom.css">
<!-- Javascripts -->
<script src="Modules_files/jquery_002.js"></script>
<script src="Modules_files/bootstrap.js"></script>
<script src="Modules_files/jquery.js"></script>
<script src="Modules_files/bootstrap-toc.js"></script>
<!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
<!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
<![endif]-->
<!--[if !IE 7]>
<style type="text/css">
#wrap {display:table;height:100%}
</style>
<![endif]-->
</head>
<body data-spy="scroll" data-target="#toc" data-offset="16" data-gr-c-s-loaded="true">
<!-- Fixed navbar -->
<div class="navbar navbar-default navbar-fixed-top" role="navigation">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<img class="brand-logo hidden-sm hidden-xs" src="Modules_files/joise-logo-small.png">
<img class="brand-logo visible-sm-inline visible-xs-inline" src="Modules_files/joise-logo-xs.png">
<a class="brand-text" href="https://joise.sudoplaygames.com/">
Joise
</a>
</div>
<div class="navbar-collapse collapse">
<ul class="nav navbar-nav navbar-right">
<!-- Home -->
<!--
<li>
<a href="/">
<i class="fa fa-home fa-lg" aria-hidden="true"></i>&nbsp;&nbsp;Home</a>
</li>
-->
<!-- Forum -->
<!--<li>
<a href="http://discourse.sudoplaygames.com">
<i class="fa fa-comments fa-lg"></i>&nbsp;&nbsp;Forum</a>
</li>-->
<!-- Quick Start -->
<li>
<a href="https://joise.sudoplaygames.com/quick-start/">
<i class="fa fa-rocket fa-lg" aria-hidden="true"></i>&nbsp;&nbsp;Quick Start</a>
</li>
<!-- Guide -->
<li>
<a href="https://joise.sudoplaygames.com/guide/">
<i class="fa fa-book fa-lg" aria-hidden="true"></i>&nbsp;&nbsp;Guide</a>
</li>
<!-- Modules -->
<li class="active">
<a href="https://joise.sudoplaygames.com/modules/">
<i class="fa fa-cubes fa-lg" aria-hidden="true"></i>&nbsp;&nbsp;Modules</a>
</li>
<!-- Source -->
<li class="active"></li><li>
<a href="https://github.com/SudoPlayGames/Joise">
<i class="fa fa-github fa-lg" aria-hidden="true"></i>&nbsp;&nbsp;Source</a>
</li>
</ul>
</div><!--/.navbar-collapse -->
</div>
</div>
<div class="main-container">
<header class="page-header">
<div class="wrap row">
<div class="col-md-12">
<h1>Modules</h1>
<p class="lead">A deeper analysis of how to use each module.</p>
</div>
</div>
</header>
<div class="wrap row">
<div class="page container">
<div class="row">
<div class="col-md-9">
<article class="page-content">
<p>All of the illustrations below are from examples that can be found in the source in the following location:</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/src/examples/java/com/sudoplay/joise/examples/
</code></pre></div></div>
<p>These are the core modules of the Joise library. All modules have been ported from <a href="http://accidentalnoise.sourceforge.net/implicit.html" target="_blank">Joshua Tippetts C++ Accidental Noise Library</a>.</p>
<h2 id="modulebasisfunction">ModuleBasisFunction</h2>
<p>The <code class="highlighter-rouge">ModuleBasisFunction</code> generates noise using one of five different <code class="highlighter-rouge">BasisTypes</code> and one of four different <code class="highlighter-rouge">InterpolationTypes</code>.</p>
<p>The following examples illustrate each basis type with the four differnent interpolation types.</p>
<h3 id="basistypegradient">BasisType.GRADIENT</h3>
<p><img src="Modules_files/gradient_002.png" class="img-responsive"></p>
<p>Gradient noise is essentially Perlins original noise function. This
implementation of gradient noise will return the value 0 at the lattice
points, therefore sampling at integer intervals (ie. 0, 1, 2, 3, etc.)
will result in a consistent output of 0. This noise, depending on the
application, may suffer from visually significant directional artifacts
or grid-oriented artifacts.</p>
<h3 id="basistypegradval">BasisType.GRADVAL</h3>
<p><img src="Modules_files/gradval.png" class="img-responsive"></p>
<p>Gradval noise is an addition of gradient and value noise designed to
reduce the visual artifacts apparent in gradient noise. Since both
gradient and value noise is bound to the grid, artifacts can still
occur.</p>
<h3 id="basistypesimplex">BasisType.SIMPLEX</h3>
<p><img src="Modules_files/simplex.png" class="img-responsive"></p>
<p>Simplex noise is a form of Perlins improved noise function.</p>
<p>For more information, see: <a href="https://en.wikipedia.org/wiki/Simplex_noise">Simplex Noise</a>.</p>
<h3 id="basistypevalue">BasisType.VALUE</h3>
<p><img src="Modules_files/value.png" class="img-responsive"></p>
<p>Value noise creates a lattice of points which are assigned random
values, then returns an interpolated value based on the values of the
lattice points surrounding the input coordinates.</p>
<h3 id="basistypewhite">BasisType.WHITE</h3>
<p><img src="Modules_files/white.png" class="img-responsive"></p>
<p>White noise generates no coherent pattern whatsoever.</p>
<h3 id="example-code">Example Code</h3>
<p>Here is a snippet from the example:</p>
<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="o">...</span>
<span class="kd">protected</span> <span class="n">Module</span> <span class="nf">createModuleBasisFunction</span><span class="o">(</span>
<span class="n">ModuleBasisFunction</span><span class="o">.</span><span class="na">BasisType</span> <span class="n">basisType</span><span class="o">,</span>
<span class="n">ModuleBasisFunction</span><span class="o">.</span><span class="na">InterpolationType</span> <span class="n">interpolationType</span>
<span class="o">)</span> <span class="o">{</span>
<span class="n">ModuleBasisFunction</span> <span class="n">moduleBasisFunction</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ModuleBasisFunction</span><span class="o">();</span>
<span class="n">moduleBasisFunction</span><span class="o">.</span><span class="na">setType</span><span class="o">(</span><span class="n">basisType</span><span class="o">);</span>
<span class="n">moduleBasisFunction</span><span class="o">.</span><span class="na">setInterpolation</span><span class="o">(</span><span class="n">interpolationType</span><span class="o">);</span>
<span class="n">moduleBasisFunction</span><span class="o">.</span><span class="na">setSeed</span><span class="o">(</span><span class="mi">42</span><span class="o">);</span>
<span class="cm">/**
* We auto-correct into the range [0, 1].
*/</span>
<span class="n">ModuleAutoCorrect</span> <span class="n">moduleAutoCorrect</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ModuleAutoCorrect</span><span class="o">(</span><span class="mi">0</span><span class="o">,</span> <span class="mi">1</span><span class="o">);</span>
<span class="n">moduleAutoCorrect</span><span class="o">.</span><span class="na">setSource</span><span class="o">(</span><span class="n">moduleBasisFunction</span><span class="o">);</span>
<span class="n">moduleAutoCorrect</span><span class="o">.</span><span class="na">setSamples</span><span class="o">(</span><span class="mi">10000</span><span class="o">);</span>
<span class="n">moduleAutoCorrect</span><span class="o">.</span><span class="na">calculate2D</span><span class="o">();</span>
<span class="cm">/**
* We scale the domain to see more of the noise.
*/</span>
<span class="n">ModuleScaleDomain</span> <span class="n">moduleScaleDomain</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ModuleScaleDomain</span><span class="o">();</span>
<span class="n">moduleScaleDomain</span><span class="o">.</span><span class="na">setSource</span><span class="o">(</span><span class="n">moduleAutoCorrect</span><span class="o">);</span>
<span class="n">moduleScaleDomain</span><span class="o">.</span><span class="na">setScaleX</span><span class="o">(</span><span class="mf">16.0</span><span class="o">);</span>
<span class="n">moduleScaleDomain</span><span class="o">.</span><span class="na">setScaleY</span><span class="o">(</span><span class="mf">16.0</span><span class="o">);</span>
<span class="k">return</span> <span class="n">moduleScaleDomain</span><span class="o">;</span>
<span class="o">}</span>
<span class="o">...</span>
</code></pre></div></div>
<h2 id="modulecellgen">ModuleCellGen</h2>
<div class="bs-callout bs-callout-warning">
<h4>This module can't be sampled directly.</h4>
The <code>ModuleCellGen</code> acts as input to the <code>ModuleCellular</code> module and therefore can't be sampled directly.
</div>
<p>The ModuleCellGen acts a source for the ModuleCellular module. It can
be shared between more than one ModuleCellular and will cache sampled
values in order to improve performance.</p>
<h2 id="modulecellular">ModuleCellular</h2>
<p><img src="Modules_files/cellGen.png" class="img-responsive"></p>
<p>ModuleCellular is used in conjunction with the ModuleCellGen to provide values based on <a href="https://joise.sudoplaygames.com/assets-3rd-party/Worley_noise">Worley noise</a>.</p>
<p>The parameters <code class="highlighter-rouge">F1</code>, <code class="highlighter-rouge">F2</code>, <code class="highlighter-rouge">F3</code>, and <code class="highlighter-rouge">F4</code>
are coefficients multiplied by the distances to the first, second,
third, and fourth closest feature points, respectively. By default, the
value for each of these coefficients is zero.</p>
<p>Here is an excerpt from <a href="http://www.rhythmiccanvas.com/research/papers/worley.pdf" target="_blank">Worleys original paper</a>:</p>
<blockquote>
<p>We can define a new basis function based on the idea of random
feature points. Imagine points randomly distributed through all of R3.
For any location x, there is some feature point which lies closer to x
than any other feature point. Define F1(x) as the distance from x to
that closest feature point. As x is varied, F1 varies smoothly since the
distance between the sample location and the fixed feature point varies
smoothly. However, at certain cusp locations, the point x will be
equidistant between two feature points. Here, the value of F1(x) is
still well defined, since the value is the same no matter which feature
point is chosen to calculate the distance. Varying the position of x
will return values of F1 that are still continuous, though the
derivative of F1 will change discontinuously as the distance calculation
“switches” from one feature point to its neighbor.</p>
</blockquote>
<blockquote>
<p>It can be seen that the locations where the function F1 “switches”
from one feature point to the next (where its derivative is
discontinuous) are along the equidistance planes that separate two
points in R3. These planes are exactly the planes that are computed by a
Voronoi diagram, which by definition partitions space into cellular
regions where all the points within each region are closer to its
defining point than any other point.</p>
</blockquote>
<blockquote>
<p>The function F2(x) can be defined as the distance between the
location x and the feature point which is the second closest to the x.
With similar arguments as before, F2 is continuous everywhere, but its
derivative is not at those locations where the second-closest point
swaps with either the first-closest or third-closest. Similarly, we can
define Fn(x) as the distance between x and the nth closest feature
point.</p>
</blockquote>
<h3 id="example-code-1">Example Code</h3>
<p>Here is a snippet from the example:</p>
<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="o">...</span>
<span class="nd">@Override</span>
<span class="kd">protected</span> <span class="kt">void</span> <span class="nf">run</span><span class="o">(</span><span class="n">SplitCanvas</span> <span class="n">canvas</span><span class="o">)</span> <span class="o">{</span>
<span class="n">ModuleCellGen</span> <span class="n">moduleCellGen</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ModuleCellGen</span><span class="o">();</span>
<span class="n">moduleCellGen</span><span class="o">.</span><span class="na">setSeed</span><span class="o">(</span><span class="mi">42</span><span class="o">);</span>
<span class="n">canvas</span><span class="o">.</span><span class="na">updateImage</span><span class="o">(</span>
<span class="s">"F1 = 1"</span><span class="o">,</span> <span class="n">getSource</span><span class="o">(</span><span class="n">moduleCellGen</span><span class="o">,</span> <span class="mi">1</span><span class="o">,</span> <span class="mi">0</span><span class="o">,</span> <span class="mi">0</span><span class="o">,</span> <span class="mi">0</span><span class="o">),</span>
<span class="s">"F2 = 1"</span><span class="o">,</span> <span class="n">getSource</span><span class="o">(</span><span class="n">moduleCellGen</span><span class="o">,</span> <span class="mi">0</span><span class="o">,</span> <span class="mi">1</span><span class="o">,</span> <span class="mi">0</span><span class="o">,</span> <span class="mi">0</span><span class="o">),</span>
<span class="s">"F1 = 1, F2 = -1"</span><span class="o">,</span> <span class="n">getSource</span><span class="o">(</span><span class="n">moduleCellGen</span><span class="o">,</span> <span class="mi">1</span><span class="o">,</span> <span class="o">-</span><span class="mi">1</span><span class="o">,</span> <span class="mi">0</span><span class="o">,</span> <span class="mi">0</span><span class="o">),</span>
<span class="s">"F4 = 1"</span><span class="o">,</span> <span class="n">getSource</span><span class="o">(</span><span class="n">moduleCellGen</span><span class="o">,</span> <span class="mi">0</span><span class="o">,</span> <span class="mi">0</span><span class="o">,</span> <span class="mi">0</span><span class="o">,</span> <span class="mi">1</span><span class="o">)</span>
<span class="o">);</span>
<span class="o">}</span>
<span class="kd">private</span> <span class="n">Module</span> <span class="nf">getSource</span><span class="o">(</span><span class="n">ModuleCellGen</span> <span class="n">moduleCellGen</span><span class="o">,</span> <span class="kt">int</span> <span class="n">a</span><span class="o">,</span> <span class="kt">int</span> <span class="n">b</span><span class="o">,</span> <span class="kt">int</span> <span class="n">c</span><span class="o">,</span> <span class="kt">int</span> <span class="n">d</span><span class="o">)</span> <span class="o">{</span>
<span class="n">ModuleCellular</span> <span class="n">moduleCellular</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ModuleCellular</span><span class="o">();</span>
<span class="n">moduleCellular</span><span class="o">.</span><span class="na">setCellularSource</span><span class="o">(</span><span class="n">moduleCellGen</span><span class="o">);</span>
<span class="n">moduleCellular</span><span class="o">.</span><span class="na">setCoefficients</span><span class="o">(</span><span class="n">a</span><span class="o">,</span> <span class="n">b</span><span class="o">,</span> <span class="n">c</span><span class="o">,</span> <span class="n">d</span><span class="o">);</span>
<span class="cm">/**
* We scale the domain to visualize more of the noise.
*/</span>
<span class="n">ModuleScaleDomain</span> <span class="n">moduleScaleDomain</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ModuleScaleDomain</span><span class="o">();</span>
<span class="n">moduleScaleDomain</span><span class="o">.</span><span class="na">setSource</span><span class="o">(</span><span class="n">moduleCellular</span><span class="o">);</span>
<span class="n">moduleScaleDomain</span><span class="o">.</span><span class="na">setScaleX</span><span class="o">(</span><span class="mi">8</span><span class="o">);</span>
<span class="n">moduleScaleDomain</span><span class="o">.</span><span class="na">setScaleY</span><span class="o">(</span><span class="mi">8</span><span class="o">);</span>
<span class="cm">/**
* We auto-correct into the range [0, 1].
*/</span>
<span class="n">ModuleAutoCorrect</span> <span class="n">source</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ModuleAutoCorrect</span><span class="o">(</span><span class="mi">0</span><span class="o">,</span> <span class="mi">1</span><span class="o">);</span>
<span class="n">source</span><span class="o">.</span><span class="na">setSource</span><span class="o">(</span><span class="n">moduleScaleDomain</span><span class="o">);</span>
<span class="n">source</span><span class="o">.</span><span class="na">setSamples</span><span class="o">(</span><span class="mi">10000</span><span class="o">);</span>
<span class="n">source</span><span class="o">.</span><span class="na">calculate2D</span><span class="o">();</span>
<span class="k">return</span> <span class="n">source</span><span class="o">;</span>
<span class="o">}</span>
<span class="o">...</span>
</code></pre></div></div>
<h2 id="modulefractal">ModuleFractal</h2>
<p>The fractal module combines up to ten sources, either the default sources or custom sources set by calling the <code class="highlighter-rouge">ModuleFractal#overrideSource(int, Module)</code>
method. The basis type and interpolation type can be set for all or
individual default sources by calling the appropriate methods.</p>
<h3 id="billow">Billow</h3>
<h4 id="basistypegradient-1">BasisType.GRADIENT</h4>
<p><img src="Modules_files/billow_004.png" class="img-responsive"></p>
<h4 id="basistypegradval-1">BasisType.GRADVAL</h4>
<p><img src="Modules_files/billow_002.png" class="img-responsive"></p>
<h4 id="basistypesimplex-1">BasisType.SIMPLEX</h4>
<p><img src="Modules_files/billow_005.png" class="img-responsive"></p>
<h4 id="basistypevalue-1">BasisType.VALUE</h4>
<p><img src="Modules_files/billow.png" class="img-responsive"></p>
<h3 id="decarpentierswiss">deCarpentierSwiss</h3>
<h4 id="basistypegradient-2">BasisType.GRADIENT</h4>
<p><img src="Modules_files/deCarpentierSwiss_004.png" class="img-responsive"></p>
<h4 id="basistypegradval-2">BasisType.GRADVAL</h4>
<p><img src="Modules_files/deCarpentierSwiss.png" class="img-responsive"></p>
<h4 id="basistypesimplex-2">BasisType.SIMPLEX</h4>
<p><img src="Modules_files/deCarpentierSwiss_003.png" class="img-responsive"></p>
<h4 id="basistypevalue-2">BasisType.VALUE</h4>
<p><img src="Modules_files/deCarpentierSwiss_005.png" class="img-responsive"></p>
<h3 id="fbm">FBM</h3>
<h4 id="basistypegradient-3">BasisType.GRADIENT</h4>
<p><img src="Modules_files/fbm_003.png" class="img-responsive"></p>
<h4 id="basistypegradval-3">BasisType.GRADVAL</h4>
<p><img src="Modules_files/fbm.png" class="img-responsive"></p>
<h4 id="basistypesimplex-3">BasisType.SIMPLEX</h4>
<p><img src="Modules_files/fbm_005.png" class="img-responsive"></p>
<h4 id="basistypevalue-3">BasisType.VALUE</h4>
<p><img src="Modules_files/fbm_002.png" class="img-responsive"></p>
<h3 id="hybridmulti">HybridMulti</h3>
<h4 id="basistypegradient-4">BasisType.GRADIENT</h4>
<p><img src="Modules_files/hybridMulti_002.png" class="img-responsive"></p>
<h4 id="basistypegradval-4">BasisType.GRADVAL</h4>
<p><img src="Modules_files/hybridMulti_003.png" class="img-responsive"></p>
<h4 id="basistypesimplex-4">BasisType.SIMPLEX</h4>
<p><img src="Modules_files/hybridMulti_004.png" class="img-responsive"></p>
<h4 id="basistypevalue-4">BasisType.VALUE</h4>
<p><img src="Modules_files/hybridMulti.png" class="img-responsive"></p>
<h3 id="multi">Multi</h3>
<h4 id="basistypegradient-5">BasisType.GRADIENT</h4>
<p><img src="Modules_files/multi_002.png" class="img-responsive"></p>
<h4 id="basistypegradval-5">BasisType.GRADVAL</h4>
<p><img src="Modules_files/multi.png" class="img-responsive"></p>
<h4 id="basistypesimplex-5">BasisType.SIMPLEX</h4>
<p><img src="Modules_files/multi_003.png" class="img-responsive"></p>
<h4 id="basistypevalue-5">BasisType.VALUE</h4>
<p><img src="Modules_files/multi_004.png" class="img-responsive"></p>
<h3 id="ridgemulti">RidgeMulti</h3>
<h4 id="basistypegradient-6">BasisType.GRADIENT</h4>
<p><img src="Modules_files/ridgeMulti_002.png" class="img-responsive"></p>
<h4 id="basistypegradval-6">BasisType.GRADVAL</h4>
<p><img src="Modules_files/ridgeMulti.png" class="img-responsive"></p>
<h4 id="basistypesimplex-6">BasisType.SIMPLEX</h4>
<p><img src="Modules_files/ridgeMulti_005.png" class="img-responsive"></p>
<h4 id="basistypevalue-6">BasisType.VALUE</h4>
<p><img src="Modules_files/ridgeMulti_003.png" class="img-responsive"></p>
<h3 id="basistypewhite-1">BasisType.WHITE</h3>
<p>The white noise basis types for <code class="highlighter-rouge">ModuleFractal</code> have been grouped below for visual comparison.</p>
<h4 id="fractaltypebillow">FractalType.BILLOW</h4>
<p><img src="Modules_files/billow_003.png" class="img-responsive"></p>
<h4 id="fractaltypedecarpentierswiss">FractalType.DECARPENTIERSWISS</h4>
<p><img src="Modules_files/deCarpentierSwiss_002.png" class="img-responsive"></p>
<h4 id="fractaltypefbm">FractalType.FBM</h4>
<p><img src="Modules_files/fbm_004.png" class="img-responsive"></p>
<h4 id="fractaltypehybridmulti">FractalType.HYBRIDMULTI</h4>
<p><img src="Modules_files/hybridMulti_005.png" class="img-responsive"></p>
<h4 id="fractaltypemulti">FractalType.MULTI</h4>
<p><img src="Modules_files/multi_005.png" class="img-responsive"></p>
<h4 id="fractaltyperidgemulti">FractalType.RIDGEMULTI</h4>
<p><img src="Modules_files/ridgeMulti_004.png" class="img-responsive"></p>
<h3 id="example-code-2">Example Code</h3>
<p>Here is a snippet from the example:</p>
<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="o">...</span>
<span class="nd">@Override</span>
<span class="kd">protected</span> <span class="kt">void</span> <span class="nf">run</span><span class="o">(</span><span class="n">SplitCanvas</span> <span class="n">canvas</span><span class="o">)</span> <span class="o">{</span>
<span class="n">BasisType</span> <span class="n">basisType</span> <span class="o">=</span> <span class="n">BasisType</span><span class="o">.</span><span class="na">SIMPLEX</span><span class="o">;</span>
<span class="n">FractalType</span> <span class="n">fractalType</span> <span class="o">=</span> <span class="n">FractalType</span><span class="o">.</span><span class="na">HYBRIDMULTI</span><span class="o">;</span>
<span class="n">canvas</span><span class="o">.</span><span class="na">updateImage</span><span class="o">(</span>
<span class="s">"none"</span><span class="o">,</span> <span class="n">getModule</span><span class="o">(</span><span class="n">basisType</span><span class="o">,</span> <span class="n">InterpolationType</span><span class="o">.</span><span class="na">NONE</span><span class="o">,</span> <span class="n">fractalType</span><span class="o">),</span>
<span class="s">"linear"</span><span class="o">,</span> <span class="n">getModule</span><span class="o">(</span><span class="n">basisType</span><span class="o">,</span> <span class="n">InterpolationType</span><span class="o">.</span><span class="na">LINEAR</span><span class="o">,</span> <span class="n">fractalType</span><span class="o">),</span>
<span class="s">"cubic"</span><span class="o">,</span> <span class="n">getModule</span><span class="o">(</span><span class="n">basisType</span><span class="o">,</span> <span class="n">InterpolationType</span><span class="o">.</span><span class="na">CUBIC</span><span class="o">,</span> <span class="n">fractalType</span><span class="o">),</span>
<span class="s">"quintic"</span><span class="o">,</span> <span class="n">getModule</span><span class="o">(</span><span class="n">basisType</span><span class="o">,</span> <span class="n">InterpolationType</span><span class="o">.</span><span class="na">QUINTIC</span><span class="o">,</span> <span class="n">fractalType</span><span class="o">)</span>
<span class="o">);</span>
<span class="o">}</span>
<span class="kd">private</span> <span class="n">ModuleAutoCorrect</span> <span class="nf">getModule</span><span class="o">(</span>
<span class="n">BasisType</span> <span class="n">basisType</span><span class="o">,</span>
<span class="n">InterpolationType</span> <span class="n">interpolationType</span><span class="o">,</span>
<span class="n">FractalType</span> <span class="n">fractalType</span>
<span class="o">)</span> <span class="o">{</span>
<span class="n">ModuleFractal</span> <span class="n">gen</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ModuleFractal</span><span class="o">();</span>
<span class="n">gen</span><span class="o">.</span><span class="na">setAllSourceBasisTypes</span><span class="o">(</span><span class="n">basisType</span><span class="o">);</span>
<span class="n">gen</span><span class="o">.</span><span class="na">setAllSourceInterpolationTypes</span><span class="o">(</span><span class="n">interpolationType</span><span class="o">);</span>
<span class="n">gen</span><span class="o">.</span><span class="na">setNumOctaves</span><span class="o">(</span><span class="mi">5</span><span class="o">);</span>
<span class="n">gen</span><span class="o">.</span><span class="na">setFrequency</span><span class="o">(</span><span class="mf">2.34</span><span class="o">);</span>
<span class="n">gen</span><span class="o">.</span><span class="na">setType</span><span class="o">(</span><span class="n">fractalType</span><span class="o">);</span>
<span class="n">gen</span><span class="o">.</span><span class="na">setSeed</span><span class="o">(</span><span class="mi">42</span><span class="o">);</span>
<span class="cm">/**
* We auto-correct into the range [0, 1], performing 10,000 samples
* to calculate the auto-correct values.
*/</span>
<span class="n">ModuleAutoCorrect</span> <span class="n">source</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ModuleAutoCorrect</span><span class="o">(</span><span class="mi">0</span><span class="o">,</span> <span class="mi">1</span><span class="o">);</span>
<span class="n">source</span><span class="o">.</span><span class="na">setSource</span><span class="o">(</span><span class="n">gen</span><span class="o">);</span>
<span class="n">source</span><span class="o">.</span><span class="na">setSamples</span><span class="o">(</span><span class="mi">10000</span><span class="o">);</span>
<span class="n">source</span><span class="o">.</span><span class="na">calculate2D</span><span class="o">();</span>
<span class="k">return</span> <span class="n">source</span><span class="o">;</span>
<span class="o">}</span>
<span class="o">...</span>
</code></pre></div></div>
<h2 id="modulegradient">ModuleGradient</h2>
<p><img src="Modules_files/gradient.png" class="img-responsive"></p>
<p>The <code class="highlighter-rouge">ModuleGradient</code> generates a linear gradient with output values ranging from 0 to 1.</p>
<h3 id="example-code-3">Example Code</h3>
<p>Here is a snippet from the example:</p>
<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="o">...</span>
<span class="nd">@Override</span>
<span class="kd">protected</span> <span class="kt">void</span> <span class="nf">run</span><span class="o">(</span><span class="n">SplitCanvas</span> <span class="n">canvas</span><span class="o">)</span> <span class="o">{</span>
<span class="n">canvas</span><span class="o">.</span><span class="na">updateImage</span><span class="o">(</span>
<span class="s">"(0, 0) -&gt; (0, 1)"</span><span class="o">,</span> <span class="n">getModule</span><span class="o">(</span><span class="mi">0</span><span class="o">,</span> <span class="mi">0</span><span class="o">,</span> <span class="mi">0</span><span class="o">,</span> <span class="mi">1</span><span class="o">),</span>
<span class="s">"(0.5, 0) -&gt; (1, 1)"</span><span class="o">,</span> <span class="n">getModule</span><span class="o">(</span><span class="mf">0.5</span><span class="o">,</span> <span class="mi">1</span><span class="o">,</span> <span class="mi">0</span><span class="o">,</span> <span class="mi">1</span><span class="o">)</span>
<span class="o">);</span>
<span class="o">}</span>
<span class="kd">private</span> <span class="n">ModuleGradient</span> <span class="nf">getModule</span><span class="o">(</span><span class="kt">double</span> <span class="n">x1</span><span class="o">,</span> <span class="kt">double</span> <span class="n">x2</span><span class="o">,</span> <span class="kt">double</span> <span class="n">y1</span><span class="o">,</span> <span class="kt">double</span> <span class="n">y2</span><span class="o">)</span> <span class="o">{</span>
<span class="n">ModuleGradient</span> <span class="n">moduleGradient</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ModuleGradient</span><span class="o">();</span>
<span class="n">moduleGradient</span><span class="o">.</span><span class="na">setGradient</span><span class="o">(</span><span class="n">x1</span><span class="o">,</span> <span class="n">x2</span><span class="o">,</span> <span class="n">y1</span><span class="o">,</span> <span class="n">y2</span><span class="o">);</span>
<span class="k">return</span> <span class="n">moduleGradient</span><span class="o">;</span>
<span class="o">}</span>
<span class="o">...</span>
</code></pre></div></div>
<h2 id="modulesphere">ModuleSphere</h2>
<p><img src="Modules_files/sphere.png" class="img-responsive"></p>
<p>The <code class="highlighter-rouge">ModuleSphere</code> generates a spherical gradient with output values ranging from 0 to 1.</p>
<h3 id="example-code-4">Example Code</h3>
<p>Here is a snippet from the example:</p>
<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="o">...</span>
<span class="nd">@Override</span>
<span class="kd">protected</span> <span class="kt">void</span> <span class="nf">run</span><span class="o">(</span><span class="n">SplitCanvas</span> <span class="n">canvas</span><span class="o">)</span> <span class="o">{</span>
<span class="n">ModuleSphere</span> <span class="n">moduleSphere</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ModuleSphere</span><span class="o">();</span>
<span class="n">moduleSphere</span><span class="o">.</span><span class="na">setCenterX</span><span class="o">(</span><span class="mf">0.5</span><span class="o">);</span>
<span class="n">moduleSphere</span><span class="o">.</span><span class="na">setCenterY</span><span class="o">(</span><span class="mf">0.5</span><span class="o">);</span>
<span class="n">moduleSphere</span><span class="o">.</span><span class="na">setRadius</span><span class="o">(</span><span class="mf">0.5</span><span class="o">);</span>
<span class="n">canvas</span><span class="o">.</span><span class="na">updateImage</span><span class="o">(</span>
<span class="s">"source"</span><span class="o">,</span> <span class="n">moduleSphere</span>
<span class="o">);</span>
<span class="o">}</span>
<span class="o">...</span>
</code></pre></div></div>
<h2 id="simple-manipulators">Simple Manipulators</h2>
<p>Simple manipulators are modules that take a single source and perform
a fairly simple mathematical function on the sampled values.</p>
<h3 id="moduleabs">ModuleAbs</h3>
<p><img src="Modules_files/abs.png" class="img-responsive"></p>
<p>The absolute value module returns the absolute value of the sampled value.</p>
<p>Negative values are displayed in red for clarity.</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>y = |x|
</code></pre></div></div>
<h4 id="example-code-5">Example Code</h4>
<p>Here is a snippet from the example:</p>
<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="o">...</span>
<span class="nd">@Override</span>
<span class="kd">protected</span> <span class="kt">void</span> <span class="nf">run</span><span class="o">(</span><span class="n">SplitCanvas</span> <span class="n">canvas</span><span class="o">)</span> <span class="o">{</span>
<span class="n">ModuleFractal</span> <span class="n">gen</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ModuleFractal</span><span class="o">();</span>
<span class="n">gen</span><span class="o">.</span><span class="na">setAllSourceBasisTypes</span><span class="o">(</span><span class="n">ModuleBasisFunction</span><span class="o">.</span><span class="na">BasisType</span><span class="o">.</span><span class="na">SIMPLEX</span><span class="o">);</span>
<span class="n">gen</span><span class="o">.</span><span class="na">setAllSourceInterpolationTypes</span><span class="o">(</span><span class="n">ModuleBasisFunction</span><span class="o">.</span><span class="na">InterpolationType</span><span class="o">.</span><span class="na">CUBIC</span><span class="o">);</span>
<span class="n">gen</span><span class="o">.</span><span class="na">setNumOctaves</span><span class="o">(</span><span class="mi">5</span><span class="o">);</span>
<span class="n">gen</span><span class="o">.</span><span class="na">setFrequency</span><span class="o">(</span><span class="mf">2.34</span><span class="o">);</span>
<span class="n">gen</span><span class="o">.</span><span class="na">setType</span><span class="o">(</span><span class="n">ModuleFractal</span><span class="o">.</span><span class="na">FractalType</span><span class="o">.</span><span class="na">RIDGEMULTI</span><span class="o">);</span>
<span class="n">gen</span><span class="o">.</span><span class="na">setSeed</span><span class="o">(</span><span class="mi">42</span><span class="o">);</span>
<span class="cm">/**
* We auto-correct into the range [-1, 1] to ensure we have some negative values
* for the abs module.
*/</span>
<span class="n">ModuleAutoCorrect</span> <span class="n">source</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ModuleAutoCorrect</span><span class="o">(-</span><span class="mi">1</span><span class="o">,</span> <span class="mi">1</span><span class="o">);</span>
<span class="n">source</span><span class="o">.</span><span class="na">setSource</span><span class="o">(</span><span class="n">gen</span><span class="o">);</span>
<span class="n">source</span><span class="o">.</span><span class="na">setSamples</span><span class="o">(</span><span class="mi">10000</span><span class="o">);</span>
<span class="n">source</span><span class="o">.</span><span class="na">calculate</span><span class="o">();</span>
<span class="cm">/**
* Performs the absolute value function on the noise.
*/</span>
<span class="n">ModuleAbs</span> <span class="n">moduleAbs</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ModuleAbs</span><span class="o">();</span>
<span class="n">moduleAbs</span><span class="o">.</span><span class="na">setSource</span><span class="o">(</span><span class="n">source</span><span class="o">);</span>
<span class="n">canvas</span><span class="o">.</span><span class="na">updateImage</span><span class="o">(</span>
<span class="s">"source"</span><span class="o">,</span> <span class="n">source</span><span class="o">,</span>
<span class="s">"moduleAbs"</span><span class="o">,</span> <span class="n">moduleAbs</span>
<span class="o">);</span>
<span class="o">}</span>
<span class="o">...</span>
</code></pre></div></div>
<h3 id="moduleclamp">ModuleClamp</h3>
<p><img src="Modules_files/clamp.png" class="img-responsive"></p>
<p>The clamp module restricts the sampled value to the range <code class="highlighter-rouge">[lo,hi]</code>.</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>y = min(hi, max(lo, x))
</code></pre></div></div>
<h4 id="example-code-6">Example Code</h4>
<p>Here is a snippet from the example:</p>
<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="o">...</span>
<span class="nd">@Override</span>
<span class="kd">protected</span> <span class="kt">void</span> <span class="nf">run</span><span class="o">(</span><span class="n">SplitCanvas</span> <span class="n">canvas</span><span class="o">)</span> <span class="o">{</span>
<span class="n">ModuleFractal</span> <span class="n">gen</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ModuleFractal</span><span class="o">();</span>
<span class="n">gen</span><span class="o">.</span><span class="na">setAllSourceBasisTypes</span><span class="o">(</span><span class="n">ModuleBasisFunction</span><span class="o">.</span><span class="na">BasisType</span><span class="o">.</span><span class="na">SIMPLEX</span><span class="o">);</span>
<span class="n">gen</span><span class="o">.</span><span class="na">setAllSourceInterpolationTypes</span><span class="o">(</span><span class="n">ModuleBasisFunction</span><span class="o">.</span><span class="na">InterpolationType</span><span class="o">.</span><span class="na">CUBIC</span><span class="o">);</span>
<span class="n">gen</span><span class="o">.</span><span class="na">setNumOctaves</span><span class="o">(</span><span class="mi">5</span><span class="o">);</span>
<span class="n">gen</span><span class="o">.</span><span class="na">setFrequency</span><span class="o">(</span><span class="mf">2.34</span><span class="o">);</span>
<span class="n">gen</span><span class="o">.</span><span class="na">setType</span><span class="o">(</span><span class="n">ModuleFractal</span><span class="o">.</span><span class="na">FractalType</span><span class="o">.</span><span class="na">RIDGEMULTI</span><span class="o">);</span>
<span class="n">gen</span><span class="o">.</span><span class="na">setSeed</span><span class="o">(</span><span class="mi">42</span><span class="o">);</span>
<span class="cm">/**
* We auto-correct into the range [0, 1], performing 10,000 samples to
* calculate the auto-correct values.
*/</span>
<span class="n">ModuleAutoCorrect</span> <span class="n">source</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ModuleAutoCorrect</span><span class="o">(</span><span class="mi">0</span><span class="o">,</span> <span class="mi">1</span><span class="o">);</span>
<span class="n">source</span><span class="o">.</span><span class="na">setSource</span><span class="o">(</span><span class="n">gen</span><span class="o">);</span>
<span class="n">source</span><span class="o">.</span><span class="na">setSamples</span><span class="o">(</span><span class="mi">10000</span><span class="o">);</span>
<span class="n">source</span><span class="o">.</span><span class="na">calculate</span><span class="o">();</span>
<span class="n">ModuleClamp</span> <span class="n">moduleClamp</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ModuleClamp</span><span class="o">();</span>
<span class="n">moduleClamp</span><span class="o">.</span><span class="na">setSource</span><span class="o">(</span><span class="n">source</span><span class="o">);</span>
<span class="n">moduleClamp</span><span class="o">.</span><span class="na">setLow</span><span class="o">(</span><span class="mf">0.25</span><span class="o">);</span>
<span class="n">moduleClamp</span><span class="o">.</span><span class="na">setHigh</span><span class="o">(</span><span class="mf">0.5</span><span class="o">);</span>
<span class="n">canvas</span><span class="o">.</span><span class="na">updateImage</span><span class="o">(</span>
<span class="s">"source"</span><span class="o">,</span> <span class="n">source</span><span class="o">,</span>
<span class="s">"moduleClamp"</span><span class="o">,</span> <span class="n">moduleClamp</span>
<span class="o">);</span>
<span class="o">}</span>
<span class="o">...</span>
</code></pre></div></div>
<h3 id="modulecos">ModuleCos</h3>
<p><img src="Modules_files/cos.png" class="img-responsive"></p>
<p>The cosine module passes the sampled value through a cosine function.</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>y = cos(x)
</code></pre></div></div>
<h4 id="example-code-7">Example Code</h4>
<p>Here is a snippet from the example:</p>
<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="o">...</span>
<span class="nd">@Override</span>
<span class="kd">protected</span> <span class="kt">void</span> <span class="nf">run</span><span class="o">(</span><span class="n">SplitCanvas</span> <span class="n">canvas</span><span class="o">)</span> <span class="o">{</span>
<span class="n">ModuleFractal</span> <span class="n">gen</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ModuleFractal</span><span class="o">();</span>
<span class="n">gen</span><span class="o">.</span><span class="na">setAllSourceBasisTypes</span><span class="o">(</span><span class="n">ModuleBasisFunction</span><span class="o">.</span><span class="na">BasisType</span><span class="o">.</span><span class="na">SIMPLEX</span><span class="o">);</span>
<span class="n">gen</span><span class="o">.</span><span class="na">setAllSourceInterpolationTypes</span><span class="o">(</span><span class="n">ModuleBasisFunction</span><span class="o">.</span><span class="na">InterpolationType</span><span class="o">.</span><span class="na">CUBIC</span><span class="o">);</span>
<span class="n">gen</span><span class="o">.</span><span class="na">setNumOctaves</span><span class="o">(</span><span class="mi">5</span><span class="o">);</span>
<span class="n">gen</span><span class="o">.</span><span class="na">setFrequency</span><span class="o">(</span><span class="mf">2.34</span><span class="o">);</span>
<span class="n">gen</span><span class="o">.</span><span class="na">setType</span><span class="o">(</span><span class="n">ModuleFractal</span><span class="o">.</span><span class="na">FractalType</span><span class="o">.</span><span class="na">RIDGEMULTI</span><span class="o">);</span>
<span class="n">gen</span><span class="o">.</span><span class="na">setSeed</span><span class="o">(</span><span class="mi">42</span><span class="o">);</span>
<span class="cm">/**
* We auto-correct into the range [0, 1], performing 10,000 samples to
* calculate the auto-correct values.
*/</span>
<span class="n">ModuleAutoCorrect</span> <span class="n">source</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ModuleAutoCorrect</span><span class="o">(</span><span class="mi">0</span><span class="o">,</span> <span class="mi">1</span><span class="o">);</span>
<span class="n">source</span><span class="o">.</span><span class="na">setSource</span><span class="o">(</span><span class="n">gen</span><span class="o">);</span>
<span class="n">source</span><span class="o">.</span><span class="na">setSamples</span><span class="o">(</span><span class="mi">10000</span><span class="o">);</span>
<span class="n">source</span><span class="o">.</span><span class="na">calculate</span><span class="o">();</span>
<span class="n">ModuleCos</span> <span class="n">moduleCos</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ModuleCos</span><span class="o">();</span>
<span class="n">moduleCos</span><span class="o">.</span><span class="na">setSource</span><span class="o">(</span><span class="n">source</span><span class="o">);</span>
<span class="n">canvas</span><span class="o">.</span><span class="na">updateImage</span><span class="o">(</span>
<span class="s">"source"</span><span class="o">,</span> <span class="n">source</span><span class="o">,</span>
<span class="s">"moduleCos"</span><span class="o">,</span> <span class="n">moduleCos</span>
<span class="o">);</span>
<span class="o">}</span>
<span class="o">...</span>
</code></pre></div></div>
<h3 id="modulefloor">ModuleFloor</h3>
<p><img src="Modules_files/floor.png" class="img-responsive"></p>
<p>This module returns the largest integer value equal to or smaller than the value sampled.</p>
<p>In this example, the original source is multiplied by 8, <code class="highlighter-rouge">y = 8x</code>, before applying the floor function. The final output is auto-corrected back into the range [0,1].</p>
<p>Values above 1 are displayed in blue for clarity.</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>y = floor(x)
</code></pre></div></div>
<h4 id="example-code-8">Example Code</h4>
<p>Here is a snippet from the example:</p>
<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="o">...</span>
<span class="nd">@Override</span>
<span class="kd">protected</span> <span class="kt">void</span> <span class="nf">run</span><span class="o">(</span><span class="n">SplitCanvas</span> <span class="n">canvas</span><span class="o">)</span> <span class="o">{</span>
<span class="n">ModuleFractal</span> <span class="n">gen</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ModuleFractal</span><span class="o">();</span>
<span class="n">gen</span><span class="o">.</span><span class="na">setAllSourceBasisTypes</span><span class="o">(</span><span class="n">ModuleBasisFunction</span><span class="o">.</span><span class="na">BasisType</span><span class="o">.</span><span class="na">SIMPLEX</span><span class="o">);</span>
<span class="n">gen</span><span class="o">.</span><span class="na">setAllSourceInterpolationTypes</span><span class="o">(</span><span class="n">ModuleBasisFunction</span><span class="o">.</span><span class="na">InterpolationType</span><span class="o">.</span><span class="na">CUBIC</span><span class="o">);</span>
<span class="n">gen</span><span class="o">.</span><span class="na">setNumOctaves</span><span class="o">(</span><span class="mi">5</span><span class="o">);</span>
<span class="n">gen</span><span class="o">.</span><span class="na">setFrequency</span><span class="o">(</span><span class="mf">2.34</span><span class="o">);</span>
<span class="n">gen</span><span class="o">.</span><span class="na">setType</span><span class="o">(</span><span class="n">ModuleFractal</span><span class="o">.</span><span class="na">FractalType</span><span class="o">.</span><span class="na">RIDGEMULTI</span><span class="o">);</span>
<span class="n">gen</span><span class="o">.</span><span class="na">setSeed</span><span class="o">(</span><span class="mi">42</span><span class="o">);</span>
<span class="cm">/**
* We auto-correct into the range [0, 1], performing 10,000 samples to
* calculate the auto-correct values.
*/</span>
<span class="n">ModuleAutoCorrect</span> <span class="n">moduleAutoCorrect</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ModuleAutoCorrect</span><span class="o">(</span><span class="mi">0</span><span class="o">,</span> <span class="mi">1</span><span class="o">);</span>
<span class="n">moduleAutoCorrect</span><span class="o">.</span><span class="na">setSource</span><span class="o">(</span><span class="n">gen</span><span class="o">);</span>
<span class="n">moduleAutoCorrect</span><span class="o">.</span><span class="na">setSamples</span><span class="o">(</span><span class="mi">10000</span><span class="o">);</span>
<span class="n">moduleAutoCorrect</span><span class="o">.</span><span class="na">calculate</span><span class="o">();</span>
<span class="cm">/**
* Since ModuleFloor returns the largest integer value smaller than the value sampled,
* we need to use the ModuleCombiner to multiply the sampled values by a number in
* order to have a larger range that contains more possible integer values.
*/</span>
<span class="n">ModuleCombiner</span> <span class="n">source</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ModuleCombiner</span><span class="o">();</span>
<span class="n">source</span><span class="o">.</span><span class="na">setType</span><span class="o">(</span><span class="n">ModuleCombiner</span><span class="o">.</span><span class="na">CombinerType</span><span class="o">.</span><span class="na">MULT</span><span class="o">);</span>
<span class="n">source</span><span class="o">.</span><span class="na">setSource</span><span class="o">(</span><span class="mi">0</span><span class="o">,</span> <span class="n">moduleAutoCorrect</span><span class="o">);</span>
<span class="n">source</span><span class="o">.</span><span class="na">setSource</span><span class="o">(</span><span class="mi">1</span><span class="o">,</span> <span class="mf">8.0</span><span class="o">);</span>
<span class="n">ModuleFloor</span> <span class="n">moduleFloor</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ModuleFloor</span><span class="o">();</span>
<span class="n">moduleFloor</span><span class="o">.</span><span class="na">setSource</span><span class="o">(</span><span class="n">source</span><span class="o">);</span>
<span class="cm">/**
* We auto-correct from the range [0, 8] back into the range of [0, 1] to be
* able to visualize the results.
*/</span>
<span class="n">ModuleAutoCorrect</span> <span class="n">moduleFloorAutoCorrect</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ModuleAutoCorrect</span><span class="o">();</span>
<span class="n">moduleFloorAutoCorrect</span><span class="o">.</span><span class="na">setSource</span><span class="o">(</span><span class="n">moduleFloor</span><span class="o">);</span>
<span class="n">moduleFloorAutoCorrect</span><span class="o">.</span><span class="na">setSamples</span><span class="o">(</span><span class="mi">10000</span><span class="o">);</span>
<span class="n">moduleFloorAutoCorrect</span><span class="o">.</span><span class="na">calculate</span><span class="o">();</span>
<span class="n">canvas</span><span class="o">.</span><span class="na">updateImage</span><span class="o">(</span>
<span class="s">"original source"</span><span class="o">,</span> <span class="n">moduleAutoCorrect</span><span class="o">,</span>
<span class="s">"source (x8)"</span><span class="o">,</span> <span class="n">source</span><span class="o">,</span>
<span class="s">"moduleFloor (auto-corrected)"</span><span class="o">,</span> <span class="n">moduleFloorAutoCorrect</span>
<span class="o">);</span>
<span class="o">}</span>
<span class="o">...</span>
</code></pre></div></div>
<h3 id="moduleinvert">ModuleInvert</h3>
<p><img src="Modules_files/invert.png" class="img-responsive"></p>
<p>The invert module changes positive values to negative and negative values to positive.</p>
<p>Negative values are displayed in red for clarity.</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>y = -x
</code></pre></div></div>
<h4 id="example-code-9">Example Code</h4>
<p>Here is a snippet from the example:</p>
<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="o">...</span>
<span class="nd">@Override</span>
<span class="kd">protected</span> <span class="kt">void</span> <span class="nf">run</span><span class="o">(</span><span class="n">SplitCanvas</span> <span class="n">canvas</span><span class="o">)</span> <span class="o">{</span>
<span class="n">ModuleFractal</span> <span class="n">gen</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ModuleFractal</span><span class="o">();</span>
<span class="n">gen</span><span class="o">.</span><span class="na">setAllSourceBasisTypes</span><span class="o">(</span><span class="n">ModuleBasisFunction</span><span class="o">.</span><span class="na">BasisType</span><span class="o">.</span><span class="na">SIMPLEX</span><span class="o">);</span>
<span class="n">gen</span><span class="o">.</span><span class="na">setAllSourceInterpolationTypes</span><span class="o">(</span><span class="n">ModuleBasisFunction</span><span class="o">.</span><span class="na">InterpolationType</span><span class="o">.</span><span class="na">CUBIC</span><span class="o">);</span>
<span class="n">gen</span><span class="o">.</span><span class="na">setNumOctaves</span><span class="o">(</span><span class="mi">5</span><span class="o">);</span>
<span class="n">gen</span><span class="o">.</span><span class="na">setFrequency</span><span class="o">(</span><span class="mf">2.34</span><span class="o">);</span>
<span class="n">gen</span><span class="o">.</span><span class="na">setType</span><span class="o">(</span><span class="n">ModuleFractal</span><span class="o">.</span><span class="na">FractalType</span><span class="o">.</span><span class="na">RIDGEMULTI</span><span class="o">);</span>
<span class="n">gen</span><span class="o">.</span><span class="na">setSeed</span><span class="o">(</span><span class="mi">42</span><span class="o">);</span>
<span class="cm">/**
* We auto-correct into the range [0, 1], performing 10,000 samples to
* calculate the auto-correct values.
*/</span>
<span class="n">ModuleAutoCorrect</span> <span class="n">moduleAutoCorrect</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ModuleAutoCorrect</span><span class="o">(</span><span class="mi">0</span><span class="o">,</span> <span class="mi">1</span><span class="o">);</span>
<span class="n">moduleAutoCorrect</span><span class="o">.</span><span class="na">setSource</span><span class="o">(</span><span class="n">gen</span><span class="o">);</span>
<span class="n">moduleAutoCorrect</span><span class="o">.</span><span class="na">setSamples</span><span class="o">(</span><span class="mi">10000</span><span class="o">);</span>
<span class="n">moduleAutoCorrect</span><span class="o">.</span><span class="na">calculate</span><span class="o">();</span>
<span class="cm">/**
* Inverting brings the range from [0, 1] into [-1, 0]
*/</span>
<span class="n">ModuleInvert</span> <span class="n">moduleInvert</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ModuleInvert</span><span class="o">();</span>
<span class="n">moduleInvert</span><span class="o">.</span><span class="na">setSource</span><span class="o">(</span><span class="n">moduleAutoCorrect</span><span class="o">);</span>
<span class="cm">/**
* Add 1.0 to bring the range from [-1, 0] back to [0, 1]
*/</span>
<span class="n">ModuleCombiner</span> <span class="n">moduleCombiner</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ModuleCombiner</span><span class="o">();</span>
<span class="n">moduleCombiner</span><span class="o">.</span><span class="na">setSource</span><span class="o">(</span><span class="mi">0</span><span class="o">,</span> <span class="n">moduleInvert</span><span class="o">);</span>
<span class="n">moduleCombiner</span><span class="o">.</span><span class="na">setSource</span><span class="o">(</span><span class="mi">1</span><span class="o">,</span> <span class="mf">1.0</span><span class="o">);</span>
<span class="n">moduleCombiner</span><span class="o">.</span><span class="na">setType</span><span class="o">(</span><span class="n">ModuleCombiner</span><span class="o">.</span><span class="na">CombinerType</span><span class="o">.</span><span class="na">ADD</span><span class="o">);</span>
<span class="n">canvas</span><span class="o">.</span><span class="na">updateImage</span><span class="o">(</span>
<span class="s">"source"</span><span class="o">,</span> <span class="n">moduleAutoCorrect</span><span class="o">,</span>
<span class="s">"invert"</span><span class="o">,</span> <span class="n">moduleInvert</span><span class="o">,</span>
<span class="s">"corrected invert"</span><span class="o">,</span> <span class="n">moduleCombiner</span>
<span class="o">);</span>
<span class="o">}</span>
<span class="o">...</span>
</code></pre></div></div>
<h3 id="modulepow">ModulePow</h3>
<p><img src="Modules_files/pow.png" class="img-responsive"></p>
<p>The pow module raises the sampled value to the power given.</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>y = x^pow
</code></pre></div></div>
<h4 id="example-code-10">Example Code</h4>
<p>Here is a snippet from the example:</p>
<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="o">...</span>
<span class="nd">@Override</span>
<span class="kd">protected</span> <span class="kt">void</span> <span class="nf">run</span><span class="o">(</span><span class="n">SplitCanvas</span> <span class="n">canvas</span><span class="o">)</span> <span class="o">{</span>
<span class="n">ModuleFractal</span> <span class="n">source</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ModuleFractal</span><span class="o">();</span>
<span class="n">source</span><span class="o">.</span><span class="na">setAllSourceBasisTypes</span><span class="o">(</span><span class="n">ModuleBasisFunction</span><span class="o">.</span><span class="na">BasisType</span><span class="o">.</span><span class="na">SIMPLEX</span><span class="o">);</span>
<span class="n">source</span><span class="o">.</span><span class="na">setAllSourceInterpolationTypes</span><span class="o">(</span><span class="n">ModuleBasisFunction</span><span class="o">.</span><span class="na">InterpolationType</span><span class="o">.</span><span class="na">CUBIC</span><span class="o">);</span>
<span class="n">source</span><span class="o">.</span><span class="na">setNumOctaves</span><span class="o">(</span><span class="mi">5</span><span class="o">);</span>
<span class="n">source</span><span class="o">.</span><span class="na">setFrequency</span><span class="o">(</span><span class="mf">2.34</span><span class="o">);</span>
<span class="n">source</span><span class="o">.</span><span class="na">setType</span><span class="o">(</span><span class="n">ModuleFractal</span><span class="o">.</span><span class="na">FractalType</span><span class="o">.</span><span class="na">RIDGEMULTI</span><span class="o">);</span>
<span class="n">source</span><span class="o">.</span><span class="na">setSeed</span><span class="o">(</span><span class="mi">42</span><span class="o">);</span>
<span class="cm">/**
* We auto-correct into the range [0, 1], performing 10,000 samples to
* calculate the auto-correct values.
*/</span>
<span class="n">ModuleAutoCorrect</span> <span class="n">moduleAutoCorrect</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ModuleAutoCorrect</span><span class="o">(</span><span class="mi">0</span><span class="o">,</span> <span class="mi">1</span><span class="o">);</span>
<span class="n">moduleAutoCorrect</span><span class="o">.</span><span class="na">setSource</span><span class="o">(</span><span class="n">source</span><span class="o">);</span>
<span class="n">moduleAutoCorrect</span><span class="o">.</span><span class="na">setSamples</span><span class="o">(</span><span class="mi">10000</span><span class="o">);</span>
<span class="n">moduleAutoCorrect</span><span class="o">.</span><span class="na">calculate</span><span class="o">();</span>
<span class="n">ModulePow</span> <span class="n">modulePow</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ModulePow</span><span class="o">();</span>
<span class="n">modulePow</span><span class="o">.</span><span class="na">setSource</span><span class="o">(</span><span class="n">moduleAutoCorrect</span><span class="o">);</span>
<span class="n">modulePow</span><span class="o">.</span><span class="na">setPower</span><span class="o">(</span><span class="mf">2.0</span><span class="o">);</span>
<span class="n">canvas</span><span class="o">.</span><span class="na">updateImage</span><span class="o">(</span>
<span class="s">"source"</span><span class="o">,</span> <span class="n">moduleAutoCorrect</span><span class="o">,</span>
<span class="s">"pow"</span><span class="o">,</span> <span class="n">modulePow</span>
<span class="o">);</span>
<span class="o">}</span>
<span class="o">...</span>
</code></pre></div></div>
<h3 id="modulesin">ModuleSin</h3>
<p><img src="Modules_files/sin.png" class="img-responsive"></p>
<p>The sine module passes the sampled value through a sine function.</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>y = sin(x)
</code></pre></div></div>
<h4 id="example-code-11">Example Code</h4>
<p>Here is a snippet from the example:</p>
<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="o">...</span>
<span class="nd">@Override</span>
<span class="kd">protected</span> <span class="kt">void</span> <span class="nf">run</span><span class="o">(</span><span class="n">SplitCanvas</span> <span class="n">canvas</span><span class="o">)</span> <span class="o">{</span>
<span class="n">ModuleFractal</span> <span class="n">source</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ModuleFractal</span><span class="o">();</span>
<span class="n">source</span><span class="o">.</span><span class="na">setAllSourceBasisTypes</span><span class="o">(</span><span class="n">ModuleBasisFunction</span><span class="o">.</span><span class="na">BasisType</span><span class="o">.</span><span class="na">SIMPLEX</span><span class="o">);</span>
<span class="n">source</span><span class="o">.</span><span class="na">setAllSourceInterpolationTypes</span><span class="o">(</span><span class="n">ModuleBasisFunction</span><span class="o">.</span><span class="na">InterpolationType</span><span class="o">.</span><span class="na">CUBIC</span><span class="o">);</span>
<span class="n">source</span><span class="o">.</span><span class="na">setNumOctaves</span><span class="o">(</span><span class="mi">5</span><span class="o">);</span>
<span class="n">source</span><span class="o">.</span><span class="na">setFrequency</span><span class="o">(</span><span class="mf">2.34</span><span class="o">);</span>
<span class="n">source</span><span class="o">.</span><span class="na">setType</span><span class="o">(</span><span class="n">ModuleFractal</span><span class="o">.</span><span class="na">FractalType</span><span class="o">.</span><span class="na">RIDGEMULTI</span><span class="o">);</span>
<span class="n">source</span><span class="o">.</span><span class="na">setSeed</span><span class="o">(</span><span class="mi">42</span><span class="o">);</span>
<span class="cm">/**
* We auto-correct into the range [0, 1], performing 10,000 samples to
* calculate the auto-correct values.
*/</span>
<span class="n">ModuleAutoCorrect</span> <span class="n">moduleAutoCorrect</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ModuleAutoCorrect</span><span class="o">(</span><span class="mi">0</span><span class="o">,</span> <span class="mi">1</span><span class="o">);</span>
<span class="n">moduleAutoCorrect</span><span class="o">.</span><span class="na">setSource</span><span class="o">(</span><span class="n">source</span><span class="o">);</span>
<span class="n">moduleAutoCorrect</span><span class="o">.</span><span class="na">setSamples</span><span class="o">(</span><span class="mi">10000</span><span class="o">);</span>
<span class="n">moduleAutoCorrect</span><span class="o">.</span><span class="na">calculate</span><span class="o">();</span>
<span class="n">ModuleSin</span> <span class="n">moduleSin</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ModuleSin</span><span class="o">();</span>
<span class="n">moduleSin</span><span class="o">.</span><span class="na">setSource</span><span class="o">(</span><span class="n">moduleAutoCorrect</span><span class="o">);</span>
<span class="n">canvas</span><span class="o">.</span><span class="na">updateImage</span><span class="o">(</span>
<span class="s">"source"</span><span class="o">,</span> <span class="n">moduleAutoCorrect</span><span class="o">,</span>
<span class="s">"moduleSin"</span><span class="o">,</span> <span class="n">moduleSin</span>
<span class="o">);</span>
<span class="o">}</span>
<span class="o">...</span>
</code></pre></div></div>
<h2 id="complex-manipulators">Complex Manipulators</h2>
<p>Complex manipulators are modules that take one or more sources and
perform mathematical functions on the sampled values that are more
complex than the simple manipulators.</p>
<h3 id="moduleautocorrect">ModuleAutoCorrect</h3>
<p><img src="Modules_files/autoCorrect.png" class="img-responsive"></p>
<h3 id="modulebias">ModuleBias</h3>
<p><img src="Modules_files/bias.png" class="img-responsive"></p>
<h3 id="moduleblend">ModuleBlend</h3>
<p><img src="Modules_files/blend.png" class="img-responsive"></p>
<h3 id="modulebrightcontrast">ModuleBrightContrast</h3>
<p><img src="Modules_files/brightContrast.png" class="img-responsive"></p>
<h3 id="modulecache">ModuleCache</h3>
<div class="bs-callout bs-callout-danger">
<h4>// TODO</h4>
</div>
<h3 id="modulecombiner">ModuleCombiner</h3>
<h4 id="add">Add</h4>
<p><img src="Modules_files/add.png" class="img-responsive"></p>
<h4 id="avg">Avg</h4>
<p><img src="Modules_files/avg.png" class="img-responsive"></p>
<h4 id="max">Max</h4>
<p><img src="Modules_files/max.png" class="img-responsive"></p>
<h4 id="min">Min</h4>
<p><img src="Modules_files/min.png" class="img-responsive"></p>
<h4 id="mult">Mult</h4>
<p><img src="Modules_files/mult.png" class="img-responsive"></p>
<h3 id="modulefunctiongradient">ModuleFunctionGradient</h3>
<p><img src="Modules_files/functionGradient.png" class="img-responsive"></p>
<h3 id="modulegain">ModuleGain</h3>
<p><img src="Modules_files/gain.png" class="img-responsive"></p>
<h3 id="modulemagnitude">ModuleMagnitude</h3>
<p><img src="Modules_files/magnitude.png" class="img-responsive"></p>
<h3 id="modulenormalizedcoords">ModuleNormalizedCoords</h3>
<p><img src="Modules_files/normalizedCoords.png" class="img-responsive"></p>
<h3 id="modulerotatedomain">ModuleRotateDomain</h3>
<p><img src="Modules_files/rotateDomain.png" class="img-responsive"></p>
<h3 id="modulesawtooth">ModuleSawtooth</h3>
<p><img src="Modules_files/sawtooth.png" class="img-responsive"></p>
<h3 id="modulescaledomain">ModuleScaleDomain</h3>
<p><img src="Modules_files/scaleDomain.png" class="img-responsive"></p>
<h3 id="modulescaleoffset">ModuleScaleOffset</h3>
<p><img src="Modules_files/scaleOffset.png" class="img-responsive"></p>
<h3 id="moduleselect">ModuleSelect</h3>
<p><img src="Modules_files/select.png" class="img-responsive"></p>
<h3 id="moduletiers">ModuleTiers</h3>
<p><img src="Modules_files/tiers.png" class="img-responsive"></p>
<h3 id="moduletranslatedomain">ModuleTranslateDomain</h3>
<p><img src="Modules_files/translateDomain.png" class="img-responsive"></p>
<h3 id="moduletriangle">ModuleTriangle</h3>
<p><img src="Modules_files/triangle.png" class="img-responsive"></p>
</article>
</div>
<div class="col-md-3">
<nav id="toc" class="hidden-print hidden-sm hidden-xs affix" data-spy="affix" data-toggle="toc" data-offset-top="128"><ul class="nav"><li class=""><a href="#modulebasisfunction">ModuleBasisFunction</a><ul class="nav"><li class=""><a href="#basistypegradient">BasisType.GRADIENT</a></li><li class=""><a href="#basistypegradval">BasisType.GRADVAL</a></li><li class=""><a href="#basistypesimplex">BasisType.SIMPLEX</a></li><li class=""><a href="#basistypevalue">BasisType.VALUE</a></li><li class=""><a href="#basistypewhite">BasisType.WHITE</a></li><li class=""><a href="#example-code">Example Code</a></li></ul></li><li class=""><a href="#modulecellgen">ModuleCellGen</a></li><li class=""><a href="#modulecellular">ModuleCellular</a><ul class="nav"><li class=""><a href="#example-code-1">Example Code</a></li></ul></li><li class="active"><a href="#modulefractal">ModuleFractal</a><ul class="nav"><li class=""><a href="#billow">Billow</a></li><li class=""><a href="#decarpentierswiss">deCarpentierSwiss</a></li><li class="active"><a href="#fbm">FBM</a></li><li><a href="#hybridmulti">HybridMulti</a></li><li><a href="#multi">Multi</a></li><li><a href="#ridgemulti">RidgeMulti</a></li><li><a href="#basistypewhite-1">BasisType.WHITE</a></li><li><a href="#example-code-2">Example Code</a></li></ul></li><li><a href="#modulegradient">ModuleGradient</a><ul class="nav"><li><a href="#example-code-3">Example Code</a></li></ul></li><li><a href="#modulesphere">ModuleSphere</a><ul class="nav"><li><a href="#example-code-4">Example Code</a></li></ul></li><li><a href="#simple-manipulators">Simple Manipulators</a><ul class="nav"><li><a href="#moduleabs">ModuleAbs</a></li><li><a href="#moduleclamp">ModuleClamp</a></li><li><a href="#modulecos">ModuleCos</a></li><li><a href="#modulefloor">ModuleFloor</a></li><li><a href="#moduleinvert">ModuleInvert</a></li><li><a href="#modulepow">ModulePow</a></li><li><a href="#modulesin">ModuleSin</a></li></ul></li><li><a href="#complex-manipulators">Complex Manipulators</a><ul class="nav"><li><a href="#moduleautocorrect">ModuleAutoCorrect</a></li><li><a href="#modulebias">ModuleBias</a></li><li><a href="#moduleblend">ModuleBlend</a></li><li><a href="#modulebrightcontrast">ModuleBrightContrast</a></li><li><a href="#modulecache">ModuleCache</a></li><li><a href="#modulecombiner">ModuleCombiner</a></li><li><a href="#modulefunctiongradient">ModuleFunctionGradient</a></li><li><a href="#modulegain">ModuleGain</a></li><li><a href="#modulemagnitude">ModuleMagnitude</a></li><li><a href="#modulenormalizedcoords">ModuleNormalizedCoords</a></li><li><a href="#modulerotatedomain">ModuleRotateDomain</a></li><li><a href="#modulesawtooth">ModuleSawtooth</a></li><li><a href="#modulescaledomain">ModuleScaleDomain</a></li><li><a href="#modulescaleoffset">ModuleScaleOffset</a></li><li><a href="#moduleselect">ModuleSelect</a></li><li><a href="#moduletiers">ModuleTiers</a></li><li><a href="#moduletranslatedomain">ModuleTranslateDomain</a></li><li><a href="#moduletriangle">ModuleTriangle</a></li></ul></li></ul></nav>
</div>
</div>
</div>
</div>
</div>
<footer class="site-footer">
<div class="wrap container-fluid">
<div class="info col-md-6 col-xs-12">
<img class="logo" src="Modules_files/logo-small.png">
<ul>
<li class="site-title">SudoPlay Games</li>
<li><a href="mailto:joise@sudoplaygames.com">joise@sudoplaygames.com</a></li>
<li>
<a href="https://github.com/sudoplaygames">
<i class="fa fa-github"></i>
</a>
<a href="https://twitter.com/sudoplaygames">
<i class="fa fa-twitter"></i>
</a>
<a href="https://joise.sudoplaygames.com/feed.xml">
<i class="fa fa-rss"></i>
</a>
</li>
</ul>
</div>
<div class="col-md-6 col-xs-12">
<p class="text">Joise is a 2D, 3D, 4D and 6D modular noise library
written in Java, derived from Joshua Tippetts' Accidental Noise
Library, and maintained by SudoPlay Games.</p>
<p class="text">Joise ©2018 Jason Taylor. Released as open-source under <a href="http://www.apache.org/licenses/LICENSE-2.0.html">Apache License, Version 2.0</a>.</p>
<p class="text">SudoPlay Games is a small, independent game studio located in Oregon, USA.</p>
<p class="text">©2018 SudoPlay Games. All rights reserved.</p>
</div>
<div class="col-md-12">
<p></p>
</div>
</div>
</footer>
<div id="cboxOverlay" style="display: none;"></div><div id="colorbox" class="" role="dialog" tabindex="-1" style="display: none;"><div id="cboxWrapper"><div><div id="cboxTopLeft" style="float: left;"></div><div id="cboxTopCenter" style="float: left;"></div><div id="cboxTopRight" style="float: left;"></div></div><div style="clear: left;"><div id="cboxMiddleLeft" style="float: left;"></div><div id="cboxContent" style="float: left;"><div id="cboxTitle" style="float: left;"></div><div id="cboxCurrent" style="float: left;"></div><button type="button" id="cboxPrevious"></button><button type="button" id="cboxNext"></button><button id="cboxSlideshow"></button><div id="cboxLoadingOverlay" style="float: left;"></div><div id="cboxLoadingGraphic" style="float: left;"></div></div><div id="cboxMiddleRight" style="float: left;"></div></div><div style="clear: left;"><div id="cboxBottomLeft" style="float: left;"></div><div id="cboxBottomCenter" style="float: left;"></div><div id="cboxBottomRight" style="float: left;"></div></div></div><div style="position: absolute; width: 9999px; visibility: hidden; display: none; max-width: none;"></div></div></body></html>