kopia lustrzana https://github.com/vilemduha/blendercam
1663 wiersze
200 KiB
HTML
1663 wiersze
200 KiB
HTML
|
|
<!DOCTYPE html>
|
|
|
|
|
|
<html lang="en" data-content_root="../../" >
|
|
|
|
<head>
|
|
<meta charset="utf-8" />
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
<title>fabex.bas_relief — Fabex 1.0.65 documentation</title>
|
|
|
|
|
|
|
|
<script data-cfasync="false">
|
|
document.documentElement.dataset.mode = localStorage.getItem("mode") || "";
|
|
document.documentElement.dataset.theme = localStorage.getItem("theme") || "";
|
|
</script>
|
|
|
|
<!-- Loaded before other Sphinx assets -->
|
|
<link href="../../_static/styles/theme.css?digest=dfe6caa3a7d634c4db9b" rel="stylesheet" />
|
|
<link href="../../_static/styles/bootstrap.css?digest=dfe6caa3a7d634c4db9b" rel="stylesheet" />
|
|
<link href="../../_static/styles/pydata-sphinx-theme.css?digest=dfe6caa3a7d634c4db9b" rel="stylesheet" />
|
|
|
|
|
|
<link href="../../_static/vendor/fontawesome/6.5.2/css/all.min.css?digest=dfe6caa3a7d634c4db9b" rel="stylesheet" />
|
|
<link rel="preload" as="font" type="font/woff2" crossorigin href="../../_static/vendor/fontawesome/6.5.2/webfonts/fa-solid-900.woff2" />
|
|
<link rel="preload" as="font" type="font/woff2" crossorigin href="../../_static/vendor/fontawesome/6.5.2/webfonts/fa-brands-400.woff2" />
|
|
<link rel="preload" as="font" type="font/woff2" crossorigin href="../../_static/vendor/fontawesome/6.5.2/webfonts/fa-regular-400.woff2" />
|
|
|
|
<link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=8f2a1f02" />
|
|
<link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-book-theme.css?v=eba8b062" />
|
|
<link rel="stylesheet" type="text/css" href="../../_static/graphviz.css?v=4ae1632d" />
|
|
|
|
<!-- Pre-loaded scripts that we'll load fully later -->
|
|
<link rel="preload" as="script" href="../../_static/scripts/bootstrap.js?digest=dfe6caa3a7d634c4db9b" />
|
|
<link rel="preload" as="script" href="../../_static/scripts/pydata-sphinx-theme.js?digest=dfe6caa3a7d634c4db9b" />
|
|
<script src="../../_static/vendor/fontawesome/6.5.2/js/all.min.js?digest=dfe6caa3a7d634c4db9b"></script>
|
|
|
|
<script src="../../_static/documentation_options.js?v=38568b08"></script>
|
|
<script src="../../_static/doctools.js?v=9bcbadda"></script>
|
|
<script src="../../_static/sphinx_highlight.js?v=dc90522c"></script>
|
|
<script src="../../_static/scripts/sphinx-book-theme.js?v=887ef09a"></script>
|
|
<script>DOCUMENTATION_OPTIONS.pagename = '_modules/fabex/bas_relief';</script>
|
|
<link rel="index" title="Index" href="../../genindex.html" />
|
|
<link rel="search" title="Search" href="../../search.html" />
|
|
<meta name="viewport" content="width=device-width, initial-scale=1"/>
|
|
<meta name="docsearch:language" content="en"/>
|
|
</head>
|
|
|
|
|
|
<body data-bs-spy="scroll" data-bs-target=".bd-toc-nav" data-offset="180" data-bs-root-margin="0px 0px -60%" data-default-mode="">
|
|
|
|
|
|
|
|
<div id="pst-skip-link" class="skip-link d-print-none"><a href="#main-content">Skip to main content</a></div>
|
|
|
|
<div id="pst-scroll-pixel-helper"></div>
|
|
|
|
<button type="button" class="btn rounded-pill" id="pst-back-to-top">
|
|
<i class="fa-solid fa-arrow-up"></i>Back to top</button>
|
|
|
|
|
|
<input type="checkbox"
|
|
class="sidebar-toggle"
|
|
id="pst-primary-sidebar-checkbox"/>
|
|
<label class="overlay overlay-primary" for="pst-primary-sidebar-checkbox"></label>
|
|
|
|
<input type="checkbox"
|
|
class="sidebar-toggle"
|
|
id="pst-secondary-sidebar-checkbox"/>
|
|
<label class="overlay overlay-secondary" for="pst-secondary-sidebar-checkbox"></label>
|
|
|
|
<div class="search-button__wrapper">
|
|
<div class="search-button__overlay"></div>
|
|
<div class="search-button__search-container">
|
|
<form class="bd-search d-flex align-items-center"
|
|
action="../../search.html"
|
|
method="get">
|
|
<i class="fa-solid fa-magnifying-glass"></i>
|
|
<input type="search"
|
|
class="form-control"
|
|
name="q"
|
|
id="search-input"
|
|
placeholder="Search..."
|
|
aria-label="Search..."
|
|
autocomplete="off"
|
|
autocorrect="off"
|
|
autocapitalize="off"
|
|
spellcheck="false"/>
|
|
<span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd>K</kbd></span>
|
|
</form></div>
|
|
</div>
|
|
|
|
<div class="pst-async-banner-revealer d-none">
|
|
<aside id="bd-header-version-warning" class="d-none d-print-none" aria-label="Version warning"></aside>
|
|
</div>
|
|
|
|
|
|
<header class="bd-header navbar navbar-expand-lg bd-navbar d-print-none">
|
|
</header>
|
|
|
|
|
|
<div class="bd-container">
|
|
<div class="bd-container__inner bd-page-width">
|
|
|
|
|
|
|
|
|
|
|
|
<div class="bd-sidebar-primary bd-sidebar">
|
|
|
|
|
|
|
|
<div class="sidebar-header-items sidebar-primary__section">
|
|
|
|
|
|
|
|
|
|
</div>
|
|
|
|
<div class="sidebar-primary-items__start sidebar-primary__section">
|
|
<div class="sidebar-primary-item">
|
|
|
|
|
|
|
|
|
|
|
|
<a class="navbar-brand logo" href="../../index.html">
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<img src="../../_static/Fabex_logo_square.png" class="logo__image only-light" alt="Fabex 1.0.65 documentation - Home"/>
|
|
<script>document.write(`<img src="../../_static/Fabex_logo_square.png" class="logo__image only-dark" alt="Fabex 1.0.65 documentation - Home"/>`);</script>
|
|
|
|
|
|
</a></div>
|
|
<div class="sidebar-primary-item"><ul class="navbar-icon-links"
|
|
aria-label="Icon Links">
|
|
<li class="nav-item">
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<a href="https://github.com/pppalain/blendercam" title="GitHub" class="nav-link pst-navbar-icon" rel="noopener" target="_blank" data-bs-toggle="tooltip" data-bs-placement="bottom"><i class="fa-brands fa-square-github fa-lg" aria-hidden="true"></i>
|
|
<span class="sr-only">GitHub</span></a>
|
|
</li>
|
|
<li class="nav-item">
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<a href="https://riot.im/app/#/room/#blendercam:matrix.org" title="Matrix" class="nav-link pst-navbar-icon" rel="noopener" target="_blank" data-bs-toggle="tooltip" data-bs-placement="bottom"><i class="fa-solid fa-comments fa-lg" aria-hidden="true"></i>
|
|
<span class="sr-only">Matrix</span></a>
|
|
</li>
|
|
</ul></div>
|
|
<div class="sidebar-primary-item">
|
|
|
|
<script>
|
|
document.write(`
|
|
<button class="btn search-button-field search-button__button" title="Search" aria-label="Search" data-bs-placement="bottom" data-bs-toggle="tooltip">
|
|
<i class="fa-solid fa-magnifying-glass"></i>
|
|
<span class="search-button__default-text">Search</span>
|
|
<span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd class="kbd-shortcut__modifier">K</kbd></span>
|
|
</button>
|
|
`);
|
|
</script></div>
|
|
<div class="sidebar-primary-item"><nav class="bd-links bd-docs-nav" aria-label="Main">
|
|
<div class="bd-toc-item navbar-nav active">
|
|
<ul class="nav bd-sidenav">
|
|
<li class="toctree-l1 has-children"><a class="reference internal" href="../../users.html">User Guide</a><details><summary><span class="toctree-toggle" role="presentation"><i class="fa-solid fa-chevron-down"></i></span></summary><ul>
|
|
<li class="toctree-l2"><a class="reference internal" href="../../install.html">Installation</a></li>
|
|
<li class="toctree-l2"><a class="reference internal" href="../../starting.html">Getting Started</a></li>
|
|
<li class="toctree-l2"><a class="reference internal" href="../../interface.html">User Interface</a></li>
|
|
<li class="toctree-l2"><a class="reference internal" href="../../tools.html">Tools</a></li>
|
|
<li class="toctree-l2"><a class="reference internal" href="../../strategies.html">Strategies</a></li>
|
|
<li class="toctree-l2"><a class="reference internal" href="../../examplechain.html">Example Chain Workflow</a></li>
|
|
<li class="toctree-l2"><a class="reference internal" href="../../faq.html">FAQ</a></li>
|
|
<li class="toctree-l2"><a class="reference internal" href="../../glossary.html">Glossary</a></li>
|
|
</ul>
|
|
</details></li>
|
|
<li class="toctree-l1 has-children"><a class="reference internal" href="../../developers.html">Developer Guide</a><details><summary><span class="toctree-toggle" role="presentation"><i class="fa-solid fa-chevron-down"></i></span></summary><ul>
|
|
<li class="toctree-l2"><a class="reference internal" href="../../overview.html">Code Overview</a></li>
|
|
<li class="toctree-l2"><a class="reference internal" href="../../style.html">Style Guide</a></li>
|
|
<li class="toctree-l2"><a class="reference internal" href="../../testing.html">Test Suite</a></li>
|
|
<li class="toctree-l2"><a class="reference internal" href="../../workflows.html">Workflows & Actions</a></li>
|
|
</ul>
|
|
</details></li>
|
|
<li class="toctree-l1 has-children"><a class="reference internal" href="../../autoapi/index.html">API Reference</a><details><summary><span class="toctree-toggle" role="presentation"><i class="fa-solid fa-chevron-down"></i></span></summary><ul>
|
|
<li class="toctree-l2 has-children"><a class="reference internal" href="../../autoapi/fabex/index.html">fabex</a><details><summary><span class="toctree-toggle" role="presentation"><i class="fa-solid fa-chevron-down"></i></span></summary><ul>
|
|
<li class="toctree-l3"><a class="reference internal" href="../../autoapi/fabex/bas_relief/index.html">fabex.bas_relief</a></li>
|
|
<li class="toctree-l3"><a class="reference internal" href="../../autoapi/fabex/bridges/index.html">fabex.bridges</a></li>
|
|
<li class="toctree-l3"><a class="reference internal" href="../../autoapi/fabex/cam_chunk/index.html">fabex.cam_chunk</a></li>
|
|
<li class="toctree-l3"><a class="reference internal" href="../../autoapi/fabex/collision/index.html">fabex.collision</a></li>
|
|
<li class="toctree-l3"><a class="reference internal" href="../../autoapi/fabex/constants/index.html">fabex.constants</a></li>
|
|
<li class="toctree-l3"><a class="reference internal" href="../../autoapi/fabex/engine/index.html">fabex.engine</a></li>
|
|
<li class="toctree-l3"><a class="reference internal" href="../../autoapi/fabex/exception/index.html">fabex.exception</a></li>
|
|
<li class="toctree-l3"><a class="reference internal" href="../../autoapi/fabex/gcode_import_parser/index.html">fabex.gcode_import_parser</a></li>
|
|
<li class="toctree-l3"><a class="reference internal" href="../../autoapi/fabex/gcode_path/index.html">fabex.gcode_path</a></li>
|
|
<li class="toctree-l3"><a class="reference internal" href="../../autoapi/fabex/involute_gear/index.html">fabex.involute_gear</a></li>
|
|
<li class="toctree-l3"><a class="reference internal" href="../../autoapi/fabex/joinery/index.html">fabex.joinery</a></li>
|
|
<li class="toctree-l3 has-children"><a class="reference internal" href="../../autoapi/fabex/operators/index.html">fabex.operators</a><details><summary><span class="toctree-toggle" role="presentation"><i class="fa-solid fa-chevron-down"></i></span></summary><ul>
|
|
<li class="toctree-l4"><a class="reference internal" href="../../autoapi/fabex/operators/async_op/index.html">fabex.operators.async_op</a></li>
|
|
<li class="toctree-l4"><a class="reference internal" href="../../autoapi/fabex/operators/bas_relief_ops/index.html">fabex.operators.bas_relief_ops</a></li>
|
|
<li class="toctree-l4"><a class="reference internal" href="../../autoapi/fabex/operators/bridges_op/index.html">fabex.operators.bridges_op</a></li>
|
|
<li class="toctree-l4"><a class="reference internal" href="../../autoapi/fabex/operators/chain_ops/index.html">fabex.operators.chain_ops</a></li>
|
|
<li class="toctree-l4"><a class="reference internal" href="../../autoapi/fabex/operators/curve_create_ops/index.html">fabex.operators.curve_create_ops</a></li>
|
|
<li class="toctree-l4"><a class="reference internal" href="../../autoapi/fabex/operators/curve_equation_ops/index.html">fabex.operators.curve_equation_ops</a></li>
|
|
<li class="toctree-l4"><a class="reference internal" href="../../autoapi/fabex/operators/curve_tools_ops/index.html">fabex.operators.curve_tools_ops</a></li>
|
|
<li class="toctree-l4"><a class="reference internal" href="../../autoapi/fabex/operators/gcode_import_op/index.html">fabex.operators.gcode_import_op</a></li>
|
|
<li class="toctree-l4"><a class="reference internal" href="../../autoapi/fabex/operators/operation_ops/index.html">fabex.operators.operation_ops</a></li>
|
|
<li class="toctree-l4"><a class="reference internal" href="../../autoapi/fabex/operators/orient_op/index.html">fabex.operators.orient_op</a></li>
|
|
<li class="toctree-l4"><a class="reference internal" href="../../autoapi/fabex/operators/pack_op/index.html">fabex.operators.pack_op</a></li>
|
|
<li class="toctree-l4"><a class="reference internal" href="../../autoapi/fabex/operators/path_ops/index.html">fabex.operators.path_ops</a></li>
|
|
<li class="toctree-l4"><a class="reference internal" href="../../autoapi/fabex/operators/position_op/index.html">fabex.operators.position_op</a></li>
|
|
<li class="toctree-l4"><a class="reference internal" href="../../autoapi/fabex/operators/preset_ops/index.html">fabex.operators.preset_ops</a></li>
|
|
<li class="toctree-l4"><a class="reference internal" href="../../autoapi/fabex/operators/simulation_ops/index.html">fabex.operators.simulation_ops</a></li>
|
|
<li class="toctree-l4"><a class="reference internal" href="../../autoapi/fabex/operators/slice_op/index.html">fabex.operators.slice_op</a></li>
|
|
</ul>
|
|
</details></li>
|
|
<li class="toctree-l3"><a class="reference internal" href="../../autoapi/fabex/pack/index.html">fabex.pack</a></li>
|
|
<li class="toctree-l3"><a class="reference internal" href="../../autoapi/fabex/parametric/index.html">fabex.parametric</a></li>
|
|
<li class="toctree-l3"><a class="reference internal" href="../../autoapi/fabex/pattern/index.html">fabex.pattern</a></li>
|
|
<li class="toctree-l3"><a class="reference internal" href="../../autoapi/fabex/preferences/index.html">fabex.preferences</a></li>
|
|
<li class="toctree-l3 has-children"><a class="reference internal" href="../../autoapi/fabex/properties/index.html">fabex.properties</a><details><summary><span class="toctree-toggle" role="presentation"><i class="fa-solid fa-chevron-down"></i></span></summary><ul>
|
|
<li class="toctree-l4"><a class="reference internal" href="../../autoapi/fabex/properties/chain_props/index.html">fabex.properties.chain_props</a></li>
|
|
<li class="toctree-l4"><a class="reference internal" href="../../autoapi/fabex/properties/info_props/index.html">fabex.properties.info_props</a></li>
|
|
<li class="toctree-l4"><a class="reference internal" href="../../autoapi/fabex/properties/interface_props/index.html">fabex.properties.interface_props</a></li>
|
|
<li class="toctree-l4"><a class="reference internal" href="../../autoapi/fabex/properties/machine_props/index.html">fabex.properties.machine_props</a></li>
|
|
<li class="toctree-l4"><a class="reference internal" href="../../autoapi/fabex/properties/material_props/index.html">fabex.properties.material_props</a></li>
|
|
<li class="toctree-l4"><a class="reference internal" href="../../autoapi/fabex/properties/movement_props/index.html">fabex.properties.movement_props</a></li>
|
|
<li class="toctree-l4"><a class="reference internal" href="../../autoapi/fabex/properties/operation_props/index.html">fabex.properties.operation_props</a></li>
|
|
<li class="toctree-l4"><a class="reference internal" href="../../autoapi/fabex/properties/optimisation_props/index.html">fabex.properties.optimisation_props</a></li>
|
|
</ul>
|
|
</details></li>
|
|
<li class="toctree-l3"><a class="reference internal" href="../../autoapi/fabex/puzzle_joinery/index.html">fabex.puzzle_joinery</a></li>
|
|
<li class="toctree-l3"><a class="reference internal" href="../../autoapi/fabex/simulation/index.html">fabex.simulation</a></li>
|
|
<li class="toctree-l3"><a class="reference internal" href="../../autoapi/fabex/slice/index.html">fabex.slice</a></li>
|
|
<li class="toctree-l3"><a class="reference internal" href="../../autoapi/fabex/strategy/index.html">fabex.strategy</a></li>
|
|
<li class="toctree-l3"><a class="reference internal" href="../../autoapi/fabex/testing/index.html">fabex.testing</a></li>
|
|
<li class="toctree-l3 has-children"><a class="reference internal" href="../../autoapi/fabex/utilities/index.html">fabex.utilities</a><details><summary><span class="toctree-toggle" role="presentation"><i class="fa-solid fa-chevron-down"></i></span></summary><ul>
|
|
<li class="toctree-l4"><a class="reference internal" href="../../autoapi/fabex/utilities/addon_utils/index.html">fabex.utilities.addon_utils</a></li>
|
|
<li class="toctree-l4"><a class="reference internal" href="../../autoapi/fabex/utilities/async_utils/index.html">fabex.utilities.async_utils</a></li>
|
|
<li class="toctree-l4"><a class="reference internal" href="../../autoapi/fabex/utilities/bounds_utils/index.html">fabex.utilities.bounds_utils</a></li>
|
|
<li class="toctree-l4"><a class="reference internal" href="../../autoapi/fabex/utilities/chunk_utils/index.html">fabex.utilities.chunk_utils</a></li>
|
|
<li class="toctree-l4"><a class="reference internal" href="../../autoapi/fabex/utilities/compare_utils/index.html">fabex.utilities.compare_utils</a></li>
|
|
<li class="toctree-l4"><a class="reference internal" href="../../autoapi/fabex/utilities/dict_utils/index.html">fabex.utilities.dict_utils</a></li>
|
|
<li class="toctree-l4"><a class="reference internal" href="../../autoapi/fabex/utilities/geom_utils/index.html">fabex.utilities.geom_utils</a></li>
|
|
<li class="toctree-l4"><a class="reference internal" href="../../autoapi/fabex/utilities/image_utils/index.html">fabex.utilities.image_utils</a></li>
|
|
<li class="toctree-l4"><a class="reference internal" href="../../autoapi/fabex/utilities/index_utils/index.html">fabex.utilities.index_utils</a></li>
|
|
<li class="toctree-l4"><a class="reference internal" href="../../autoapi/fabex/utilities/loop_utils/index.html">fabex.utilities.loop_utils</a></li>
|
|
<li class="toctree-l4"><a class="reference internal" href="../../autoapi/fabex/utilities/machine_utils/index.html">fabex.utilities.machine_utils</a></li>
|
|
<li class="toctree-l4"><a class="reference internal" href="../../autoapi/fabex/utilities/material_utils/index.html">fabex.utilities.material_utils</a></li>
|
|
<li class="toctree-l4"><a class="reference internal" href="../../autoapi/fabex/utilities/numba_utils/index.html">fabex.utilities.numba_utils</a></li>
|
|
<li class="toctree-l4"><a class="reference internal" href="../../autoapi/fabex/utilities/ocl_utils/index.html">fabex.utilities.ocl_utils</a></li>
|
|
<li class="toctree-l4"><a class="reference internal" href="../../autoapi/fabex/utilities/operation_utils/index.html">fabex.utilities.operation_utils</a></li>
|
|
<li class="toctree-l4"><a class="reference internal" href="../../autoapi/fabex/utilities/orient_utils/index.html">fabex.utilities.orient_utils</a></li>
|
|
<li class="toctree-l4"><a class="reference internal" href="../../autoapi/fabex/utilities/shapely_utils/index.html">fabex.utilities.shapely_utils</a></li>
|
|
<li class="toctree-l4"><a class="reference internal" href="../../autoapi/fabex/utilities/simple_utils/index.html">fabex.utilities.simple_utils</a></li>
|
|
<li class="toctree-l4"><a class="reference internal" href="../../autoapi/fabex/utilities/strategy_utils/index.html">fabex.utilities.strategy_utils</a></li>
|
|
<li class="toctree-l4"><a class="reference internal" href="../../autoapi/fabex/utilities/thread_utils/index.html">fabex.utilities.thread_utils</a></li>
|
|
<li class="toctree-l4"><a class="reference internal" href="../../autoapi/fabex/utilities/version_utils/index.html">fabex.utilities.version_utils</a></li>
|
|
</ul>
|
|
</details></li>
|
|
<li class="toctree-l3"><a class="reference internal" href="../../autoapi/fabex/version/index.html">fabex.version</a></li>
|
|
<li class="toctree-l3"><a class="reference internal" href="../../autoapi/fabex/voronoi/index.html">fabex.voronoi</a></li>
|
|
</ul>
|
|
</details></li>
|
|
</ul>
|
|
</details></li>
|
|
</ul>
|
|
|
|
</div>
|
|
</nav></div>
|
|
</div>
|
|
|
|
|
|
<div class="sidebar-primary-items__end sidebar-primary__section">
|
|
</div>
|
|
|
|
<div id="rtd-footer-container"></div>
|
|
|
|
|
|
</div>
|
|
|
|
<main id="main-content" class="bd-main" role="main">
|
|
|
|
|
|
|
|
<div class="sbt-scroll-pixel-helper"></div>
|
|
|
|
<div class="bd-content">
|
|
<div class="bd-article-container">
|
|
|
|
<div class="bd-header-article d-print-none">
|
|
<div class="header-article-items header-article__inner">
|
|
|
|
<div class="header-article-items__start">
|
|
|
|
<div class="header-article-item"><button class="sidebar-toggle primary-toggle btn btn-sm" title="Toggle primary sidebar" data-bs-placement="bottom" data-bs-toggle="tooltip">
|
|
<span class="fa-solid fa-bars"></span>
|
|
</button></div>
|
|
|
|
</div>
|
|
|
|
|
|
<div class="header-article-items__end">
|
|
|
|
<div class="header-article-item">
|
|
|
|
<div class="article-header-buttons">
|
|
|
|
|
|
|
|
<button onclick="toggleFullScreen()"
|
|
class="btn btn-sm btn-fullscreen-button"
|
|
title="Fullscreen mode"
|
|
data-bs-placement="bottom" data-bs-toggle="tooltip"
|
|
>
|
|
|
|
|
|
<span class="btn__icon-container">
|
|
<i class="fas fa-expand"></i>
|
|
</span>
|
|
|
|
</button>
|
|
|
|
|
|
|
|
<script>
|
|
document.write(`
|
|
<button class="btn btn-sm nav-link pst-navbar-icon theme-switch-button" title="light/dark" aria-label="light/dark" data-bs-placement="bottom" data-bs-toggle="tooltip">
|
|
<i class="theme-switch fa-solid fa-sun fa-lg" data-mode="light"></i>
|
|
<i class="theme-switch fa-solid fa-moon fa-lg" data-mode="dark"></i>
|
|
<i class="theme-switch fa-solid fa-circle-half-stroke fa-lg" data-mode="auto"></i>
|
|
</button>
|
|
`);
|
|
</script>
|
|
|
|
|
|
<script>
|
|
document.write(`
|
|
<button class="btn btn-sm pst-navbar-icon search-button search-button__button" title="Search" aria-label="Search" data-bs-placement="bottom" data-bs-toggle="tooltip">
|
|
<i class="fa-solid fa-magnifying-glass fa-lg"></i>
|
|
</button>
|
|
`);
|
|
</script>
|
|
|
|
</div></div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
<div id="jb-print-docs-body" class="onlyprint">
|
|
<h1></h1>
|
|
<!-- Table of contents -->
|
|
<div id="print-main-content">
|
|
<div id="jb-print-toc">
|
|
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
<div id="searchbox"></div>
|
|
<article class="bd-article">
|
|
|
|
<h1>Source code for fabex.bas_relief</h1><div class="highlight"><pre>
|
|
<span></span><span class="sd">"""Fabex 'bas_relief.py'</span>
|
|
|
|
<span class="sd">Module to allow the creation of reliefs from Images or View Layers.</span>
|
|
<span class="sd">(https://en.wikipedia.org/wiki/Relief#Bas-relief_or_low_relief)</span>
|
|
<span class="sd">"""</span>
|
|
|
|
<span class="kn">from</span><span class="w"> </span><span class="nn">math</span><span class="w"> </span><span class="kn">import</span> <span class="n">ceil</span><span class="p">,</span> <span class="n">floor</span><span class="p">,</span> <span class="n">sqrt</span>
|
|
<span class="kn">import</span><span class="w"> </span><span class="nn">re</span>
|
|
<span class="kn">import</span><span class="w"> </span><span class="nn">time</span>
|
|
|
|
<span class="kn">import</span><span class="w"> </span><span class="nn">numpy</span>
|
|
|
|
<span class="kn">import</span><span class="w"> </span><span class="nn">bpy</span>
|
|
|
|
<span class="kn">from</span><span class="w"> </span><span class="nn">.constants</span><span class="w"> </span><span class="kn">import</span> <span class="n">EPS</span><span class="p">,</span> <span class="n">NUMPYALG</span>
|
|
<span class="kn">from</span><span class="w"> </span><span class="nn">.utilities.image_utils</span><span class="w"> </span><span class="kn">import</span> <span class="p">(</span>
|
|
<span class="n">image_to_numpy</span><span class="p">,</span>
|
|
<span class="n">numpy_to_image</span><span class="p">,</span>
|
|
<span class="p">)</span>
|
|
|
|
|
|
<div class="viewcode-block" id="ReliefError">
|
|
<a class="viewcode-back" href="../../autoapi/fabex/bas_relief/index.html#fabex.bas_relief.ReliefError">[docs]</a>
|
|
<span class="k">class</span><span class="w"> </span><span class="nc">ReliefError</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span>
|
|
<span class="k">pass</span></div>
|
|
|
|
|
|
|
|
<div class="viewcode-block" id="copy_compbuf_data">
|
|
<a class="viewcode-back" href="../../autoapi/fabex/bas_relief/index.html#fabex.bas_relief.copy_compbuf_data">[docs]</a>
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">copy_compbuf_data</span><span class="p">(</span><span class="n">inbuf</span><span class="p">,</span> <span class="n">outbuf</span><span class="p">):</span>
|
|
<span class="n">outbuf</span><span class="p">[:]</span> <span class="o">=</span> <span class="n">inbuf</span><span class="p">[:]</span></div>
|
|
|
|
|
|
|
|
<div class="viewcode-block" id="restrict_buffer">
|
|
<a class="viewcode-back" href="../../autoapi/fabex/bas_relief/index.html#fabex.bas_relief.restrict_buffer">[docs]</a>
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">restrict_buffer</span><span class="p">(</span><span class="n">inbuf</span><span class="p">,</span> <span class="n">outbuf</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Restrict the resolution of an input buffer to match an output buffer.</span>
|
|
|
|
<span class="sd"> This function scales down the input buffer `inbuf` to fit the dimensions</span>
|
|
<span class="sd"> of the output buffer `outbuf`. It computes the average of the</span>
|
|
<span class="sd"> neighboring pixels in the input buffer to create a downsampled version</span>
|
|
<span class="sd"> in the output buffer. The method used for downsampling can vary based on</span>
|
|
<span class="sd"> the dimensions of the input and output buffers, utilizing either a</span>
|
|
<span class="sd"> simple averaging method or a more complex numpy-based approach.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> inbuf (numpy.ndarray): The input buffer to be downsampled, expected to be</span>
|
|
<span class="sd"> a 2D array.</span>
|
|
<span class="sd"> outbuf (numpy.ndarray): The output buffer where the downsampled result will</span>
|
|
<span class="sd"> be stored, also expected to be a 2D array.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> None: The function modifies `outbuf` in place.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="c1"># scale down array....</span>
|
|
|
|
<span class="n">inx</span> <span class="o">=</span> <span class="n">inbuf</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
|
|
<span class="n">iny</span> <span class="o">=</span> <span class="n">inbuf</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
|
|
|
|
<span class="n">outx</span> <span class="o">=</span> <span class="n">outbuf</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
|
|
<span class="n">outy</span> <span class="o">=</span> <span class="n">outbuf</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
|
|
|
|
<span class="n">dx</span> <span class="o">=</span> <span class="n">inx</span> <span class="o">/</span> <span class="n">outx</span>
|
|
<span class="n">dy</span> <span class="o">=</span> <span class="n">iny</span> <span class="o">/</span> <span class="n">outy</span>
|
|
|
|
<span class="n">filterSize</span> <span class="o">=</span> <span class="mf">0.5</span>
|
|
<span class="n">xfiltersize</span> <span class="o">=</span> <span class="n">dx</span> <span class="o">*</span> <span class="n">filterSize</span>
|
|
|
|
<span class="n">sy</span> <span class="o">=</span> <span class="n">dy</span> <span class="o">/</span> <span class="mi">2</span> <span class="o">-</span> <span class="mf">0.5</span>
|
|
<span class="k">if</span> <span class="n">dx</span> <span class="o">==</span> <span class="mi">2</span> <span class="ow">and</span> <span class="n">dy</span> <span class="o">==</span> <span class="mi">2</span><span class="p">:</span> <span class="c1"># much simpler method</span>
|
|
<span class="n">outbuf</span><span class="p">[:]</span> <span class="o">=</span> <span class="p">(</span>
|
|
<span class="n">inbuf</span><span class="p">[::</span><span class="mi">2</span><span class="p">,</span> <span class="p">::</span><span class="mi">2</span><span class="p">]</span> <span class="o">+</span> <span class="n">inbuf</span><span class="p">[</span><span class="mi">1</span><span class="p">::</span><span class="mi">2</span><span class="p">,</span> <span class="p">::</span><span class="mi">2</span><span class="p">]</span> <span class="o">+</span> <span class="n">inbuf</span><span class="p">[::</span><span class="mi">2</span><span class="p">,</span> <span class="mi">1</span><span class="p">::</span><span class="mi">2</span><span class="p">]</span> <span class="o">+</span> <span class="n">inbuf</span><span class="p">[</span><span class="mi">1</span><span class="p">::</span><span class="mi">2</span><span class="p">,</span> <span class="mi">1</span><span class="p">::</span><span class="mi">2</span><span class="p">]</span>
|
|
<span class="p">)</span> <span class="o">/</span> <span class="mf">4.0</span>
|
|
|
|
<span class="k">elif</span> <span class="n">NUMPYALG</span><span class="p">:</span> <span class="c1"># numpy method</span>
|
|
<span class="n">yrange</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">outy</span><span class="p">)</span>
|
|
<span class="n">xrange</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">outx</span><span class="p">)</span>
|
|
|
|
<span class="n">w</span> <span class="o">=</span> <span class="mi">0</span>
|
|
<span class="n">sx</span> <span class="o">=</span> <span class="n">dx</span> <span class="o">/</span> <span class="mi">2</span> <span class="o">-</span> <span class="mf">0.5</span>
|
|
|
|
<span class="n">sxrange</span> <span class="o">=</span> <span class="n">xrange</span> <span class="o">*</span> <span class="n">dx</span> <span class="o">+</span> <span class="n">sx</span>
|
|
<span class="n">syrange</span> <span class="o">=</span> <span class="n">yrange</span> <span class="o">*</span> <span class="n">dy</span> <span class="o">+</span> <span class="n">sy</span>
|
|
|
|
<span class="n">sxstartrange</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">numpy</span><span class="o">.</span><span class="n">ceil</span><span class="p">(</span><span class="n">sxrange</span> <span class="o">-</span> <span class="n">xfiltersize</span><span class="p">),</span> <span class="n">dtype</span><span class="o">=</span><span class="nb">int</span><span class="p">)</span>
|
|
<span class="n">sxstartrange</span><span class="p">[</span><span class="n">sxstartrange</span> <span class="o"><</span> <span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span>
|
|
<span class="n">sxendrange</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">numpy</span><span class="o">.</span><span class="n">floor</span><span class="p">(</span><span class="n">sxrange</span> <span class="o">+</span> <span class="n">xfiltersize</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">dtype</span><span class="o">=</span><span class="nb">int</span><span class="p">)</span>
|
|
<span class="n">sxendrange</span><span class="p">[</span><span class="n">sxendrange</span> <span class="o">></span> <span class="n">inx</span><span class="p">]</span> <span class="o">=</span> <span class="n">inx</span>
|
|
|
|
<span class="n">systartrange</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">numpy</span><span class="o">.</span><span class="n">ceil</span><span class="p">(</span><span class="n">syrange</span> <span class="o">-</span> <span class="n">xfiltersize</span><span class="p">),</span> <span class="n">dtype</span><span class="o">=</span><span class="nb">int</span><span class="p">)</span>
|
|
<span class="n">systartrange</span><span class="p">[</span><span class="n">systartrange</span> <span class="o"><</span> <span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span>
|
|
<span class="n">syendrange</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">numpy</span><span class="o">.</span><span class="n">floor</span><span class="p">(</span><span class="n">syrange</span> <span class="o">+</span> <span class="n">xfiltersize</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">dtype</span><span class="o">=</span><span class="nb">int</span><span class="p">)</span>
|
|
<span class="n">syendrange</span><span class="p">[</span><span class="n">syendrange</span> <span class="o">></span> <span class="n">iny</span><span class="p">]</span> <span class="o">=</span> <span class="n">iny</span>
|
|
|
|
<span class="c1"># 3 is the maximum value...?pff.</span>
|
|
<span class="n">indices</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="n">outx</span> <span class="o">*</span> <span class="n">outy</span> <span class="o">*</span> <span class="mi">2</span> <span class="o">*</span> <span class="mi">3</span><span class="p">)</span><span class="o">.</span><span class="n">reshape</span><span class="p">((</span><span class="mi">2</span><span class="p">,</span> <span class="n">outx</span> <span class="o">*</span> <span class="n">outy</span><span class="p">,</span> <span class="mi">3</span><span class="p">))</span>
|
|
|
|
<span class="n">r</span> <span class="o">=</span> <span class="n">sxendrange</span> <span class="o">-</span> <span class="n">sxstartrange</span>
|
|
|
|
<span class="n">indices</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="n">sxstartrange</span><span class="o">.</span><span class="n">repeat</span><span class="p">(</span><span class="n">outy</span><span class="p">)</span>
|
|
<span class="n">indices</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">systartrange</span><span class="o">.</span><span class="n">repeat</span><span class="p">(</span><span class="n">outx</span><span class="p">)</span><span class="o">.</span><span class="n">reshape</span><span class="p">(</span><span class="n">outx</span><span class="p">,</span> <span class="n">outy</span><span class="p">)</span><span class="o">.</span><span class="n">swapaxes</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span><span class="o">.</span><span class="n">flatten</span><span class="p">()</span>
|
|
|
|
<span class="n">outbuf</span><span class="o">.</span><span class="n">fill</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
|
|
<span class="n">tempbuf</span> <span class="o">=</span> <span class="n">inbuf</span><span class="p">[</span><span class="n">indices</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">indices</span><span class="p">[</span><span class="mi">1</span><span class="p">]]</span>
|
|
<span class="n">tempbuf</span> <span class="o">+=</span> <span class="n">inbuf</span><span class="p">[</span><span class="n">indices</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">indices</span><span class="p">[</span><span class="mi">1</span><span class="p">]]</span>
|
|
<span class="n">tempbuf</span> <span class="o">+=</span> <span class="n">inbuf</span><span class="p">[</span><span class="n">indices</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">indices</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">+</span> <span class="mi">1</span><span class="p">]</span>
|
|
<span class="n">tempbuf</span> <span class="o">+=</span> <span class="n">inbuf</span><span class="p">[</span><span class="n">indices</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">indices</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">+</span> <span class="mi">1</span><span class="p">]</span>
|
|
<span class="n">tempbuf</span> <span class="o">/=</span> <span class="mf">4.0</span>
|
|
<span class="n">outbuf</span><span class="p">[:]</span> <span class="o">=</span> <span class="n">tempbuf</span><span class="o">.</span><span class="n">reshape</span><span class="p">((</span><span class="n">outx</span><span class="p">,</span> <span class="n">outy</span><span class="p">))</span>
|
|
|
|
<span class="k">else</span><span class="p">:</span> <span class="c1"># old method</span>
|
|
<span class="k">for</span> <span class="n">y</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">outy</span><span class="p">):</span>
|
|
<span class="n">sx</span> <span class="o">=</span> <span class="n">dx</span> <span class="o">/</span> <span class="mi">2</span> <span class="o">-</span> <span class="mf">0.5</span>
|
|
<span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">outx</span><span class="p">):</span>
|
|
<span class="n">pixVal</span> <span class="o">=</span> <span class="mi">0</span>
|
|
<span class="n">w</span> <span class="o">=</span> <span class="mi">0</span>
|
|
|
|
<span class="c1">#</span>
|
|
<span class="k">for</span> <span class="n">ix</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span>
|
|
<span class="nb">max</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">ceil</span><span class="p">(</span><span class="n">sx</span> <span class="o">-</span> <span class="n">dx</span> <span class="o">*</span> <span class="n">filterSize</span><span class="p">)),</span>
|
|
<span class="nb">min</span><span class="p">(</span><span class="n">floor</span><span class="p">(</span><span class="n">sx</span> <span class="o">+</span> <span class="n">dx</span> <span class="o">*</span> <span class="n">filterSize</span><span class="p">),</span> <span class="n">inx</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span>
|
|
<span class="p">):</span>
|
|
<span class="k">for</span> <span class="n">iy</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span>
|
|
<span class="nb">max</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">ceil</span><span class="p">(</span><span class="n">sy</span> <span class="o">-</span> <span class="n">dx</span> <span class="o">*</span> <span class="n">filterSize</span><span class="p">)),</span>
|
|
<span class="nb">min</span><span class="p">(</span><span class="n">floor</span><span class="p">(</span><span class="n">sy</span> <span class="o">+</span> <span class="n">dx</span> <span class="o">*</span> <span class="n">filterSize</span><span class="p">),</span> <span class="n">iny</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span>
|
|
<span class="p">):</span>
|
|
<span class="n">pixVal</span> <span class="o">+=</span> <span class="n">inbuf</span><span class="p">[</span><span class="n">ix</span><span class="p">,</span> <span class="n">iy</span><span class="p">]</span>
|
|
<span class="n">w</span> <span class="o">+=</span> <span class="mi">1</span>
|
|
<span class="n">outbuf</span><span class="p">[</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">]</span> <span class="o">=</span> <span class="n">pixVal</span> <span class="o">/</span> <span class="n">w</span>
|
|
|
|
<span class="n">sx</span> <span class="o">+=</span> <span class="n">dx</span>
|
|
<span class="n">sy</span> <span class="o">+=</span> <span class="n">dy</span></div>
|
|
|
|
|
|
|
|
<div class="viewcode-block" id="prolongate">
|
|
<a class="viewcode-back" href="../../autoapi/fabex/bas_relief/index.html#fabex.bas_relief.prolongate">[docs]</a>
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">prolongate</span><span class="p">(</span><span class="n">inbuf</span><span class="p">,</span> <span class="n">outbuf</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Prolongate an input buffer to a larger output buffer.</span>
|
|
|
|
<span class="sd"> This function takes an input buffer and enlarges it to fit the</span>
|
|
<span class="sd"> dimensions of the output buffer. It uses different methods to achieve</span>
|
|
<span class="sd"> this based on the scaling factors derived from the input and output</span>
|
|
<span class="sd"> dimensions. The function can handle specific cases where the scaling</span>
|
|
<span class="sd"> factors are exactly 0.5, as well as a general case that applies a</span>
|
|
<span class="sd"> bilinear interpolation technique for resizing.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> inbuf (numpy.ndarray): The input buffer to be enlarged, expected to be a 2D array.</span>
|
|
<span class="sd"> outbuf (numpy.ndarray): The output buffer where the enlarged data will be stored,</span>
|
|
<span class="sd"> expected to be a 2D array of larger dimensions than inbuf.</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="n">inx</span> <span class="o">=</span> <span class="n">inbuf</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
|
|
<span class="n">iny</span> <span class="o">=</span> <span class="n">inbuf</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
|
|
|
|
<span class="n">outx</span> <span class="o">=</span> <span class="n">outbuf</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
|
|
<span class="n">outy</span> <span class="o">=</span> <span class="n">outbuf</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
|
|
|
|
<span class="n">dx</span> <span class="o">=</span> <span class="n">inx</span> <span class="o">/</span> <span class="n">outx</span>
|
|
<span class="n">dy</span> <span class="o">=</span> <span class="n">iny</span> <span class="o">/</span> <span class="n">outy</span>
|
|
|
|
<span class="n">filterSize</span> <span class="o">=</span> <span class="mi">1</span>
|
|
<span class="n">xfiltersize</span> <span class="o">=</span> <span class="n">dx</span> <span class="o">*</span> <span class="n">filterSize</span>
|
|
|
|
<span class="k">if</span> <span class="n">dx</span> <span class="o">==</span> <span class="mf">0.5</span> <span class="ow">and</span> <span class="n">dy</span> <span class="o">==</span> <span class="mf">0.5</span><span class="p">:</span>
|
|
<span class="n">outbuf</span><span class="p">[::</span><span class="mi">2</span><span class="p">,</span> <span class="p">::</span><span class="mi">2</span><span class="p">]</span> <span class="o">=</span> <span class="n">inbuf</span>
|
|
<span class="n">outbuf</span><span class="p">[</span><span class="mi">1</span><span class="p">::</span><span class="mi">2</span><span class="p">,</span> <span class="p">::</span><span class="mi">2</span><span class="p">]</span> <span class="o">=</span> <span class="n">inbuf</span>
|
|
<span class="n">outbuf</span><span class="p">[::</span><span class="mi">2</span><span class="p">,</span> <span class="mi">1</span><span class="p">::</span><span class="mi">2</span><span class="p">]</span> <span class="o">=</span> <span class="n">inbuf</span>
|
|
<span class="n">outbuf</span><span class="p">[</span><span class="mi">1</span><span class="p">::</span><span class="mi">2</span><span class="p">,</span> <span class="mi">1</span><span class="p">::</span><span class="mi">2</span><span class="p">]</span> <span class="o">=</span> <span class="n">inbuf</span>
|
|
<span class="k">elif</span> <span class="n">NUMPYALG</span><span class="p">:</span> <span class="c1"># numpy method</span>
|
|
<span class="n">sy</span> <span class="o">=</span> <span class="o">-</span><span class="n">dy</span> <span class="o">/</span> <span class="mi">2</span>
|
|
<span class="n">sx</span> <span class="o">=</span> <span class="o">-</span><span class="n">dx</span> <span class="o">/</span> <span class="mi">2</span>
|
|
<span class="n">xrange</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">outx</span><span class="p">)</span>
|
|
<span class="n">yrange</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">outy</span><span class="p">)</span>
|
|
|
|
<span class="n">sxrange</span> <span class="o">=</span> <span class="n">xrange</span> <span class="o">*</span> <span class="n">dx</span> <span class="o">+</span> <span class="n">sx</span>
|
|
<span class="n">syrange</span> <span class="o">=</span> <span class="n">yrange</span> <span class="o">*</span> <span class="n">dy</span> <span class="o">+</span> <span class="n">sy</span>
|
|
|
|
<span class="n">sxstartrange</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">numpy</span><span class="o">.</span><span class="n">ceil</span><span class="p">(</span><span class="n">sxrange</span> <span class="o">-</span> <span class="n">xfiltersize</span><span class="p">),</span> <span class="n">dtype</span><span class="o">=</span><span class="nb">int</span><span class="p">)</span>
|
|
<span class="n">sxstartrange</span><span class="p">[</span><span class="n">sxstartrange</span> <span class="o"><</span> <span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span>
|
|
<span class="n">sxendrange</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">numpy</span><span class="o">.</span><span class="n">floor</span><span class="p">(</span><span class="n">sxrange</span> <span class="o">+</span> <span class="n">xfiltersize</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">dtype</span><span class="o">=</span><span class="nb">int</span><span class="p">)</span>
|
|
<span class="n">sxendrange</span><span class="p">[</span><span class="n">sxendrange</span> <span class="o">>=</span> <span class="n">inx</span><span class="p">]</span> <span class="o">=</span> <span class="n">inx</span> <span class="o">-</span> <span class="mi">1</span>
|
|
<span class="n">systartrange</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">numpy</span><span class="o">.</span><span class="n">ceil</span><span class="p">(</span><span class="n">syrange</span> <span class="o">-</span> <span class="n">xfiltersize</span><span class="p">),</span> <span class="n">dtype</span><span class="o">=</span><span class="nb">int</span><span class="p">)</span>
|
|
<span class="n">systartrange</span><span class="p">[</span><span class="n">systartrange</span> <span class="o"><</span> <span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span>
|
|
<span class="n">syendrange</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">numpy</span><span class="o">.</span><span class="n">floor</span><span class="p">(</span><span class="n">syrange</span> <span class="o">+</span> <span class="n">xfiltersize</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">dtype</span><span class="o">=</span><span class="nb">int</span><span class="p">)</span>
|
|
<span class="n">syendrange</span><span class="p">[</span><span class="n">syendrange</span> <span class="o">>=</span> <span class="n">iny</span><span class="p">]</span> <span class="o">=</span> <span class="n">iny</span> <span class="o">-</span> <span class="mi">1</span>
|
|
|
|
<span class="n">indices</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="n">outx</span> <span class="o">*</span> <span class="n">outy</span> <span class="o">*</span> <span class="mi">2</span><span class="p">)</span><span class="o">.</span><span class="n">reshape</span><span class="p">((</span><span class="mi">2</span><span class="p">,</span> <span class="n">outx</span> <span class="o">*</span> <span class="n">outy</span><span class="p">))</span>
|
|
<span class="n">indices</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="n">sxstartrange</span><span class="o">.</span><span class="n">repeat</span><span class="p">(</span><span class="n">outy</span><span class="p">)</span>
|
|
<span class="n">indices</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">systartrange</span><span class="o">.</span><span class="n">repeat</span><span class="p">(</span><span class="n">outx</span><span class="p">)</span><span class="o">.</span><span class="n">reshape</span><span class="p">(</span><span class="n">outx</span><span class="p">,</span> <span class="n">outy</span><span class="p">)</span><span class="o">.</span><span class="n">swapaxes</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span><span class="o">.</span><span class="n">flatten</span><span class="p">()</span>
|
|
|
|
<span class="n">tempbuf</span> <span class="o">=</span> <span class="n">inbuf</span><span class="p">[</span><span class="n">indices</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">indices</span><span class="p">[</span><span class="mi">1</span><span class="p">]]</span>
|
|
<span class="n">tempbuf</span> <span class="o">/=</span> <span class="mf">4.0</span>
|
|
<span class="n">outbuf</span><span class="p">[:]</span> <span class="o">=</span> <span class="n">tempbuf</span><span class="o">.</span><span class="n">reshape</span><span class="p">((</span><span class="n">outx</span><span class="p">,</span> <span class="n">outy</span><span class="p">))</span>
|
|
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">sy</span> <span class="o">=</span> <span class="o">-</span><span class="n">dy</span> <span class="o">/</span> <span class="mi">2</span>
|
|
<span class="k">for</span> <span class="n">y</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">outy</span><span class="p">):</span>
|
|
<span class="n">sx</span> <span class="o">=</span> <span class="o">-</span><span class="n">dx</span> <span class="o">/</span> <span class="mi">2</span>
|
|
<span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">outx</span><span class="p">):</span>
|
|
<span class="n">pixVal</span> <span class="o">=</span> <span class="mi">0</span>
|
|
<span class="n">weight</span> <span class="o">=</span> <span class="mi">0</span>
|
|
|
|
<span class="k">for</span> <span class="n">ix</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span>
|
|
<span class="nb">max</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">ceil</span><span class="p">(</span><span class="n">sx</span> <span class="o">-</span> <span class="n">filterSize</span><span class="p">)),</span> <span class="nb">min</span><span class="p">(</span><span class="n">floor</span><span class="p">(</span><span class="n">sx</span> <span class="o">+</span> <span class="n">filterSize</span><span class="p">),</span> <span class="n">inx</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span>
|
|
<span class="p">):</span>
|
|
<span class="k">for</span> <span class="n">iy</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span>
|
|
<span class="nb">max</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">ceil</span><span class="p">(</span><span class="n">sy</span> <span class="o">-</span> <span class="n">filterSize</span><span class="p">)),</span> <span class="nb">min</span><span class="p">(</span><span class="n">floor</span><span class="p">(</span><span class="n">sy</span> <span class="o">+</span> <span class="n">filterSize</span><span class="p">),</span> <span class="n">iny</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span>
|
|
<span class="p">):</span>
|
|
<span class="n">fx</span> <span class="o">=</span> <span class="nb">abs</span><span class="p">(</span><span class="n">sx</span> <span class="o">-</span> <span class="n">ix</span><span class="p">)</span>
|
|
<span class="n">fy</span> <span class="o">=</span> <span class="nb">abs</span><span class="p">(</span><span class="n">sy</span> <span class="o">-</span> <span class="n">iy</span><span class="p">)</span>
|
|
|
|
<span class="n">fval</span> <span class="o">=</span> <span class="p">(</span><span class="mi">1</span> <span class="o">-</span> <span class="n">fx</span><span class="p">)</span> <span class="o">*</span> <span class="p">(</span><span class="mi">1</span> <span class="o">-</span> <span class="n">fy</span><span class="p">)</span>
|
|
|
|
<span class="n">pixVal</span> <span class="o">+=</span> <span class="n">inbuf</span><span class="p">[</span><span class="n">ix</span><span class="p">,</span> <span class="n">iy</span><span class="p">]</span> <span class="o">*</span> <span class="n">fval</span>
|
|
<span class="n">weight</span> <span class="o">+=</span> <span class="n">fval</span>
|
|
<span class="n">outbuf</span><span class="p">[</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">]</span> <span class="o">=</span> <span class="n">pixVal</span> <span class="o">/</span> <span class="n">weight</span>
|
|
<span class="n">sx</span> <span class="o">+=</span> <span class="n">dx</span>
|
|
<span class="n">sy</span> <span class="o">+=</span> <span class="n">dy</span></div>
|
|
|
|
|
|
|
|
<div class="viewcode-block" id="idx">
|
|
<a class="viewcode-back" href="../../autoapi/fabex/bas_relief/index.html#fabex.bas_relief.idx">[docs]</a>
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">idx</span><span class="p">(</span><span class="n">r</span><span class="p">,</span> <span class="n">c</span><span class="p">,</span> <span class="n">cols</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="n">r</span> <span class="o">*</span> <span class="n">cols</span> <span class="o">+</span> <span class="n">c</span> <span class="o">+</span> <span class="mi">1</span></div>
|
|
|
|
|
|
|
|
<div class="viewcode-block" id="smooth">
|
|
<a class="viewcode-back" href="../../autoapi/fabex/bas_relief/index.html#fabex.bas_relief.smooth">[docs]</a>
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">smooth</span><span class="p">(</span><span class="n">U</span><span class="p">,</span> <span class="n">F</span><span class="p">,</span> <span class="n">linbcgiterations</span><span class="p">,</span> <span class="n">planar</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Smooth a matrix U using a filter F at a specified level.</span>
|
|
|
|
<span class="sd"> This function applies a smoothing operation on the input matrix U using</span>
|
|
<span class="sd"> the filter F. It utilizes the linear Biconjugate Gradient method for the</span>
|
|
<span class="sd"> smoothing process. The number of iterations for the linear BCG method is</span>
|
|
<span class="sd"> specified by linbcgiterations, and the planar parameter indicates</span>
|
|
<span class="sd"> whether the operation is to be performed in a planar manner.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> U (numpy.ndarray): The input matrix to be smoothed.</span>
|
|
<span class="sd"> F (numpy.ndarray): The filter used for smoothing.</span>
|
|
<span class="sd"> linbcgiterations (int): The number of iterations for the linear BCG method.</span>
|
|
<span class="sd"> planar (bool): A flag indicating whether to perform the operation in a planar manner.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> None: This function modifies the input matrix U in place.</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="nb">iter</span> <span class="o">=</span> <span class="mi">0</span>
|
|
<span class="n">err</span> <span class="o">=</span> <span class="mi">0</span>
|
|
|
|
<span class="n">rows</span> <span class="o">=</span> <span class="n">U</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
|
|
<span class="n">cols</span> <span class="o">=</span> <span class="n">U</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
|
|
|
|
<span class="n">n</span> <span class="o">=</span> <span class="n">U</span><span class="o">.</span><span class="n">size</span>
|
|
|
|
<span class="n">linear_bcg</span><span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="n">F</span><span class="p">,</span> <span class="n">U</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mf">0.001</span><span class="p">,</span> <span class="n">linbcgiterations</span><span class="p">,</span> <span class="nb">iter</span><span class="p">,</span> <span class="n">err</span><span class="p">,</span> <span class="n">rows</span><span class="p">,</span> <span class="n">cols</span><span class="p">,</span> <span class="n">planar</span><span class="p">)</span></div>
|
|
|
|
|
|
|
|
<div class="viewcode-block" id="calculate_defect">
|
|
<a class="viewcode-back" href="../../autoapi/fabex/bas_relief/index.html#fabex.bas_relief.calculate_defect">[docs]</a>
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">calculate_defect</span><span class="p">(</span><span class="n">D</span><span class="p">,</span> <span class="n">U</span><span class="p">,</span> <span class="n">F</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Calculate the defect of a grid based on the input fields.</span>
|
|
|
|
<span class="sd"> This function computes the defect values for a grid by comparing the</span>
|
|
<span class="sd"> input field `F` with the values in the grid `U`. The defect is</span>
|
|
<span class="sd"> calculated using finite difference approximations, taking into account</span>
|
|
<span class="sd"> the neighboring values in the grid. The results are stored in the output</span>
|
|
<span class="sd"> array `D`, which is modified in place.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> D (ndarray): A 2D array where the defect values will be stored.</span>
|
|
<span class="sd"> U (ndarray): A 2D array representing the current state of the grid.</span>
|
|
<span class="sd"> F (ndarray): A 2D array representing the target field to compare against.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> None: The function modifies the array `D` in place and does not return a</span>
|
|
<span class="sd"> value.</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="n">sx</span> <span class="o">=</span> <span class="n">F</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
|
|
<span class="n">sy</span> <span class="o">=</span> <span class="n">F</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
|
|
|
|
<span class="n">h</span> <span class="o">=</span> <span class="mf">1.0</span> <span class="o">/</span> <span class="n">sqrt</span><span class="p">(</span><span class="n">sx</span> <span class="o">*</span> <span class="n">sy</span> <span class="o">*</span> <span class="mf">1.0</span><span class="p">)</span>
|
|
<span class="n">h2i</span> <span class="o">=</span> <span class="mf">1.0</span> <span class="o">/</span> <span class="p">(</span><span class="n">h</span> <span class="o">*</span> <span class="n">h</span><span class="p">)</span>
|
|
|
|
<span class="n">h2i</span> <span class="o">=</span> <span class="mi">1</span>
|
|
<span class="n">D</span><span class="p">[</span><span class="mi">1</span><span class="p">:</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">:</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span>
|
|
<span class="n">F</span><span class="p">[</span><span class="mi">1</span><span class="p">:</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">:</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">-</span> <span class="n">U</span><span class="p">[:</span><span class="o">-</span><span class="mi">2</span><span class="p">,</span> <span class="mi">1</span><span class="p">:</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">-</span> <span class="n">U</span><span class="p">[</span><span class="mi">2</span><span class="p">:,</span> <span class="mi">1</span><span class="p">:</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">-</span> <span class="n">U</span><span class="p">[</span><span class="mi">1</span><span class="p">:</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="p">:</span><span class="o">-</span><span class="mi">2</span><span class="p">]</span> <span class="o">-</span> <span class="n">U</span><span class="p">[</span><span class="mi">1</span><span class="p">:</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">:]</span> <span class="o">+</span> <span class="mi">4</span> <span class="o">*</span> <span class="n">U</span><span class="p">[</span><span class="mi">1</span><span class="p">:</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">:</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
|
|
<span class="p">)</span>
|
|
<span class="c1"># sides</span>
|
|
<span class="n">D</span><span class="p">[</span><span class="mi">1</span><span class="p">:</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="n">F</span><span class="p">[</span><span class="mi">1</span><span class="p">:</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">]</span> <span class="o">-</span> <span class="n">U</span><span class="p">[:</span><span class="o">-</span><span class="mi">2</span><span class="p">,</span> <span class="mi">0</span><span class="p">]</span> <span class="o">-</span> <span class="n">U</span><span class="p">[</span><span class="mi">2</span><span class="p">:,</span> <span class="mi">0</span><span class="p">]</span> <span class="o">-</span> <span class="n">U</span><span class="p">[</span><span class="mi">1</span><span class="p">:</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">]</span> <span class="o">+</span> <span class="mi">3</span> <span class="o">*</span> <span class="n">U</span><span class="p">[</span><span class="mi">1</span><span class="p">:</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">]</span>
|
|
<span class="n">D</span><span class="p">[</span><span class="mi">1</span><span class="p">:</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">F</span><span class="p">[</span><span class="mi">1</span><span class="p">:</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">-</span> <span class="n">U</span><span class="p">[:</span><span class="o">-</span><span class="mi">2</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">-</span> <span class="n">U</span><span class="p">[</span><span class="mi">2</span><span class="p">:,</span> <span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">-</span> <span class="n">U</span><span class="p">[</span><span class="mi">1</span><span class="p">:</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">2</span><span class="p">]</span> <span class="o">+</span> <span class="mi">3</span> <span class="o">*</span> <span class="n">U</span><span class="p">[</span><span class="mi">1</span><span class="p">:</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">]</span>
|
|
<span class="n">D</span><span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">:</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">F</span><span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">:</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">-</span> <span class="n">U</span><span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="p">:</span><span class="o">-</span><span class="mi">2</span><span class="p">]</span> <span class="o">-</span> <span class="n">U</span><span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="p">:</span><span class="o">-</span><span class="mi">2</span><span class="p">]</span> <span class="o">-</span> <span class="n">U</span><span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">:</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">+</span> <span class="mi">3</span> <span class="o">*</span> <span class="n">U</span><span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">:</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
|
|
<span class="n">D</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">:</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">F</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">:</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">-</span> <span class="n">U</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="p">:</span><span class="o">-</span><span class="mi">2</span><span class="p">]</span> <span class="o">-</span> <span class="n">U</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="p">:</span><span class="o">-</span><span class="mi">2</span><span class="p">]</span> <span class="o">-</span> <span class="n">U</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">:</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">+</span> <span class="mi">3</span> <span class="o">*</span> <span class="n">U</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">:</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
|
|
<span class="c1"># corners</span>
|
|
<span class="n">D</span><span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="n">F</span><span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">]</span> <span class="o">-</span> <span class="n">U</span><span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">]</span> <span class="o">-</span> <span class="n">U</span><span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">]</span> <span class="o">+</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">U</span><span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">]</span>
|
|
<span class="n">D</span><span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">F</span><span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">-</span> <span class="n">U</span><span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">-</span> <span class="n">U</span><span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="mi">2</span><span class="p">]</span> <span class="o">+</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">U</span><span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">]</span>
|
|
<span class="n">D</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="n">F</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">]</span> <span class="o">-</span> <span class="n">U</span><span class="p">[</span><span class="o">-</span><span class="mi">2</span><span class="p">,</span> <span class="mi">0</span><span class="p">]</span> <span class="o">-</span> <span class="n">U</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">]</span> <span class="o">+</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">U</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">]</span>
|
|
<span class="n">D</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">F</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">-</span> <span class="n">U</span><span class="p">[</span><span class="o">-</span><span class="mi">2</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">-</span> <span class="n">U</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">2</span><span class="p">]</span> <span class="o">+</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">U</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">]</span></div>
|
|
|
|
|
|
|
|
<div class="viewcode-block" id="add_correction">
|
|
<a class="viewcode-back" href="../../autoapi/fabex/bas_relief/index.html#fabex.bas_relief.add_correction">[docs]</a>
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">add_correction</span><span class="p">(</span><span class="n">U</span><span class="p">,</span> <span class="n">C</span><span class="p">):</span>
|
|
<span class="n">U</span> <span class="o">+=</span> <span class="n">C</span></div>
|
|
|
|
|
|
|
|
<div class="viewcode-block" id="solve_pde_multigrid">
|
|
<a class="viewcode-back" href="../../autoapi/fabex/bas_relief/index.html#fabex.bas_relief.solve_pde_multigrid">[docs]</a>
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">solve_pde_multigrid</span><span class="p">(</span>
|
|
<span class="n">F</span><span class="p">,</span> <span class="n">U</span><span class="p">,</span> <span class="n">vcycleiterations</span><span class="p">,</span> <span class="n">linbcgiterations</span><span class="p">,</span> <span class="n">smoothiterations</span><span class="p">,</span> <span class="n">mins</span><span class="p">,</span> <span class="n">levels</span><span class="p">,</span> <span class="n">useplanar</span><span class="p">,</span> <span class="n">planar</span>
|
|
<span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Solve a partial differential equation using a multigrid method.</span>
|
|
|
|
<span class="sd"> This function implements a multigrid algorithm to solve a given partial</span>
|
|
<span class="sd"> differential equation (PDE). It operates on a grid of varying</span>
|
|
<span class="sd"> resolutions, applying smoothing and correction steps iteratively to</span>
|
|
<span class="sd"> converge towards the solution. The algorithm consists of several key</span>
|
|
<span class="sd"> phases: restriction of the right-hand side to coarser grids, solving on</span>
|
|
<span class="sd"> the coarsest grid, and then interpolating corrections back to finer</span>
|
|
<span class="sd"> grids. The process is repeated for a specified number of V-cycle</span>
|
|
<span class="sd"> iterations.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> F (numpy.ndarray): The right-hand side of the PDE represented as a 2D array.</span>
|
|
<span class="sd"> U (numpy.ndarray): The initial guess for the solution, which will be updated in place.</span>
|
|
<span class="sd"> vcycleiterations (int): The number of V-cycle iterations to perform.</span>
|
|
<span class="sd"> linbcgiterations (int): The number of iterations for the linear solver used in smoothing.</span>
|
|
<span class="sd"> smoothiterations (int): The number of smoothing iterations to apply at each level.</span>
|
|
<span class="sd"> mins (int): Minimum grid size (not used in the current implementation).</span>
|
|
<span class="sd"> levels (int): The number of levels in the multigrid hierarchy.</span>
|
|
<span class="sd"> useplanar (bool): A flag indicating whether to use planar information during the solution</span>
|
|
<span class="sd"> process.</span>
|
|
<span class="sd"> planar (numpy.ndarray): A 2D array indicating planar information for the grid.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> None: The function modifies the input array U in place to contain the final</span>
|
|
<span class="sd"> solution.</span>
|
|
|
|
<span class="sd"> Note:</span>
|
|
<span class="sd"> The function assumes that the input arrays F and U have compatible</span>
|
|
<span class="sd"> shapes</span>
|
|
<span class="sd"> and that the planar array is appropriately defined for the problem</span>
|
|
<span class="sd"> context.</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="n">xmax</span> <span class="o">=</span> <span class="n">F</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
|
|
<span class="n">ymax</span> <span class="o">=</span> <span class="n">F</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
|
|
|
|
<span class="c1"># int i # index for simple loops</span>
|
|
<span class="c1"># int k # index for iterating through levels</span>
|
|
<span class="c1"># int k2 # index for iterating through levels in V-cycles</span>
|
|
|
|
<span class="c1"># 1. restrict f to coarse-grid (by the way count the number of levels)</span>
|
|
<span class="c1"># k=0: fine-grid = f</span>
|
|
<span class="c1"># k=levels: coarsest-grid</span>
|
|
<span class="c1"># pix = CB_VAL#what is this>???</span>
|
|
<span class="c1"># int cycle</span>
|
|
<span class="c1"># int sx, sy</span>
|
|
|
|
<span class="n">RHS</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="n">IU</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="n">VF</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="n">PLANAR</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="k">for</span> <span class="n">a</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">levels</span> <span class="o">+</span> <span class="mi">1</span><span class="p">):</span>
|
|
<span class="n">RHS</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="kc">None</span><span class="p">)</span>
|
|
<span class="n">IU</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="kc">None</span><span class="p">)</span>
|
|
<span class="n">VF</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="kc">None</span><span class="p">)</span>
|
|
<span class="n">PLANAR</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="kc">None</span><span class="p">)</span>
|
|
<span class="n">VF</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">zeros</span><span class="p">((</span><span class="n">xmax</span><span class="p">,</span> <span class="n">ymax</span><span class="p">),</span> <span class="n">dtype</span><span class="o">=</span><span class="n">numpy</span><span class="o">.</span><span class="n">float64</span><span class="p">)</span>
|
|
<span class="c1"># numpy.fill(pix)!? TODO</span>
|
|
|
|
<span class="n">RHS</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="n">F</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
|
|
<span class="n">IU</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="n">U</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
|
|
<span class="n">PLANAR</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="n">planar</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
|
|
|
|
<span class="n">sx</span> <span class="o">=</span> <span class="n">xmax</span>
|
|
<span class="n">sy</span> <span class="o">=</span> <span class="n">ymax</span>
|
|
<span class="c1"># print(planar)</span>
|
|
<span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">levels</span><span class="p">):</span>
|
|
<span class="c1"># calculate size of next level</span>
|
|
<span class="n">sx</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">sx</span> <span class="o">/</span> <span class="mi">2</span><span class="p">)</span>
|
|
<span class="n">sy</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">sy</span> <span class="o">/</span> <span class="mi">2</span><span class="p">)</span>
|
|
<span class="n">PLANAR</span><span class="p">[</span><span class="n">k</span> <span class="o">+</span> <span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">zeros</span><span class="p">((</span><span class="n">sx</span><span class="p">,</span> <span class="n">sy</span><span class="p">),</span> <span class="n">dtype</span><span class="o">=</span><span class="n">numpy</span><span class="o">.</span><span class="n">float64</span><span class="p">)</span>
|
|
<span class="n">RHS</span><span class="p">[</span><span class="n">k</span> <span class="o">+</span> <span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">zeros</span><span class="p">((</span><span class="n">sx</span><span class="p">,</span> <span class="n">sy</span><span class="p">),</span> <span class="n">dtype</span><span class="o">=</span><span class="n">numpy</span><span class="o">.</span><span class="n">float64</span><span class="p">)</span>
|
|
<span class="n">IU</span><span class="p">[</span><span class="n">k</span> <span class="o">+</span> <span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">zeros</span><span class="p">((</span><span class="n">sx</span><span class="p">,</span> <span class="n">sy</span><span class="p">),</span> <span class="n">dtype</span><span class="o">=</span><span class="n">numpy</span><span class="o">.</span><span class="n">float64</span><span class="p">)</span>
|
|
<span class="n">VF</span><span class="p">[</span><span class="n">k</span> <span class="o">+</span> <span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">zeros</span><span class="p">((</span><span class="n">sx</span><span class="p">,</span> <span class="n">sy</span><span class="p">),</span> <span class="n">dtype</span><span class="o">=</span><span class="n">numpy</span><span class="o">.</span><span class="n">float64</span><span class="p">)</span>
|
|
|
|
<span class="c1"># restrict from level k to level k+1 (coarser-grid)</span>
|
|
<span class="n">restrict_buffer</span><span class="p">(</span><span class="n">PLANAR</span><span class="p">[</span><span class="n">k</span><span class="p">],</span> <span class="n">PLANAR</span><span class="p">[</span><span class="n">k</span> <span class="o">+</span> <span class="mi">1</span><span class="p">])</span>
|
|
<span class="n">PLANAR</span><span class="p">[</span><span class="n">k</span> <span class="o">+</span> <span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">PLANAR</span><span class="p">[</span><span class="n">k</span> <span class="o">+</span> <span class="mi">1</span><span class="p">]</span> <span class="o">></span> <span class="mi">0</span>
|
|
<span class="c1"># numpytoimage(PLANAR[k+1],'planar')</span>
|
|
<span class="c1"># print(PLANAR[k+1])</span>
|
|
<span class="n">restrict_buffer</span><span class="p">(</span><span class="n">RHS</span><span class="p">[</span><span class="n">k</span><span class="p">],</span> <span class="n">RHS</span><span class="p">[</span><span class="n">k</span> <span class="o">+</span> <span class="mi">1</span><span class="p">])</span>
|
|
<span class="c1"># numpytoimage(RHS[k+1],'rhs')</span>
|
|
|
|
<span class="c1"># 2. find exact sollution at the coarsest-grid (k=levels)</span>
|
|
<span class="c1"># this was replaced to easify code. exact_sollution( RHS[levels], IU[levels] )</span>
|
|
<span class="n">IU</span><span class="p">[</span><span class="n">levels</span><span class="p">]</span><span class="o">.</span><span class="n">fill</span><span class="p">(</span><span class="mf">0.0</span><span class="p">)</span>
|
|
|
|
<span class="c1"># 3. nested iterations</span>
|
|
|
|
<span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">levels</span> <span class="o">-</span> <span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">):</span>
|
|
<span class="nb">print</span><span class="p">(</span><span class="s2">"K:"</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="n">k</span><span class="p">))</span>
|
|
|
|
<span class="c1"># 4. interpolate sollution from last coarse-grid to finer-grid</span>
|
|
<span class="c1"># interpolate from level k+1 to level k (finer-grid)</span>
|
|
<span class="n">prolongate</span><span class="p">(</span><span class="n">IU</span><span class="p">[</span><span class="n">k</span> <span class="o">+</span> <span class="mi">1</span><span class="p">],</span> <span class="n">IU</span><span class="p">[</span><span class="n">k</span><span class="p">])</span>
|
|
<span class="c1"># print('k',k)</span>
|
|
<span class="c1"># 4.1. first target function is the equation target function</span>
|
|
<span class="c1"># (following target functions are the defect)</span>
|
|
<span class="n">copy_compbuf_data</span><span class="p">(</span><span class="n">RHS</span><span class="p">[</span><span class="n">k</span><span class="p">],</span> <span class="n">VF</span><span class="p">[</span><span class="n">k</span><span class="p">])</span>
|
|
|
|
<span class="c1"># print('lanar ')</span>
|
|
|
|
<span class="c1"># 5. V-cycle (twice repeated)</span>
|
|
|
|
<span class="k">for</span> <span class="n">cycle</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">vcycleiterations</span><span class="p">):</span>
|
|
<span class="nb">print</span><span class="p">(</span><span class="s2">"v-cycle iteration:"</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="n">cycle</span><span class="p">))</span>
|
|
|
|
<span class="c1"># 6. downward stroke of V</span>
|
|
<span class="k">for</span> <span class="n">k2</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">k</span><span class="p">,</span> <span class="n">levels</span><span class="p">):</span>
|
|
<span class="c1"># 7. pre-smoothing of initial sollution using target function</span>
|
|
<span class="c1"># zero for initial guess at smoothing</span>
|
|
<span class="c1"># (except for level k when iu contains prolongated result)</span>
|
|
<span class="k">if</span> <span class="n">k2</span> <span class="o">!=</span> <span class="n">k</span><span class="p">:</span>
|
|
<span class="n">IU</span><span class="p">[</span><span class="n">k2</span><span class="p">]</span><span class="o">.</span><span class="n">fill</span><span class="p">(</span><span class="mf">0.0</span><span class="p">)</span>
|
|
|
|
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">smoothiterations</span><span class="p">):</span>
|
|
<span class="n">smooth</span><span class="p">(</span><span class="n">IU</span><span class="p">[</span><span class="n">k2</span><span class="p">],</span> <span class="n">VF</span><span class="p">[</span><span class="n">k2</span><span class="p">],</span> <span class="n">linbcgiterations</span><span class="p">,</span> <span class="n">PLANAR</span><span class="p">[</span><span class="n">k2</span><span class="p">])</span>
|
|
|
|
<span class="c1"># 8. calculate defect at level</span>
|
|
<span class="c1"># d[k2] = Lh * ~u[k2] - f[k2]</span>
|
|
|
|
<span class="n">D</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">zeros_like</span><span class="p">(</span><span class="n">IU</span><span class="p">[</span><span class="n">k2</span><span class="p">])</span>
|
|
<span class="c1"># if k2==0:</span>
|
|
<span class="c1"># IU[k2][planar[k2]]=IU[k2].max()</span>
|
|
<span class="c1"># print(IU[0])</span>
|
|
<span class="k">if</span> <span class="n">useplanar</span> <span class="ow">and</span> <span class="n">k2</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="n">IU</span><span class="p">[</span><span class="n">k2</span><span class="p">][</span><span class="n">PLANAR</span><span class="p">[</span><span class="n">k2</span><span class="p">]]</span> <span class="o">=</span> <span class="n">IU</span><span class="p">[</span><span class="n">k2</span><span class="p">]</span><span class="o">.</span><span class="n">min</span><span class="p">()</span>
|
|
<span class="c1"># if k2==0 :</span>
|
|
|
|
<span class="c1"># VF[k2][PLANAR[k2]]=0.0</span>
|
|
<span class="c1"># print(IU[0])</span>
|
|
<span class="n">calculate_defect</span><span class="p">(</span><span class="n">D</span><span class="p">,</span> <span class="n">IU</span><span class="p">[</span><span class="n">k2</span><span class="p">],</span> <span class="n">VF</span><span class="p">[</span><span class="n">k2</span><span class="p">])</span>
|
|
|
|
<span class="c1"># 9. restrict deffect as target function for next coarser-grid</span>
|
|
<span class="c1"># def -> f[k2+1]</span>
|
|
<span class="n">restrict_buffer</span><span class="p">(</span><span class="n">D</span><span class="p">,</span> <span class="n">VF</span><span class="p">[</span><span class="n">k2</span> <span class="o">+</span> <span class="mi">1</span><span class="p">])</span>
|
|
|
|
<span class="c1"># 10. solve on coarsest-grid (target function is the deffect)</span>
|
|
<span class="c1"># iu[levels] should contain sollution for</span>
|
|
<span class="c1"># the f[levels] - last deffect, iu will now be the correction</span>
|
|
<span class="n">IU</span><span class="p">[</span><span class="n">levels</span><span class="p">]</span><span class="o">.</span><span class="n">fill</span><span class="p">(</span><span class="mf">0.0</span><span class="p">)</span> <span class="c1"># exact_sollution(VF[levels], IU[levels] )</span>
|
|
|
|
<span class="c1"># 11. upward stroke of V</span>
|
|
<span class="k">for</span> <span class="n">k2</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">levels</span> <span class="o">-</span> <span class="mi">1</span><span class="p">,</span> <span class="n">k</span> <span class="o">-</span> <span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">):</span>
|
|
<span class="nb">print</span><span class="p">(</span><span class="s2">"k2: "</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="n">k2</span><span class="p">))</span>
|
|
<span class="c1"># 12. interpolate correction from last coarser-grid to finer-grid</span>
|
|
<span class="c1"># iu[k2+1] -> cor</span>
|
|
<span class="n">C</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">zeros_like</span><span class="p">(</span><span class="n">IU</span><span class="p">[</span><span class="n">k2</span><span class="p">])</span>
|
|
<span class="n">prolongate</span><span class="p">(</span><span class="n">IU</span><span class="p">[</span><span class="n">k2</span> <span class="o">+</span> <span class="mi">1</span><span class="p">],</span> <span class="n">C</span><span class="p">)</span>
|
|
|
|
<span class="c1"># 13. add interpolated correction to initial sollution at level k2</span>
|
|
<span class="n">add_correction</span><span class="p">(</span><span class="n">IU</span><span class="p">[</span><span class="n">k2</span><span class="p">],</span> <span class="n">C</span><span class="p">)</span>
|
|
|
|
<span class="c1"># 14. post-smoothing of current sollution using target function</span>
|
|
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">smoothiterations</span><span class="p">):</span>
|
|
<span class="n">smooth</span><span class="p">(</span><span class="n">IU</span><span class="p">[</span><span class="n">k2</span><span class="p">],</span> <span class="n">VF</span><span class="p">[</span><span class="n">k2</span><span class="p">],</span> <span class="n">linbcgiterations</span><span class="p">,</span> <span class="n">PLANAR</span><span class="p">[</span><span class="n">k2</span><span class="p">])</span>
|
|
|
|
<span class="k">if</span> <span class="n">useplanar</span> <span class="ow">and</span> <span class="n">k2</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="n">IU</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="n">planar</span><span class="p">]</span> <span class="o">=</span> <span class="n">IU</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">min</span><span class="p">()</span>
|
|
<span class="c1"># print(IU[0])</span>
|
|
|
|
<span class="c1"># --- end of V-cycle</span>
|
|
|
|
<span class="c1"># --- end of nested iteration</span>
|
|
|
|
<span class="c1"># 15. final sollution</span>
|
|
<span class="c1"># IU[0] contains the final sollution</span>
|
|
|
|
<span class="n">U</span><span class="p">[:]</span> <span class="o">=</span> <span class="n">IU</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span></div>
|
|
|
|
|
|
|
|
<div class="viewcode-block" id="asolve">
|
|
<a class="viewcode-back" href="../../autoapi/fabex/bas_relief/index.html#fabex.bas_relief.asolve">[docs]</a>
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">asolve</span><span class="p">(</span><span class="n">b</span><span class="p">,</span> <span class="n">x</span><span class="p">):</span>
|
|
<span class="n">x</span><span class="p">[:]</span> <span class="o">=</span> <span class="o">-</span><span class="mi">4</span> <span class="o">*</span> <span class="n">b</span></div>
|
|
|
|
|
|
|
|
<div class="viewcode-block" id="atimes">
|
|
<a class="viewcode-back" href="../../autoapi/fabex/bas_relief/index.html#fabex.bas_relief.atimes">[docs]</a>
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">atimes</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">res</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Apply a discrete Laplacian operator to a 2D array.</span>
|
|
|
|
<span class="sd"> This function computes the discrete Laplacian of a given 2D array `x`</span>
|
|
<span class="sd"> and stores the result in the `res` array. The Laplacian is calculated</span>
|
|
<span class="sd"> using finite difference methods, which involve summing the values of</span>
|
|
<span class="sd"> neighboring elements and applying specific boundary conditions for the</span>
|
|
<span class="sd"> edges and corners of the array.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> x (numpy.ndarray): A 2D array representing the input values.</span>
|
|
<span class="sd"> res (numpy.ndarray): A 2D array where the result will be stored. It must have the same shape</span>
|
|
<span class="sd"> as `x`.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> None: The result is stored directly in the `res` array.</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="n">res</span><span class="p">[</span><span class="mi">1</span><span class="p">:</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">:</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">x</span><span class="p">[:</span><span class="o">-</span><span class="mi">2</span><span class="p">,</span> <span class="mi">1</span><span class="p">:</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">+</span> <span class="n">x</span><span class="p">[</span><span class="mi">2</span><span class="p">:,</span> <span class="mi">1</span><span class="p">:</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">+</span> <span class="n">x</span><span class="p">[</span><span class="mi">1</span><span class="p">:</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="p">:</span><span class="o">-</span><span class="mi">2</span><span class="p">]</span> <span class="o">+</span> <span class="n">x</span><span class="p">[</span><span class="mi">1</span><span class="p">:</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">:]</span> <span class="o">-</span> <span class="mi">4</span> <span class="o">*</span> <span class="n">x</span><span class="p">[</span><span class="mi">1</span><span class="p">:</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">:</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
|
|
<span class="c1"># sides</span>
|
|
<span class="n">res</span><span class="p">[</span><span class="mi">1</span><span class="p">:</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">:</span><span class="o">-</span><span class="mi">2</span><span class="p">,</span> <span class="mi">0</span><span class="p">]</span> <span class="o">+</span> <span class="n">x</span><span class="p">[</span><span class="mi">2</span><span class="p">:,</span> <span class="mi">0</span><span class="p">]</span> <span class="o">+</span> <span class="n">x</span><span class="p">[</span><span class="mi">1</span><span class="p">:</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">]</span> <span class="o">-</span> <span class="mi">3</span> <span class="o">*</span> <span class="n">x</span><span class="p">[</span><span class="mi">1</span><span class="p">:</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">]</span>
|
|
<span class="n">res</span><span class="p">[</span><span class="mi">1</span><span class="p">:</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">:</span><span class="o">-</span><span class="mi">2</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">+</span> <span class="n">x</span><span class="p">[</span><span class="mi">2</span><span class="p">:,</span> <span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">+</span> <span class="n">x</span><span class="p">[</span><span class="mi">1</span><span class="p">:</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">2</span><span class="p">]</span> <span class="o">-</span> <span class="mi">3</span> <span class="o">*</span> <span class="n">x</span><span class="p">[</span><span class="mi">1</span><span class="p">:</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">]</span>
|
|
<span class="n">res</span><span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">:</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="p">:</span><span class="o">-</span><span class="mi">2</span><span class="p">]</span> <span class="o">+</span> <span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">2</span><span class="p">:]</span> <span class="o">+</span> <span class="n">x</span><span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">:</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">-</span> <span class="mi">3</span> <span class="o">*</span> <span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">:</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
|
|
<span class="n">res</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">:</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">x</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="p">:</span><span class="o">-</span><span class="mi">2</span><span class="p">]</span> <span class="o">+</span> <span class="n">x</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">:]</span> <span class="o">+</span> <span class="n">x</span><span class="p">[</span><span class="o">-</span><span class="mi">2</span><span class="p">,</span> <span class="mi">1</span><span class="p">:</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">-</span> <span class="mi">3</span> <span class="o">*</span> <span class="n">x</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">:</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
|
|
<span class="c1"># corners</span>
|
|
<span class="n">res</span><span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="n">x</span><span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">]</span> <span class="o">+</span> <span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">]</span> <span class="o">-</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">]</span>
|
|
<span class="n">res</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="n">x</span><span class="p">[</span><span class="o">-</span><span class="mi">2</span><span class="p">,</span> <span class="mi">0</span><span class="p">]</span> <span class="o">+</span> <span class="n">x</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">]</span> <span class="o">-</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">x</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">]</span>
|
|
<span class="n">res</span><span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="mi">2</span><span class="p">]</span> <span class="o">+</span> <span class="n">x</span><span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">-</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">]</span>
|
|
<span class="n">res</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">x</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">2</span><span class="p">]</span> <span class="o">+</span> <span class="n">x</span><span class="p">[</span><span class="o">-</span><span class="mi">2</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">-</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">x</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">]</span></div>
|
|
|
|
|
|
|
|
<div class="viewcode-block" id="snrm">
|
|
<a class="viewcode-back" href="../../autoapi/fabex/bas_relief/index.html#fabex.bas_relief.snrm">[docs]</a>
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">snrm</span><span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="n">sx</span><span class="p">,</span> <span class="n">itol</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Calculate the square root of the sum of squares or the maximum absolute</span>
|
|
<span class="sd"> value.</span>
|
|
|
|
<span class="sd"> This function computes a value based on the input parameters. If the</span>
|
|
<span class="sd"> tolerance level (itol) is less than or equal to 3, it calculates the</span>
|
|
<span class="sd"> square root of the sum of squares of the input array (sx). If the</span>
|
|
<span class="sd"> tolerance level is greater than 3, it returns the maximum absolute value</span>
|
|
<span class="sd"> from the input array.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> n (int): An integer parameter, though it is not used in the current</span>
|
|
<span class="sd"> implementation.</span>
|
|
<span class="sd"> sx (numpy.ndarray): A numpy array of numeric values.</span>
|
|
<span class="sd"> itol (int): An integer that determines which calculation to perform.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> float: The square root of the sum of squares if itol <= 3, otherwise the</span>
|
|
<span class="sd"> maximum absolute value.</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="k">if</span> <span class="n">itol</span> <span class="o"><=</span> <span class="mi">3</span><span class="p">:</span>
|
|
<span class="n">temp</span> <span class="o">=</span> <span class="n">sx</span> <span class="o">*</span> <span class="n">sx</span>
|
|
<span class="n">ans</span> <span class="o">=</span> <span class="n">temp</span><span class="o">.</span><span class="n">sum</span><span class="p">()</span>
|
|
<span class="k">return</span> <span class="n">sqrt</span><span class="p">(</span><span class="n">ans</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">temp</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">abs</span><span class="p">(</span><span class="n">sx</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">temp</span><span class="o">.</span><span class="n">max</span><span class="p">()</span></div>
|
|
|
|
|
|
|
|
<div class="viewcode-block" id="linear_bcg">
|
|
<a class="viewcode-back" href="../../autoapi/fabex/bas_relief/index.html#fabex.bas_relief.linear_bcg">[docs]</a>
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">linear_bcg</span><span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">itol</span><span class="p">,</span> <span class="n">tol</span><span class="p">,</span> <span class="n">itmax</span><span class="p">,</span> <span class="nb">iter</span><span class="p">,</span> <span class="n">err</span><span class="p">,</span> <span class="n">rows</span><span class="p">,</span> <span class="n">cols</span><span class="p">,</span> <span class="n">planar</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Solve a linear system using the Biconjugate Gradient Method.</span>
|
|
|
|
<span class="sd"> This function implements the Biconjugate Gradient Method as described in</span>
|
|
<span class="sd"> Numerical Recipes in C. It iteratively refines the solution to a linear</span>
|
|
<span class="sd"> system of equations defined by the matrix-vector product. The method is</span>
|
|
<span class="sd"> particularly useful for large, sparse systems where direct methods are</span>
|
|
<span class="sd"> inefficient. The function takes various parameters to control the</span>
|
|
<span class="sd"> iteration process and convergence criteria.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> n (int): The size of the linear system.</span>
|
|
<span class="sd"> b (numpy.ndarray): The right-hand side vector of the linear system.</span>
|
|
<span class="sd"> x (numpy.ndarray): The initial guess for the solution vector.</span>
|
|
<span class="sd"> itol (int): The type of norm to use for convergence checks.</span>
|
|
<span class="sd"> tol (float): The tolerance for convergence.</span>
|
|
<span class="sd"> itmax (int): The maximum number of iterations allowed.</span>
|
|
<span class="sd"> iter (int): The current iteration count (should be initialized to 0).</span>
|
|
<span class="sd"> err (float): The error estimate (should be initialized).</span>
|
|
<span class="sd"> rows (int): The number of rows in the matrix.</span>
|
|
<span class="sd"> cols (int): The number of columns in the matrix.</span>
|
|
<span class="sd"> planar (bool): A flag indicating if the problem is planar.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> None: The solution is stored in the input array `x`.</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="n">p</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">zeros</span><span class="p">((</span><span class="n">cols</span><span class="p">,</span> <span class="n">rows</span><span class="p">))</span>
|
|
<span class="n">pp</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">zeros</span><span class="p">((</span><span class="n">cols</span><span class="p">,</span> <span class="n">rows</span><span class="p">))</span>
|
|
<span class="n">r</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">zeros</span><span class="p">((</span><span class="n">cols</span><span class="p">,</span> <span class="n">rows</span><span class="p">))</span>
|
|
<span class="n">rr</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">zeros</span><span class="p">((</span><span class="n">cols</span><span class="p">,</span> <span class="n">rows</span><span class="p">))</span>
|
|
<span class="n">z</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">zeros</span><span class="p">((</span><span class="n">cols</span><span class="p">,</span> <span class="n">rows</span><span class="p">))</span>
|
|
<span class="n">zz</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">zeros</span><span class="p">((</span><span class="n">cols</span><span class="p">,</span> <span class="n">rows</span><span class="p">))</span>
|
|
|
|
<span class="nb">iter</span> <span class="o">=</span> <span class="mi">0</span>
|
|
<span class="n">atimes</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">r</span><span class="p">)</span>
|
|
<span class="n">r</span><span class="p">[:]</span> <span class="o">=</span> <span class="n">b</span> <span class="o">-</span> <span class="n">r</span>
|
|
<span class="n">rr</span><span class="p">[:]</span> <span class="o">=</span> <span class="n">r</span>
|
|
|
|
<span class="n">atimes</span><span class="p">(</span><span class="n">r</span><span class="p">,</span> <span class="n">rr</span><span class="p">)</span> <span class="c1"># minimum residual</span>
|
|
|
|
<span class="n">znrm</span> <span class="o">=</span> <span class="mf">1.0</span>
|
|
|
|
<span class="k">if</span> <span class="n">itol</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
|
|
<span class="n">bnrm</span> <span class="o">=</span> <span class="n">snrm</span><span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">itol</span><span class="p">)</span>
|
|
|
|
<span class="k">elif</span> <span class="n">itol</span> <span class="o">==</span> <span class="mi">2</span><span class="p">:</span>
|
|
<span class="n">asolve</span><span class="p">(</span><span class="n">b</span><span class="p">,</span> <span class="n">z</span><span class="p">)</span>
|
|
<span class="n">bnrm</span> <span class="o">=</span> <span class="n">snrm</span><span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="n">z</span><span class="p">,</span> <span class="n">itol</span><span class="p">)</span>
|
|
|
|
<span class="k">elif</span> <span class="n">itol</span> <span class="o">==</span> <span class="mi">3</span> <span class="ow">or</span> <span class="n">itol</span> <span class="o">==</span> <span class="mi">4</span><span class="p">:</span>
|
|
<span class="n">asolve</span><span class="p">(</span><span class="n">b</span><span class="p">,</span> <span class="n">z</span><span class="p">)</span>
|
|
<span class="n">bnrm</span> <span class="o">=</span> <span class="n">snrm</span><span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="n">z</span><span class="p">,</span> <span class="n">itol</span><span class="p">)</span>
|
|
<span class="n">asolve</span><span class="p">(</span><span class="n">r</span><span class="p">,</span> <span class="n">z</span><span class="p">)</span>
|
|
<span class="n">znrm</span> <span class="o">=</span> <span class="n">snrm</span><span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="n">z</span><span class="p">,</span> <span class="n">itol</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="nb">print</span><span class="p">(</span><span class="s2">"illegal itol in linbcg"</span><span class="p">)</span>
|
|
|
|
<span class="n">asolve</span><span class="p">(</span><span class="n">r</span><span class="p">,</span> <span class="n">z</span><span class="p">)</span>
|
|
|
|
<span class="k">while</span> <span class="nb">iter</span> <span class="o"><=</span> <span class="n">itmax</span><span class="p">:</span>
|
|
<span class="nb">iter</span> <span class="o">+=</span> <span class="mi">1</span>
|
|
<span class="n">zm1nrm</span> <span class="o">=</span> <span class="n">znrm</span>
|
|
<span class="n">asolve</span><span class="p">(</span><span class="n">rr</span><span class="p">,</span> <span class="n">zz</span><span class="p">)</span>
|
|
|
|
<span class="n">bknum</span> <span class="o">=</span> <span class="mf">0.0</span>
|
|
|
|
<span class="n">temp</span> <span class="o">=</span> <span class="n">z</span> <span class="o">*</span> <span class="n">rr</span>
|
|
|
|
<span class="n">bknum</span> <span class="o">=</span> <span class="n">temp</span><span class="o">.</span><span class="n">sum</span><span class="p">()</span> <span class="c1"># -z[0]*rr[0]????</span>
|
|
|
|
<span class="k">if</span> <span class="nb">iter</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
|
|
<span class="n">p</span><span class="p">[:]</span> <span class="o">=</span> <span class="n">z</span>
|
|
<span class="n">pp</span><span class="p">[:]</span> <span class="o">=</span> <span class="n">zz</span>
|
|
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">bk</span> <span class="o">=</span> <span class="n">bknum</span> <span class="o">/</span> <span class="n">bkden</span>
|
|
<span class="n">p</span> <span class="o">=</span> <span class="n">bk</span> <span class="o">*</span> <span class="n">p</span> <span class="o">+</span> <span class="n">z</span>
|
|
<span class="n">pp</span> <span class="o">=</span> <span class="n">bk</span> <span class="o">*</span> <span class="n">pp</span> <span class="o">+</span> <span class="n">zz</span>
|
|
<span class="n">bkden</span> <span class="o">=</span> <span class="n">bknum</span>
|
|
<span class="n">atimes</span><span class="p">(</span><span class="n">p</span><span class="p">,</span> <span class="n">z</span><span class="p">)</span>
|
|
<span class="n">temp</span> <span class="o">=</span> <span class="n">z</span> <span class="o">*</span> <span class="n">pp</span>
|
|
<span class="n">akden</span> <span class="o">=</span> <span class="n">temp</span><span class="o">.</span><span class="n">sum</span><span class="p">()</span>
|
|
<span class="n">ak</span> <span class="o">=</span> <span class="n">bknum</span> <span class="o">/</span> <span class="n">akden</span>
|
|
<span class="n">atimes</span><span class="p">(</span><span class="n">pp</span><span class="p">,</span> <span class="n">zz</span><span class="p">)</span>
|
|
|
|
<span class="n">x</span> <span class="o">+=</span> <span class="n">ak</span> <span class="o">*</span> <span class="n">p</span>
|
|
<span class="n">r</span> <span class="o">-=</span> <span class="n">ak</span> <span class="o">*</span> <span class="n">z</span>
|
|
<span class="n">rr</span> <span class="o">-=</span> <span class="n">ak</span> <span class="o">*</span> <span class="n">zz</span>
|
|
|
|
<span class="n">asolve</span><span class="p">(</span><span class="n">r</span><span class="p">,</span> <span class="n">z</span><span class="p">)</span>
|
|
|
|
<span class="k">if</span> <span class="n">itol</span> <span class="o">==</span> <span class="mi">1</span> <span class="ow">or</span> <span class="n">itol</span> <span class="o">==</span> <span class="mi">2</span><span class="p">:</span>
|
|
<span class="n">znrm</span> <span class="o">=</span> <span class="mf">1.0</span>
|
|
<span class="n">err</span> <span class="o">=</span> <span class="n">snrm</span><span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="n">r</span><span class="p">,</span> <span class="n">itol</span><span class="p">)</span> <span class="o">/</span> <span class="n">bnrm</span>
|
|
<span class="k">elif</span> <span class="n">itol</span> <span class="o">==</span> <span class="mi">3</span> <span class="ow">or</span> <span class="n">itol</span> <span class="o">==</span> <span class="mi">4</span><span class="p">:</span>
|
|
<span class="n">znrm</span> <span class="o">=</span> <span class="n">snrm</span><span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="n">z</span><span class="p">,</span> <span class="n">itol</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="nb">abs</span><span class="p">(</span><span class="n">zm1nrm</span> <span class="o">-</span> <span class="n">znrm</span><span class="p">)</span> <span class="o">></span> <span class="n">EPS</span> <span class="o">*</span> <span class="n">znrm</span><span class="p">:</span>
|
|
<span class="n">dxnrm</span> <span class="o">=</span> <span class="nb">abs</span><span class="p">(</span><span class="n">ak</span><span class="p">)</span> <span class="o">*</span> <span class="n">snrm</span><span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="n">p</span><span class="p">,</span> <span class="n">itol</span><span class="p">)</span>
|
|
<span class="n">err</span> <span class="o">=</span> <span class="n">znrm</span> <span class="o">/</span> <span class="nb">abs</span><span class="p">(</span><span class="n">zm1nrm</span> <span class="o">-</span> <span class="n">znrm</span><span class="p">)</span> <span class="o">*</span> <span class="n">dxnrm</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">err</span> <span class="o">=</span> <span class="n">znrm</span> <span class="o">/</span> <span class="n">bnrm</span>
|
|
<span class="k">continue</span>
|
|
<span class="n">xnrm</span> <span class="o">=</span> <span class="n">snrm</span><span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">itol</span><span class="p">)</span>
|
|
|
|
<span class="k">if</span> <span class="n">err</span> <span class="o"><=</span> <span class="mf">0.5</span> <span class="o">*</span> <span class="n">xnrm</span><span class="p">:</span>
|
|
<span class="n">err</span> <span class="o">/=</span> <span class="n">xnrm</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">err</span> <span class="o">=</span> <span class="n">znrm</span> <span class="o">/</span> <span class="n">bnrm</span>
|
|
<span class="k">continue</span>
|
|
<span class="k">if</span> <span class="n">err</span> <span class="o"><=</span> <span class="n">tol</span><span class="p">:</span>
|
|
<span class="k">break</span></div>
|
|
|
|
|
|
|
|
<div class="viewcode-block" id="tonemap">
|
|
<a class="viewcode-back" href="../../autoapi/fabex/bas_relief/index.html#fabex.bas_relief.tonemap">[docs]</a>
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">tonemap</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">exponent</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Apply tone mapping to an image array.</span>
|
|
|
|
<span class="sd"> This function performs tone mapping on the input image array by first</span>
|
|
<span class="sd"> filtering out values that are excessively high, which may indicate that</span>
|
|
<span class="sd"> the depth buffer was not written correctly. It then normalizes the</span>
|
|
<span class="sd"> values between the minimum and maximum heights, and finally applies an</span>
|
|
<span class="sd"> exponentiation to adjust the brightness of the image.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> i (numpy.ndarray): A numpy array representing the image data.</span>
|
|
<span class="sd"> exponent (float): The exponent used for adjusting the brightness</span>
|
|
<span class="sd"> of the normalized image.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> None: The function modifies the input array in place.</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="c1"># if depth buffer never got written it gets set</span>
|
|
<span class="c1"># to a great big value (10000000000.0)</span>
|
|
<span class="c1"># filter out anything within an order of magnitude of it</span>
|
|
<span class="c1"># so we only have things that are actually drawn</span>
|
|
<span class="n">maxheight</span> <span class="o">=</span> <span class="n">i</span><span class="o">.</span><span class="n">max</span><span class="p">(</span><span class="n">where</span><span class="o">=</span><span class="n">i</span> <span class="o"><</span> <span class="mf">1000000000.0</span><span class="p">,</span> <span class="n">initial</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
|
|
<span class="n">minheight</span> <span class="o">=</span> <span class="n">i</span><span class="o">.</span><span class="n">min</span><span class="p">()</span>
|
|
<span class="n">i</span><span class="p">[:]</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">clip</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">minheight</span><span class="p">,</span> <span class="n">maxheight</span><span class="p">)</span>
|
|
|
|
<span class="n">i</span><span class="p">[:]</span> <span class="o">=</span> <span class="p">((</span><span class="n">i</span> <span class="o">-</span> <span class="n">minheight</span><span class="p">))</span> <span class="o">/</span> <span class="p">(</span><span class="n">maxheight</span> <span class="o">-</span> <span class="n">minheight</span><span class="p">)</span>
|
|
<span class="n">i</span><span class="p">[:]</span> <span class="o">**=</span> <span class="n">exponent</span></div>
|
|
|
|
|
|
|
|
<div class="viewcode-block" id="vert">
|
|
<a class="viewcode-back" href="../../autoapi/fabex/bas_relief/index.html#fabex.bas_relief.vert">[docs]</a>
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">vert</span><span class="p">(</span><span class="n">column</span><span class="p">,</span> <span class="n">row</span><span class="p">,</span> <span class="n">z</span><span class="p">,</span> <span class="n">XYscaling</span><span class="p">,</span> <span class="n">Zscaling</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Create a single vertex in 3D space.</span>
|
|
|
|
<span class="sd"> This function calculates the 3D coordinates of a vertex based on the</span>
|
|
<span class="sd"> provided column and row values, as well as scaling factors for the X-Y</span>
|
|
<span class="sd"> and Z dimensions. The resulting coordinates are scaled accordingly to</span>
|
|
<span class="sd"> fit within a specified 3D space.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> column (float): The column value representing the X coordinate.</span>
|
|
<span class="sd"> row (float): The row value representing the Y coordinate.</span>
|
|
<span class="sd"> z (float): The Z coordinate value.</span>
|
|
<span class="sd"> XYscaling (float): The scaling factor for the X and Y coordinates.</span>
|
|
<span class="sd"> Zscaling (float): The scaling factor for the Z coordinate.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> tuple: A tuple containing the scaled X, Y, and Z coordinates.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">return</span> <span class="n">column</span> <span class="o">*</span> <span class="n">XYscaling</span><span class="p">,</span> <span class="n">row</span> <span class="o">*</span> <span class="n">XYscaling</span><span class="p">,</span> <span class="n">z</span> <span class="o">*</span> <span class="n">Zscaling</span></div>
|
|
|
|
|
|
|
|
<div class="viewcode-block" id="build_mesh">
|
|
<a class="viewcode-back" href="../../autoapi/fabex/bas_relief/index.html#fabex.bas_relief.build_mesh">[docs]</a>
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">build_mesh</span><span class="p">(</span><span class="n">mesh_z</span><span class="p">,</span> <span class="n">br</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Build a 3D mesh from a height map and apply transformations.</span>
|
|
|
|
<span class="sd"> This function constructs a 3D mesh based on the provided height map</span>
|
|
<span class="sd"> (mesh_z) and applies various transformations such as scaling and</span>
|
|
<span class="sd"> positioning based on the parameters defined in the br object. It first</span>
|
|
<span class="sd"> removes any existing BasReliefMesh objects from the scene, then creates</span>
|
|
<span class="sd"> a new mesh from the height data, and finally applies decimation if the</span>
|
|
<span class="sd"> specified ratio is within acceptable limits.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> mesh_z (numpy.ndarray): A 2D array representing the height values</span>
|
|
<span class="sd"> for the mesh vertices.</span>
|
|
<span class="sd"> br (object): An object containing properties for width, height,</span>
|
|
<span class="sd"> thickness, justification, and decimation ratio.</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="k">global</span> <span class="n">rows</span>
|
|
<span class="k">global</span> <span class="n">size</span>
|
|
<span class="n">scale</span> <span class="o">=</span> <span class="mi">1</span>
|
|
<span class="n">scalez</span> <span class="o">=</span> <span class="mi">1</span>
|
|
<span class="n">decimateRatio</span> <span class="o">=</span> <span class="n">br</span><span class="o">.</span><span class="n">decimate_ratio</span> <span class="c1"># get variable from interactive table</span>
|
|
<span class="n">bpy</span><span class="o">.</span><span class="n">ops</span><span class="o">.</span><span class="n">object</span><span class="o">.</span><span class="n">select_all</span><span class="p">(</span><span class="n">action</span><span class="o">=</span><span class="s2">"DESELECT"</span><span class="p">)</span>
|
|
<span class="k">for</span> <span class="nb">object</span> <span class="ow">in</span> <span class="n">bpy</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">objects</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="n">re</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="s2">"BasReliefMesh"</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="nb">object</span><span class="p">)):</span>
|
|
<span class="n">bpy</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="nb">object</span><span class="p">)</span>
|
|
<span class="nb">print</span><span class="p">(</span><span class="s2">"old basrelief removed"</span><span class="p">)</span>
|
|
|
|
<span class="nb">print</span><span class="p">(</span><span class="s2">"Building Mesh"</span><span class="p">)</span>
|
|
<span class="n">numY</span> <span class="o">=</span> <span class="n">mesh_z</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
|
|
<span class="n">numX</span> <span class="o">=</span> <span class="n">mesh_z</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
|
|
<span class="nb">print</span><span class="p">(</span><span class="n">numX</span><span class="p">,</span> <span class="n">numY</span><span class="p">)</span>
|
|
|
|
<span class="n">verts</span> <span class="o">=</span> <span class="nb">list</span><span class="p">()</span>
|
|
<span class="n">faces</span> <span class="o">=</span> <span class="nb">list</span><span class="p">()</span>
|
|
|
|
<span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">row</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">mesh_z</span><span class="p">):</span>
|
|
<span class="k">for</span> <span class="n">j</span><span class="p">,</span> <span class="n">col</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">row</span><span class="p">):</span>
|
|
<span class="n">verts</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">vert</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">,</span> <span class="n">col</span><span class="p">,</span> <span class="n">scale</span><span class="p">,</span> <span class="n">scalez</span><span class="p">))</span>
|
|
|
|
<span class="n">count</span> <span class="o">=</span> <span class="mi">0</span>
|
|
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">numY</span> <span class="o">*</span> <span class="p">(</span><span class="n">numX</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)):</span>
|
|
<span class="k">if</span> <span class="n">count</span> <span class="o"><</span> <span class="n">numY</span> <span class="o">-</span> <span class="mi">1</span><span class="p">:</span>
|
|
<span class="n">A</span> <span class="o">=</span> <span class="n">i</span> <span class="c1"># the first vertex</span>
|
|
<span class="n">B</span> <span class="o">=</span> <span class="n">i</span> <span class="o">+</span> <span class="mi">1</span> <span class="c1"># the second vertex</span>
|
|
<span class="n">C</span> <span class="o">=</span> <span class="p">(</span><span class="n">i</span> <span class="o">+</span> <span class="n">numY</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span> <span class="c1"># the third vertex</span>
|
|
<span class="n">D</span> <span class="o">=</span> <span class="n">i</span> <span class="o">+</span> <span class="n">numY</span> <span class="c1"># the fourth vertex</span>
|
|
|
|
<span class="n">face</span> <span class="o">=</span> <span class="p">(</span><span class="n">A</span><span class="p">,</span> <span class="n">B</span><span class="p">,</span> <span class="n">C</span><span class="p">,</span> <span class="n">D</span><span class="p">)</span>
|
|
<span class="n">faces</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">face</span><span class="p">)</span>
|
|
<span class="n">count</span> <span class="o">=</span> <span class="n">count</span> <span class="o">+</span> <span class="mi">1</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">count</span> <span class="o">=</span> <span class="mi">0</span>
|
|
|
|
<span class="c1"># Create Mesh Datablock</span>
|
|
<span class="n">mesh</span> <span class="o">=</span> <span class="n">bpy</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">meshes</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="s2">"displacement"</span><span class="p">)</span>
|
|
<span class="n">mesh</span><span class="o">.</span><span class="n">from_pydata</span><span class="p">(</span><span class="n">verts</span><span class="p">,</span> <span class="p">[],</span> <span class="n">faces</span><span class="p">)</span>
|
|
|
|
<span class="n">mesh</span><span class="o">.</span><span class="n">update</span><span class="p">()</span>
|
|
|
|
<span class="c1"># make object from mesh</span>
|
|
<span class="n">new_object</span> <span class="o">=</span> <span class="n">bpy</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="s2">"BasReliefMesh"</span><span class="p">,</span> <span class="n">mesh</span><span class="p">)</span>
|
|
<span class="n">scene</span> <span class="o">=</span> <span class="n">bpy</span><span class="o">.</span><span class="n">context</span><span class="o">.</span><span class="n">scene</span>
|
|
<span class="n">scene</span><span class="o">.</span><span class="n">collection</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">link</span><span class="p">(</span><span class="n">new_object</span><span class="p">)</span>
|
|
|
|
<span class="c1"># mesh object is made - preparing to decimate.</span>
|
|
<span class="n">ob</span> <span class="o">=</span> <span class="n">bpy</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">objects</span><span class="p">[</span><span class="s2">"BasReliefMesh"</span><span class="p">]</span>
|
|
<span class="n">ob</span><span class="o">.</span><span class="n">select_set</span><span class="p">(</span><span class="kc">True</span><span class="p">)</span>
|
|
<span class="n">bpy</span><span class="o">.</span><span class="n">context</span><span class="o">.</span><span class="n">view_layer</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">active</span> <span class="o">=</span> <span class="n">ob</span>
|
|
<span class="n">bpy</span><span class="o">.</span><span class="n">context</span><span class="o">.</span><span class="n">active_object</span><span class="o">.</span><span class="n">dimensions</span> <span class="o">=</span> <span class="p">(</span>
|
|
<span class="n">br</span><span class="o">.</span><span class="n">width_mm</span> <span class="o">/</span> <span class="mi">1000</span><span class="p">,</span>
|
|
<span class="n">br</span><span class="o">.</span><span class="n">height_mm</span> <span class="o">/</span> <span class="mi">1000</span><span class="p">,</span>
|
|
<span class="n">br</span><span class="o">.</span><span class="n">thickness_mm</span> <span class="o">/</span> <span class="mi">1000</span><span class="p">,</span>
|
|
<span class="p">)</span>
|
|
<span class="n">bpy</span><span class="o">.</span><span class="n">context</span><span class="o">.</span><span class="n">active_object</span><span class="o">.</span><span class="n">location</span> <span class="o">=</span> <span class="p">(</span>
|
|
<span class="nb">float</span><span class="p">(</span><span class="n">br</span><span class="o">.</span><span class="n">justify_x</span><span class="p">)</span> <span class="o">*</span> <span class="n">br</span><span class="o">.</span><span class="n">width_mm</span> <span class="o">/</span> <span class="mi">1000</span><span class="p">,</span>
|
|
<span class="nb">float</span><span class="p">(</span><span class="n">br</span><span class="o">.</span><span class="n">justify_y</span><span class="p">)</span> <span class="o">*</span> <span class="n">br</span><span class="o">.</span><span class="n">height_mm</span> <span class="o">/</span> <span class="mi">1000</span><span class="p">,</span>
|
|
<span class="nb">float</span><span class="p">(</span><span class="n">br</span><span class="o">.</span><span class="n">justify_z</span><span class="p">)</span> <span class="o">*</span> <span class="n">br</span><span class="o">.</span><span class="n">thickness_mm</span> <span class="o">/</span> <span class="mi">1000</span><span class="p">,</span>
|
|
<span class="p">)</span>
|
|
|
|
<span class="nb">print</span><span class="p">(</span><span class="s2">"Faces:"</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">ob</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">polygons</span><span class="p">)))</span>
|
|
<span class="nb">print</span><span class="p">(</span><span class="s2">"Vertices:"</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">ob</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">vertices</span><span class="p">)))</span>
|
|
<span class="k">if</span> <span class="n">decimateRatio</span> <span class="o">></span> <span class="mf">0.95</span><span class="p">:</span>
|
|
<span class="nb">print</span><span class="p">(</span><span class="s2">"Skipping Decimate Ratio > 0.95"</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">m</span> <span class="o">=</span> <span class="n">ob</span><span class="o">.</span><span class="n">modifiers</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s2">"Foo"</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="s2">"DECIMATE"</span><span class="p">)</span>
|
|
<span class="n">m</span><span class="o">.</span><span class="n">ratio</span> <span class="o">=</span> <span class="n">decimateRatio</span>
|
|
<span class="nb">print</span><span class="p">(</span><span class="s2">"Decimating with Ratio:"</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">decimateRatio</span><span class="p">))</span>
|
|
<span class="n">bpy</span><span class="o">.</span><span class="n">ops</span><span class="o">.</span><span class="n">object</span><span class="o">.</span><span class="n">modifier_apply</span><span class="p">(</span><span class="n">modifier</span><span class="o">=</span><span class="n">m</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
|
|
<span class="nb">print</span><span class="p">(</span><span class="s2">"Decimated"</span><span class="p">)</span>
|
|
<span class="nb">print</span><span class="p">(</span><span class="s2">"Faces:"</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">ob</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">polygons</span><span class="p">)))</span>
|
|
<span class="nb">print</span><span class="p">(</span><span class="s2">"Vertices:"</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">ob</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">vertices</span><span class="p">)))</span></div>
|
|
|
|
|
|
|
|
<span class="c1"># Switches to cycles render to CYCLES to render the sceen then switches it back to FABEX_RENDER for basRelief</span>
|
|
<div class="viewcode-block" id="render_scene">
|
|
<a class="viewcode-back" href="../../autoapi/fabex/bas_relief/index.html#fabex.bas_relief.render_scene">[docs]</a>
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">render_scene</span><span class="p">(</span><span class="n">width</span><span class="p">,</span> <span class="n">height</span><span class="p">,</span> <span class="n">bit_diameter</span><span class="p">,</span> <span class="n">passes_per_radius</span><span class="p">,</span> <span class="n">make_nodes</span><span class="p">,</span> <span class="n">view_layer</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Render a scene using Blender's Cycles engine.</span>
|
|
|
|
<span class="sd"> This function switches the rendering engine to Cycles, sets up the</span>
|
|
<span class="sd"> necessary nodes for depth rendering if specified, and configures the</span>
|
|
<span class="sd"> render resolution based on the provided parameters. It ensures that the</span>
|
|
<span class="sd"> scene is in object mode before rendering and restores the original</span>
|
|
<span class="sd"> rendering engine after the process is complete.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> width (int): The width of the render in pixels.</span>
|
|
<span class="sd"> height (int): The height of the render in pixels.</span>
|
|
<span class="sd"> bit_diameter (float): The diameter used to calculate the number of passes.</span>
|
|
<span class="sd"> passes_per_radius (int): The number of passes per radius for rendering.</span>
|
|
<span class="sd"> make_nodes (bool): A flag indicating whether to create render nodes.</span>
|
|
<span class="sd"> view_layer (str): The name of the view layer to be rendered.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> None: This function does not return any value.</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="nb">print</span><span class="p">(</span><span class="s2">"Rendering Scene"</span><span class="p">)</span>
|
|
<span class="n">scene</span> <span class="o">=</span> <span class="n">bpy</span><span class="o">.</span><span class="n">context</span><span class="o">.</span><span class="n">scene</span>
|
|
<span class="c1"># make sure we're in object mode or else bad things happen</span>
|
|
<span class="k">if</span> <span class="n">bpy</span><span class="o">.</span><span class="n">context</span><span class="o">.</span><span class="n">active_object</span><span class="p">:</span>
|
|
<span class="n">bpy</span><span class="o">.</span><span class="n">ops</span><span class="o">.</span><span class="n">object</span><span class="o">.</span><span class="n">mode_set</span><span class="p">(</span><span class="n">mode</span><span class="o">=</span><span class="s2">"OBJECT"</span><span class="p">)</span>
|
|
|
|
<span class="n">scene</span><span class="o">.</span><span class="n">render</span><span class="o">.</span><span class="n">engine</span> <span class="o">=</span> <span class="s2">"CYCLES"</span>
|
|
<span class="n">our_viewer</span> <span class="o">=</span> <span class="kc">None</span>
|
|
<span class="n">our_renderer</span> <span class="o">=</span> <span class="kc">None</span>
|
|
<span class="k">if</span> <span class="n">make_nodes</span><span class="p">:</span>
|
|
<span class="c1"># make depth render node and viewer node</span>
|
|
<span class="k">if</span> <span class="n">scene</span><span class="o">.</span><span class="n">use_nodes</span> <span class="o">==</span> <span class="kc">False</span><span class="p">:</span>
|
|
<span class="n">scene</span><span class="o">.</span><span class="n">use_nodes</span> <span class="o">=</span> <span class="kc">True</span>
|
|
<span class="n">node_tree</span> <span class="o">=</span> <span class="n">scene</span><span class="o">.</span><span class="n">node_tree</span>
|
|
<span class="n">nodes</span> <span class="o">=</span> <span class="n">node_tree</span><span class="o">.</span><span class="n">nodes</span>
|
|
<span class="n">our_viewer</span> <span class="o">=</span> <span class="n">node_tree</span><span class="o">.</span><span class="n">nodes</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="nb">type</span><span class="o">=</span><span class="s2">"CompositorNodeViewer"</span><span class="p">)</span>
|
|
<span class="n">our_viewer</span><span class="o">.</span><span class="n">label</span> <span class="o">=</span> <span class="s2">"CAM_basrelief_viewer"</span>
|
|
<span class="n">our_renderer</span> <span class="o">=</span> <span class="n">node_tree</span><span class="o">.</span><span class="n">nodes</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="nb">type</span><span class="o">=</span><span class="s2">"CompositorNodeRLayers"</span><span class="p">)</span>
|
|
<span class="n">our_renderer</span><span class="o">.</span><span class="n">label</span> <span class="o">=</span> <span class="s2">"CAM_basrelief_renderlayers"</span>
|
|
<span class="n">our_renderer</span><span class="o">.</span><span class="n">layer</span> <span class="o">=</span> <span class="n">view_layer</span>
|
|
<span class="n">node_tree</span><span class="o">.</span><span class="n">links</span><span class="o">.</span><span class="n">new</span><span class="p">(</span>
|
|
<span class="n">our_renderer</span><span class="o">.</span><span class="n">outputs</span><span class="p">[</span><span class="n">our_renderer</span><span class="o">.</span><span class="n">outputs</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s2">"Depth"</span><span class="p">)],</span>
|
|
<span class="n">our_viewer</span><span class="o">.</span><span class="n">inputs</span><span class="p">[</span><span class="n">our_viewer</span><span class="o">.</span><span class="n">inputs</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s2">"Image"</span><span class="p">)],</span>
|
|
<span class="p">)</span>
|
|
<span class="n">scene</span><span class="o">.</span><span class="n">view_layers</span><span class="p">[</span><span class="n">view_layer</span><span class="p">]</span><span class="o">.</span><span class="n">use_pass_z</span> <span class="o">=</span> <span class="kc">True</span>
|
|
<span class="c1"># set our viewer as active so that it is what gets rendered to viewer node image</span>
|
|
<span class="n">nodes</span><span class="o">.</span><span class="n">active</span> <span class="o">=</span> <span class="n">our_viewer</span>
|
|
|
|
<span class="c1"># Set render resolution</span>
|
|
<span class="n">passes</span> <span class="o">=</span> <span class="n">bit_diameter</span> <span class="o">/</span> <span class="p">(</span><span class="mi">2</span> <span class="o">*</span> <span class="n">passes_per_radius</span><span class="p">)</span>
|
|
<span class="n">x</span> <span class="o">=</span> <span class="nb">round</span><span class="p">(</span><span class="n">width</span> <span class="o">/</span> <span class="n">passes</span><span class="p">)</span>
|
|
<span class="n">y</span> <span class="o">=</span> <span class="nb">round</span><span class="p">(</span><span class="n">height</span> <span class="o">/</span> <span class="n">passes</span><span class="p">)</span>
|
|
<span class="nb">print</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">passes</span><span class="p">)</span>
|
|
<span class="n">scene</span><span class="o">.</span><span class="n">render</span><span class="o">.</span><span class="n">resolution_x</span> <span class="o">=</span> <span class="n">x</span>
|
|
<span class="n">scene</span><span class="o">.</span><span class="n">render</span><span class="o">.</span><span class="n">resolution_y</span> <span class="o">=</span> <span class="n">y</span>
|
|
<span class="n">scene</span><span class="o">.</span><span class="n">render</span><span class="o">.</span><span class="n">resolution_percentage</span> <span class="o">=</span> <span class="mi">100</span>
|
|
<span class="n">bpy</span><span class="o">.</span><span class="n">ops</span><span class="o">.</span><span class="n">render</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="n">animation</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">write_still</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">use_viewport</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">layer</span><span class="o">=</span><span class="s2">""</span><span class="p">,</span> <span class="n">scene</span><span class="o">=</span><span class="s2">""</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">our_renderer</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="n">nodes</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">our_renderer</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">our_viewer</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="n">nodes</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">our_viewer</span><span class="p">)</span>
|
|
<span class="n">bpy</span><span class="o">.</span><span class="n">context</span><span class="o">.</span><span class="n">scene</span><span class="o">.</span><span class="n">render</span><span class="o">.</span><span class="n">engine</span> <span class="o">=</span> <span class="s2">"FABEX_RENDER"</span>
|
|
<span class="nb">print</span><span class="p">(</span><span class="s2">"Done Rendering"</span><span class="p">)</span></div>
|
|
|
|
|
|
|
|
<div class="viewcode-block" id="problem_areas">
|
|
<a class="viewcode-back" href="../../autoapi/fabex/bas_relief/index.html#fabex.bas_relief.problem_areas">[docs]</a>
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">problem_areas</span><span class="p">(</span><span class="n">br</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Process image data to identify problem areas based on silhouette</span>
|
|
<span class="sd"> thresholds.</span>
|
|
|
|
<span class="sd"> This function analyzes an image and computes gradients to detect and</span>
|
|
<span class="sd"> recover silhouettes based on specified parameters. It utilizes various</span>
|
|
<span class="sd"> settings from the provided `br` object to adjust the processing,</span>
|
|
<span class="sd"> including silhouette thresholds, scaling factors, and iterations for</span>
|
|
<span class="sd"> smoothing and recovery. The function also handles image scaling and</span>
|
|
<span class="sd"> applies a gradient mask if specified. The resulting data is then</span>
|
|
<span class="sd"> converted back into an image format for further use.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> br (object): An object containing various parameters for processing, including:</span>
|
|
<span class="sd"> - use_image_source (bool): Flag to determine if a specific image source</span>
|
|
<span class="sd"> should be used.</span>
|
|
<span class="sd"> - source_image_name (str): Name of the source image if</span>
|
|
<span class="sd"> `use_image_source` is True.</span>
|
|
<span class="sd"> - silhouette_threshold (float): Threshold for silhouette detection.</span>
|
|
<span class="sd"> - recover_silhouettes (bool): Flag to indicate if silhouettes should be</span>
|
|
<span class="sd"> recovered.</span>
|
|
<span class="sd"> - silhouette_scale (float): Scaling factor for silhouette recovery.</span>
|
|
<span class="sd"> - min_gridsize (int): Minimum grid size for processing.</span>
|
|
<span class="sd"> - smooth_iterations (int): Number of iterations for smoothing.</span>
|
|
<span class="sd"> - vcycle_iterations (int): Number of iterations for V-cycle processing.</span>
|
|
<span class="sd"> - linbcg_iterations (int): Number of iterations for linear BCG</span>
|
|
<span class="sd"> processing.</span>
|
|
<span class="sd"> - use_planar (bool): Flag to indicate if planar processing should be</span>
|
|
<span class="sd"> used.</span>
|
|
<span class="sd"> - gradient_scaling_mask_use (bool): Flag to indicate if a gradient</span>
|
|
<span class="sd"> scaling mask should be used.</span>
|
|
<span class="sd"> - gradient_scaling_mask_name (str): Name of the gradient scaling mask</span>
|
|
<span class="sd"> image.</span>
|
|
<span class="sd"> - depth_exponent (float): Exponent for depth adjustment.</span>
|
|
<span class="sd"> - silhouette_exponent (int): Exponent for silhouette recovery.</span>
|
|
<span class="sd"> - attenuation (float): Attenuation factor for processing.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> None: The function does not return a value but processes the image data and</span>
|
|
<span class="sd"> saves the result.</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="n">t</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span>
|
|
<span class="k">if</span> <span class="n">br</span><span class="o">.</span><span class="n">use_image_source</span><span class="p">:</span>
|
|
<span class="n">i</span> <span class="o">=</span> <span class="n">bpy</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">images</span><span class="p">[</span><span class="n">br</span><span class="o">.</span><span class="n">source_image_name</span><span class="p">]</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">i</span> <span class="o">=</span> <span class="n">bpy</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">images</span><span class="p">[</span><span class="s2">"Viewer Node"</span><span class="p">]</span>
|
|
<span class="n">silh_thres</span> <span class="o">=</span> <span class="n">br</span><span class="o">.</span><span class="n">silhouette_threshold</span>
|
|
<span class="n">recover_silh</span> <span class="o">=</span> <span class="n">br</span><span class="o">.</span><span class="n">recover_silhouettes</span>
|
|
<span class="n">silh_scale</span> <span class="o">=</span> <span class="n">br</span><span class="o">.</span><span class="n">silhouette_scale</span>
|
|
<span class="n">MINS</span> <span class="o">=</span> <span class="n">br</span><span class="o">.</span><span class="n">min_gridsize</span>
|
|
<span class="n">smoothiterations</span> <span class="o">=</span> <span class="n">br</span><span class="o">.</span><span class="n">smooth_iterations</span>
|
|
<span class="n">vcycleiterations</span> <span class="o">=</span> <span class="n">br</span><span class="o">.</span><span class="n">vcycle_iterations</span>
|
|
<span class="n">linbcgiterations</span> <span class="o">=</span> <span class="n">br</span><span class="o">.</span><span class="n">linbcg_iterations</span>
|
|
<span class="n">useplanar</span> <span class="o">=</span> <span class="n">br</span><span class="o">.</span><span class="n">use_planar</span>
|
|
<span class="k">if</span> <span class="n">br</span><span class="o">.</span><span class="n">gradient_scaling_mask_use</span><span class="p">:</span>
|
|
<span class="n">m</span> <span class="o">=</span> <span class="n">bpy</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">images</span><span class="p">[</span><span class="n">br</span><span class="o">.</span><span class="n">gradient_scaling_mask_name</span><span class="p">]</span>
|
|
|
|
<span class="n">nar</span> <span class="o">=</span> <span class="n">image_to_numpy</span><span class="p">(</span><span class="n">i</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">br</span><span class="o">.</span><span class="n">gradient_scaling_mask_use</span><span class="p">:</span>
|
|
<span class="n">mask</span> <span class="o">=</span> <span class="n">image_to_numpy</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
|
|
<span class="c1"># put image to scale</span>
|
|
<span class="n">tonemap</span><span class="p">(</span><span class="n">nar</span><span class="p">,</span> <span class="n">br</span><span class="o">.</span><span class="n">depth_exponent</span><span class="p">)</span>
|
|
<span class="n">nar</span> <span class="o">=</span> <span class="mi">1</span> <span class="o">-</span> <span class="n">nar</span> <span class="c1"># reverse z buffer+ add something</span>
|
|
<span class="nb">print</span><span class="p">(</span><span class="n">nar</span><span class="o">.</span><span class="n">min</span><span class="p">(),</span> <span class="n">nar</span><span class="o">.</span><span class="n">max</span><span class="p">())</span>
|
|
<span class="n">gx</span> <span class="o">=</span> <span class="n">nar</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
|
|
<span class="n">gx</span><span class="o">.</span><span class="n">fill</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
|
|
<span class="n">gx</span><span class="p">[:</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="p">:]</span> <span class="o">=</span> <span class="n">nar</span><span class="p">[</span><span class="mi">1</span><span class="p">:,</span> <span class="p">:]</span> <span class="o">-</span> <span class="n">nar</span><span class="p">[:</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="p">:]</span>
|
|
<span class="n">gy</span> <span class="o">=</span> <span class="n">nar</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
|
|
<span class="n">gy</span><span class="o">.</span><span class="n">fill</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
|
|
<span class="n">gy</span><span class="p">[:,</span> <span class="p">:</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">nar</span><span class="p">[:,</span> <span class="mi">1</span><span class="p">:]</span> <span class="o">-</span> <span class="n">nar</span><span class="p">[:,</span> <span class="p">:</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
|
|
|
|
<span class="c1"># it' ok, we can treat neg and positive silh separately here:</span>
|
|
<span class="n">a</span> <span class="o">=</span> <span class="n">br</span><span class="o">.</span><span class="n">attenuation</span>
|
|
<span class="n">planar</span> <span class="o">=</span> <span class="n">nar</span> <span class="o"><</span> <span class="p">(</span><span class="n">nar</span><span class="o">.</span><span class="n">min</span><span class="p">()</span> <span class="o">+</span> <span class="mf">0.0001</span><span class="p">)</span>
|
|
<span class="c1"># sqrt for silhouettes recovery:</span>
|
|
<span class="n">sqrarx</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">abs</span><span class="p">(</span><span class="n">gx</span><span class="p">)</span>
|
|
<span class="k">for</span> <span class="nb">iter</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">br</span><span class="o">.</span><span class="n">silhouette_exponent</span><span class="p">):</span>
|
|
<span class="n">sqrarx</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">sqrt</span><span class="p">(</span><span class="n">sqrarx</span><span class="p">)</span>
|
|
<span class="n">sqrary</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">abs</span><span class="p">(</span><span class="n">gy</span><span class="p">)</span>
|
|
<span class="k">for</span> <span class="nb">iter</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">br</span><span class="o">.</span><span class="n">silhouette_exponent</span><span class="p">):</span>
|
|
<span class="n">sqrary</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">sqrt</span><span class="p">(</span><span class="n">sqrary</span><span class="p">)</span>
|
|
|
|
<span class="c1"># detect and also recover silhouettes:</span>
|
|
<span class="n">silhxpos</span> <span class="o">=</span> <span class="n">gx</span> <span class="o">></span> <span class="n">silh_thres</span>
|
|
<span class="n">gx</span> <span class="o">=</span> <span class="n">gx</span> <span class="o">*</span> <span class="p">(</span><span class="o">-</span><span class="n">silhxpos</span><span class="p">)</span> <span class="o">+</span> <span class="n">recover_silh</span> <span class="o">*</span> <span class="p">(</span><span class="n">silhxpos</span> <span class="o">*</span> <span class="n">silh_thres</span> <span class="o">*</span> <span class="n">silh_scale</span><span class="p">)</span> <span class="o">*</span> <span class="n">sqrarx</span>
|
|
<span class="n">silhxneg</span> <span class="o">=</span> <span class="n">gx</span> <span class="o"><</span> <span class="o">-</span><span class="n">silh_thres</span>
|
|
<span class="n">gx</span> <span class="o">=</span> <span class="n">gx</span> <span class="o">*</span> <span class="p">(</span><span class="o">-</span><span class="n">silhxneg</span><span class="p">)</span> <span class="o">-</span> <span class="n">recover_silh</span> <span class="o">*</span> <span class="p">(</span><span class="n">silhxneg</span> <span class="o">*</span> <span class="n">silh_thres</span> <span class="o">*</span> <span class="n">silh_scale</span><span class="p">)</span> <span class="o">*</span> <span class="n">sqrarx</span>
|
|
<span class="n">silhx</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">logical_or</span><span class="p">(</span><span class="n">silhxpos</span><span class="p">,</span> <span class="n">silhxneg</span><span class="p">)</span>
|
|
<span class="n">gx</span> <span class="o">=</span> <span class="n">gx</span> <span class="o">*</span> <span class="n">silhx</span> <span class="o">+</span> <span class="p">(</span><span class="mf">1.0</span> <span class="o">/</span> <span class="n">a</span> <span class="o">*</span> <span class="n">numpy</span><span class="o">.</span><span class="n">log</span><span class="p">(</span><span class="mf">1.0</span> <span class="o">+</span> <span class="n">a</span> <span class="o">*</span> <span class="p">(</span><span class="n">gx</span><span class="p">)))</span> <span class="o">*</span> <span class="p">(</span><span class="o">-</span><span class="n">silhx</span><span class="p">)</span> <span class="c1"># attenuate</span>
|
|
|
|
<span class="n">silhypos</span> <span class="o">=</span> <span class="n">gy</span> <span class="o">></span> <span class="n">silh_thres</span>
|
|
<span class="n">gy</span> <span class="o">=</span> <span class="n">gy</span> <span class="o">*</span> <span class="p">(</span><span class="o">-</span><span class="n">silhypos</span><span class="p">)</span> <span class="o">+</span> <span class="n">recover_silh</span> <span class="o">*</span> <span class="p">(</span><span class="n">silhypos</span> <span class="o">*</span> <span class="n">silh_thres</span> <span class="o">*</span> <span class="n">silh_scale</span><span class="p">)</span> <span class="o">*</span> <span class="n">sqrary</span>
|
|
<span class="n">silhyneg</span> <span class="o">=</span> <span class="n">gy</span> <span class="o"><</span> <span class="o">-</span><span class="n">silh_thres</span>
|
|
<span class="n">gy</span> <span class="o">=</span> <span class="n">gy</span> <span class="o">*</span> <span class="p">(</span><span class="o">-</span><span class="n">silhyneg</span><span class="p">)</span> <span class="o">-</span> <span class="n">recover_silh</span> <span class="o">*</span> <span class="p">(</span><span class="n">silhyneg</span> <span class="o">*</span> <span class="n">silh_thres</span> <span class="o">*</span> <span class="n">silh_scale</span><span class="p">)</span> <span class="o">*</span> <span class="n">sqrary</span>
|
|
<span class="n">silhy</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">logical_or</span><span class="p">(</span><span class="n">silhypos</span><span class="p">,</span> <span class="n">silhyneg</span><span class="p">)</span> <span class="c1"># both silh</span>
|
|
<span class="n">gy</span> <span class="o">=</span> <span class="n">gy</span> <span class="o">*</span> <span class="n">silhy</span> <span class="o">+</span> <span class="p">(</span><span class="mf">1.0</span> <span class="o">/</span> <span class="n">a</span> <span class="o">*</span> <span class="n">numpy</span><span class="o">.</span><span class="n">log</span><span class="p">(</span><span class="mf">1.0</span> <span class="o">+</span> <span class="n">a</span> <span class="o">*</span> <span class="p">(</span><span class="n">gy</span><span class="p">)))</span> <span class="o">*</span> <span class="p">(</span><span class="o">-</span><span class="n">silhy</span><span class="p">)</span> <span class="c1"># attenuate</span>
|
|
|
|
<span class="c1"># now scale slopes...</span>
|
|
<span class="k">if</span> <span class="n">br</span><span class="o">.</span><span class="n">gradient_scaling_mask_use</span><span class="p">:</span>
|
|
<span class="n">gx</span> <span class="o">*=</span> <span class="n">mask</span>
|
|
<span class="n">gy</span> <span class="o">*=</span> <span class="n">mask</span>
|
|
|
|
<span class="n">divg</span> <span class="o">=</span> <span class="n">gx</span> <span class="o">+</span> <span class="n">gy</span>
|
|
<span class="n">divga</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">abs</span><span class="p">(</span><span class="n">divg</span><span class="p">)</span>
|
|
<span class="n">divgp</span> <span class="o">=</span> <span class="n">divga</span> <span class="o">></span> <span class="n">silh_thres</span> <span class="o">/</span> <span class="mf">4.0</span>
|
|
<span class="n">divgp</span> <span class="o">=</span> <span class="mi">1</span> <span class="o">-</span> <span class="n">divgp</span>
|
|
<span class="k">for</span> <span class="n">a</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">2</span><span class="p">):</span>
|
|
<span class="n">atimes</span><span class="p">(</span><span class="n">divgp</span><span class="p">,</span> <span class="n">divga</span><span class="p">)</span>
|
|
<span class="n">divga</span> <span class="o">=</span> <span class="n">divgp</span>
|
|
|
|
<span class="n">numpy_to_image</span><span class="p">(</span><span class="n">divga</span><span class="p">,</span> <span class="s2">"problem"</span><span class="p">)</span></div>
|
|
|
|
|
|
|
|
<div class="viewcode-block" id="relief">
|
|
<a class="viewcode-back" href="../../autoapi/fabex/bas_relief/index.html#fabex.bas_relief.relief">[docs]</a>
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">relief</span><span class="p">(</span><span class="n">br</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Process an image to enhance relief features.</span>
|
|
|
|
<span class="sd"> This function takes an input image and applies various processing</span>
|
|
<span class="sd"> techniques to enhance the relief features based on the provided</span>
|
|
<span class="sd"> parameters. It utilizes gradient calculations, silhouette recovery, and</span>
|
|
<span class="sd"> optional detail enhancement through Fourier transforms. The processed</span>
|
|
<span class="sd"> image is then used to build a mesh representation.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> br (object): An object containing various parameters for the relief processing,</span>
|
|
<span class="sd"> including:</span>
|
|
<span class="sd"> - use_image_source (bool): Whether to use a specified image source.</span>
|
|
<span class="sd"> - source_image_name (str): The name of the source image.</span>
|
|
<span class="sd"> - silhouette_threshold (float): Threshold for silhouette detection.</span>
|
|
<span class="sd"> - recover_silhouettes (bool): Flag to indicate if silhouettes should be</span>
|
|
<span class="sd"> recovered.</span>
|
|
<span class="sd"> - silhouette_scale (float): Scale factor for silhouette recovery.</span>
|
|
<span class="sd"> - min_gridsize (int): Minimum grid size for processing.</span>
|
|
<span class="sd"> - smooth_iterations (int): Number of iterations for smoothing.</span>
|
|
<span class="sd"> - vcycle_iterations (int): Number of iterations for V-cycle processing.</span>
|
|
<span class="sd"> - linbcg_iterations (int): Number of iterations for linear BCG</span>
|
|
<span class="sd"> processing.</span>
|
|
<span class="sd"> - use_planar (bool): Flag to indicate if planar processing should be</span>
|
|
<span class="sd"> used.</span>
|
|
<span class="sd"> - gradient_scaling_mask_use (bool): Flag to indicate if a gradient</span>
|
|
<span class="sd"> scaling mask should be used.</span>
|
|
<span class="sd"> - gradient_scaling_mask_name (str): Name of the gradient scaling mask</span>
|
|
<span class="sd"> image.</span>
|
|
<span class="sd"> - depth_exponent (float): Exponent for depth adjustment.</span>
|
|
<span class="sd"> - attenuation (float): Attenuation factor for the processing.</span>
|
|
<span class="sd"> - detail_enhancement_use (bool): Flag to indicate if detail enhancement</span>
|
|
<span class="sd"> should be applied.</span>
|
|
<span class="sd"> - detail_enhancement_freq (float): Frequency for detail enhancement.</span>
|
|
<span class="sd"> - detail_enhancement_amount (float): Amount of detail enhancement to</span>
|
|
<span class="sd"> apply.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> None: The function processes the image and builds a mesh but does not return a</span>
|
|
<span class="sd"> value.</span>
|
|
|
|
<span class="sd"> Raises:</span>
|
|
<span class="sd"> ReliefError: If the input image is blank or invalid.</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="n">t</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span>
|
|
|
|
<span class="k">if</span> <span class="n">br</span><span class="o">.</span><span class="n">use_image_source</span><span class="p">:</span>
|
|
<span class="n">i</span> <span class="o">=</span> <span class="n">bpy</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">images</span><span class="p">[</span><span class="n">br</span><span class="o">.</span><span class="n">source_image_name</span><span class="p">]</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">i</span> <span class="o">=</span> <span class="n">bpy</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">images</span><span class="p">[</span><span class="s2">"Viewer Node"</span><span class="p">]</span>
|
|
<span class="n">silh_thres</span> <span class="o">=</span> <span class="n">br</span><span class="o">.</span><span class="n">silhouette_threshold</span>
|
|
<span class="n">recover_silh</span> <span class="o">=</span> <span class="n">br</span><span class="o">.</span><span class="n">recover_silhouettes</span>
|
|
<span class="n">silh_scale</span> <span class="o">=</span> <span class="n">br</span><span class="o">.</span><span class="n">silhouette_scale</span>
|
|
<span class="n">MINS</span> <span class="o">=</span> <span class="n">br</span><span class="o">.</span><span class="n">min_gridsize</span>
|
|
<span class="n">smoothiterations</span> <span class="o">=</span> <span class="n">br</span><span class="o">.</span><span class="n">smooth_iterations</span>
|
|
<span class="n">vcycleiterations</span> <span class="o">=</span> <span class="n">br</span><span class="o">.</span><span class="n">vcycle_iterations</span>
|
|
<span class="n">linbcgiterations</span> <span class="o">=</span> <span class="n">br</span><span class="o">.</span><span class="n">linbcg_iterations</span>
|
|
<span class="n">useplanar</span> <span class="o">=</span> <span class="n">br</span><span class="o">.</span><span class="n">use_planar</span>
|
|
<span class="k">if</span> <span class="n">br</span><span class="o">.</span><span class="n">gradient_scaling_mask_use</span><span class="p">:</span>
|
|
<span class="n">m</span> <span class="o">=</span> <span class="n">bpy</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">images</span><span class="p">[</span><span class="n">br</span><span class="o">.</span><span class="n">gradient_scaling_mask_name</span><span class="p">]</span>
|
|
|
|
<span class="n">nar</span> <span class="o">=</span> <span class="n">image_to_numpy</span><span class="p">(</span><span class="n">i</span><span class="p">)</span>
|
|
<span class="c1"># return</span>
|
|
<span class="k">if</span> <span class="n">br</span><span class="o">.</span><span class="n">gradient_scaling_mask_use</span><span class="p">:</span>
|
|
<span class="n">mask</span> <span class="o">=</span> <span class="n">image_to_numpy</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
|
|
<span class="c1"># put image to scale</span>
|
|
<span class="n">tonemap</span><span class="p">(</span><span class="n">nar</span><span class="p">,</span> <span class="n">br</span><span class="o">.</span><span class="n">depth_exponent</span><span class="p">)</span>
|
|
<span class="n">nar</span> <span class="o">=</span> <span class="mi">1</span> <span class="o">-</span> <span class="n">nar</span> <span class="c1"># reverse z buffer+ add something</span>
|
|
<span class="nb">print</span><span class="p">(</span><span class="s2">"Range:"</span><span class="p">,</span> <span class="n">nar</span><span class="o">.</span><span class="n">min</span><span class="p">(),</span> <span class="n">nar</span><span class="o">.</span><span class="n">max</span><span class="p">())</span>
|
|
<span class="k">if</span> <span class="n">nar</span><span class="o">.</span><span class="n">min</span><span class="p">()</span> <span class="o">-</span> <span class="n">nar</span><span class="o">.</span><span class="n">max</span><span class="p">()</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="n">ReliefError</span><span class="p">(</span>
|
|
<span class="s2">"Input Image Is Blank - Check You Have the Correct View Layer or Input Image Set."</span>
|
|
<span class="p">)</span>
|
|
|
|
<span class="n">gx</span> <span class="o">=</span> <span class="n">nar</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
|
|
<span class="n">gx</span><span class="o">.</span><span class="n">fill</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
|
|
<span class="n">gx</span><span class="p">[:</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="p">:]</span> <span class="o">=</span> <span class="n">nar</span><span class="p">[</span><span class="mi">1</span><span class="p">:,</span> <span class="p">:]</span> <span class="o">-</span> <span class="n">nar</span><span class="p">[:</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="p">:]</span>
|
|
<span class="n">gy</span> <span class="o">=</span> <span class="n">nar</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
|
|
<span class="n">gy</span><span class="o">.</span><span class="n">fill</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
|
|
<span class="n">gy</span><span class="p">[:,</span> <span class="p">:</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">nar</span><span class="p">[:,</span> <span class="mi">1</span><span class="p">:]</span> <span class="o">-</span> <span class="n">nar</span><span class="p">[:,</span> <span class="p">:</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
|
|
|
|
<span class="c1"># it' ok, we can treat neg and positive silh separately here:</span>
|
|
<span class="n">a</span> <span class="o">=</span> <span class="n">br</span><span class="o">.</span><span class="n">attenuation</span>
|
|
<span class="c1"># numpy.logical_or(silhxplanar,silhyplanar)#</span>
|
|
<span class="n">planar</span> <span class="o">=</span> <span class="n">nar</span> <span class="o"><</span> <span class="p">(</span><span class="n">nar</span><span class="o">.</span><span class="n">min</span><span class="p">()</span> <span class="o">+</span> <span class="mf">0.0001</span><span class="p">)</span>
|
|
<span class="c1"># sqrt for silhouettes recovery:</span>
|
|
<span class="n">sqrarx</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">abs</span><span class="p">(</span><span class="n">gx</span><span class="p">)</span>
|
|
<span class="k">for</span> <span class="nb">iter</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">br</span><span class="o">.</span><span class="n">silhouette_exponent</span><span class="p">):</span>
|
|
<span class="n">sqrarx</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">sqrt</span><span class="p">(</span><span class="n">sqrarx</span><span class="p">)</span>
|
|
<span class="n">sqrary</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">abs</span><span class="p">(</span><span class="n">gy</span><span class="p">)</span>
|
|
<span class="k">for</span> <span class="nb">iter</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">br</span><span class="o">.</span><span class="n">silhouette_exponent</span><span class="p">):</span>
|
|
<span class="n">sqrary</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">sqrt</span><span class="p">(</span><span class="n">sqrary</span><span class="p">)</span>
|
|
|
|
<span class="c1"># detect and also recover silhouettes:</span>
|
|
<span class="n">silhxpos</span> <span class="o">=</span> <span class="n">gx</span> <span class="o">></span> <span class="n">silh_thres</span>
|
|
<span class="nb">print</span><span class="p">(</span><span class="s2">"*** silhxpos is </span><span class="si">%s</span><span class="s2">"</span> <span class="o">%</span> <span class="n">silhxpos</span><span class="p">)</span>
|
|
<span class="n">gx</span> <span class="o">=</span> <span class="n">gx</span> <span class="o">*</span> <span class="p">(</span><span class="o">~</span><span class="n">silhxpos</span><span class="p">)</span> <span class="o">+</span> <span class="n">recover_silh</span> <span class="o">*</span> <span class="p">(</span><span class="n">silhxpos</span> <span class="o">*</span> <span class="n">silh_thres</span> <span class="o">*</span> <span class="n">silh_scale</span><span class="p">)</span> <span class="o">*</span> <span class="n">sqrarx</span>
|
|
<span class="n">silhxneg</span> <span class="o">=</span> <span class="n">gx</span> <span class="o"><</span> <span class="o">-</span><span class="n">silh_thres</span>
|
|
<span class="n">gx</span> <span class="o">=</span> <span class="n">gx</span> <span class="o">*</span> <span class="p">(</span><span class="o">~</span><span class="n">silhxneg</span><span class="p">)</span> <span class="o">-</span> <span class="n">recover_silh</span> <span class="o">*</span> <span class="p">(</span><span class="n">silhxneg</span> <span class="o">*</span> <span class="n">silh_thres</span> <span class="o">*</span> <span class="n">silh_scale</span><span class="p">)</span> <span class="o">*</span> <span class="n">sqrarx</span>
|
|
<span class="n">silhx</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">logical_or</span><span class="p">(</span><span class="n">silhxpos</span><span class="p">,</span> <span class="n">silhxneg</span><span class="p">)</span>
|
|
<span class="n">gx</span> <span class="o">=</span> <span class="n">gx</span> <span class="o">*</span> <span class="n">silhx</span> <span class="o">+</span> <span class="p">(</span><span class="mf">1.0</span> <span class="o">/</span> <span class="n">a</span> <span class="o">*</span> <span class="n">numpy</span><span class="o">.</span><span class="n">log</span><span class="p">(</span><span class="mf">1.0</span> <span class="o">+</span> <span class="n">a</span> <span class="o">*</span> <span class="p">(</span><span class="n">gx</span><span class="p">)))</span> <span class="o">*</span> <span class="p">(</span><span class="o">~</span><span class="n">silhx</span><span class="p">)</span> <span class="c1"># attenuate</span>
|
|
|
|
<span class="n">silhypos</span> <span class="o">=</span> <span class="n">gy</span> <span class="o">></span> <span class="n">silh_thres</span>
|
|
<span class="n">gy</span> <span class="o">=</span> <span class="n">gy</span> <span class="o">*</span> <span class="p">(</span><span class="o">~</span><span class="n">silhypos</span><span class="p">)</span> <span class="o">+</span> <span class="n">recover_silh</span> <span class="o">*</span> <span class="p">(</span><span class="n">silhypos</span> <span class="o">*</span> <span class="n">silh_thres</span> <span class="o">*</span> <span class="n">silh_scale</span><span class="p">)</span> <span class="o">*</span> <span class="n">sqrary</span>
|
|
<span class="n">silhyneg</span> <span class="o">=</span> <span class="n">gy</span> <span class="o"><</span> <span class="o">-</span><span class="n">silh_thres</span>
|
|
<span class="n">gy</span> <span class="o">=</span> <span class="n">gy</span> <span class="o">*</span> <span class="p">(</span><span class="o">~</span><span class="n">silhyneg</span><span class="p">)</span> <span class="o">-</span> <span class="n">recover_silh</span> <span class="o">*</span> <span class="p">(</span><span class="n">silhyneg</span> <span class="o">*</span> <span class="n">silh_thres</span> <span class="o">*</span> <span class="n">silh_scale</span><span class="p">)</span> <span class="o">*</span> <span class="n">sqrary</span>
|
|
<span class="n">silhy</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">logical_or</span><span class="p">(</span><span class="n">silhypos</span><span class="p">,</span> <span class="n">silhyneg</span><span class="p">)</span> <span class="c1"># both silh</span>
|
|
<span class="n">gy</span> <span class="o">=</span> <span class="n">gy</span> <span class="o">*</span> <span class="n">silhy</span> <span class="o">+</span> <span class="p">(</span><span class="mf">1.0</span> <span class="o">/</span> <span class="n">a</span> <span class="o">*</span> <span class="n">numpy</span><span class="o">.</span><span class="n">log</span><span class="p">(</span><span class="mf">1.0</span> <span class="o">+</span> <span class="n">a</span> <span class="o">*</span> <span class="p">(</span><span class="n">gy</span><span class="p">)))</span> <span class="o">*</span> <span class="p">(</span><span class="o">~</span><span class="n">silhy</span><span class="p">)</span> <span class="c1"># attenuate</span>
|
|
|
|
<span class="c1"># now scale slopes...</span>
|
|
<span class="k">if</span> <span class="n">br</span><span class="o">.</span><span class="n">gradient_scaling_mask_use</span><span class="p">:</span>
|
|
<span class="n">gx</span> <span class="o">*=</span> <span class="n">mask</span>
|
|
<span class="n">gy</span> <span class="o">*=</span> <span class="n">mask</span>
|
|
|
|
<span class="n">divg</span> <span class="o">=</span> <span class="n">gx</span> <span class="o">+</span> <span class="n">gy</span>
|
|
<span class="n">divg</span><span class="p">[</span><span class="mi">1</span><span class="p">:,</span> <span class="p">:]</span> <span class="o">=</span> <span class="n">divg</span><span class="p">[</span><span class="mi">1</span><span class="p">:,</span> <span class="p">:]</span> <span class="o">-</span> <span class="n">gx</span><span class="p">[:</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="p">:]</span> <span class="c1"># subtract x</span>
|
|
<span class="n">divg</span><span class="p">[:,</span> <span class="mi">1</span><span class="p">:]</span> <span class="o">=</span> <span class="n">divg</span><span class="p">[:,</span> <span class="mi">1</span><span class="p">:]</span> <span class="o">-</span> <span class="n">gy</span><span class="p">[:,</span> <span class="p">:</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="c1"># subtract y</span>
|
|
|
|
<span class="k">if</span> <span class="n">br</span><span class="o">.</span><span class="n">detail_enhancement_use</span><span class="p">:</span> <span class="c1"># fourier stuff here!disabled by now</span>
|
|
<span class="nb">print</span><span class="p">(</span><span class="s2">"detail enhancement"</span><span class="p">)</span>
|
|
<span class="n">rows</span><span class="p">,</span> <span class="n">cols</span> <span class="o">=</span> <span class="n">gx</span><span class="o">.</span><span class="n">shape</span>
|
|
<span class="n">crow</span><span class="p">,</span> <span class="n">ccol</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">rows</span> <span class="o">/</span> <span class="mi">2</span><span class="p">),</span> <span class="nb">int</span><span class="p">(</span><span class="n">cols</span> <span class="o">/</span> <span class="mi">2</span><span class="p">)</span>
|
|
|
|
<span class="n">divgmin</span> <span class="o">=</span> <span class="n">divg</span><span class="o">.</span><span class="n">min</span><span class="p">()</span>
|
|
<span class="n">divg</span> <span class="o">+=</span> <span class="n">divgmin</span>
|
|
<span class="n">divgf</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">fft</span><span class="o">.</span><span class="n">fft2</span><span class="p">(</span><span class="n">divg</span><span class="p">)</span>
|
|
<span class="n">divgfshift</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">fft</span><span class="o">.</span><span class="n">fftshift</span><span class="p">(</span><span class="n">divgf</span><span class="p">)</span>
|
|
<span class="n">mask</span> <span class="o">=</span> <span class="n">divg</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
|
|
<span class="n">pos</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">array</span><span class="p">((</span><span class="n">crow</span><span class="p">,</span> <span class="n">ccol</span><span class="p">))</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">filterwindow</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">cx</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">cy</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="nb">abs</span><span class="p">((</span><span class="n">cx</span> <span class="o">-</span> <span class="n">x</span><span class="p">))</span> <span class="o">+</span> <span class="nb">abs</span><span class="p">((</span><span class="n">cy</span> <span class="o">-</span> <span class="n">y</span><span class="p">))</span>
|
|
|
|
<span class="n">mask</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">fromfunction</span><span class="p">(</span><span class="n">filterwindow</span><span class="p">,</span> <span class="n">divg</span><span class="o">.</span><span class="n">shape</span><span class="p">,</span> <span class="n">cx</span><span class="o">=</span><span class="n">crow</span><span class="p">,</span> <span class="n">cy</span><span class="o">=</span><span class="n">ccol</span><span class="p">)</span>
|
|
<span class="n">mask</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">sqrt</span><span class="p">(</span><span class="n">mask</span><span class="p">)</span>
|
|
|
|
<span class="n">maskmin</span> <span class="o">=</span> <span class="n">mask</span><span class="o">.</span><span class="n">min</span><span class="p">()</span>
|
|
<span class="n">maskmax</span> <span class="o">=</span> <span class="n">mask</span><span class="o">.</span><span class="n">max</span><span class="p">()</span>
|
|
<span class="n">mask</span> <span class="o">=</span> <span class="p">(</span><span class="n">mask</span> <span class="o">-</span> <span class="n">maskmin</span><span class="p">)</span> <span class="o">/</span> <span class="p">(</span><span class="n">maskmax</span> <span class="o">-</span> <span class="n">maskmin</span><span class="p">)</span>
|
|
<span class="n">mask</span> <span class="o">*=</span> <span class="n">br</span><span class="o">.</span><span class="n">detail_enhancement_amount</span>
|
|
<span class="n">mask</span> <span class="o">+=</span> <span class="mi">1</span> <span class="o">-</span> <span class="n">mask</span><span class="o">.</span><span class="n">max</span><span class="p">()</span>
|
|
|
|
<span class="n">mask</span><span class="p">[</span><span class="n">crow</span> <span class="o">-</span> <span class="mi">1</span> <span class="p">:</span> <span class="n">crow</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">ccol</span> <span class="o">-</span> <span class="mi">1</span> <span class="p">:</span> <span class="n">ccol</span> <span class="o">+</span> <span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span> <span class="c1"># to preserve basic freqencies.</span>
|
|
|
|
<span class="n">divgfshift</span> <span class="o">=</span> <span class="n">divgfshift</span> <span class="o">*</span> <span class="n">mask</span>
|
|
<span class="n">divgfshift</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">fft</span><span class="o">.</span><span class="n">ifftshift</span><span class="p">(</span><span class="n">divgfshift</span><span class="p">)</span>
|
|
<span class="n">divg</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">abs</span><span class="p">(</span><span class="n">numpy</span><span class="o">.</span><span class="n">fft</span><span class="o">.</span><span class="n">ifft2</span><span class="p">(</span><span class="n">divgfshift</span><span class="p">))</span>
|
|
<span class="n">divg</span> <span class="o">-=</span> <span class="n">divgmin</span>
|
|
<span class="n">divg</span> <span class="o">=</span> <span class="o">-</span><span class="n">divg</span>
|
|
<span class="nb">print</span><span class="p">(</span><span class="s2">"detail enhancement finished"</span><span class="p">)</span>
|
|
|
|
<span class="n">levels</span> <span class="o">=</span> <span class="mi">0</span>
|
|
<span class="n">mins</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="n">nar</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">nar</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
|
|
<span class="k">while</span> <span class="n">mins</span> <span class="o">>=</span> <span class="n">MINS</span><span class="p">:</span>
|
|
<span class="n">levels</span> <span class="o">+=</span> <span class="mi">1</span>
|
|
<span class="n">mins</span> <span class="o">=</span> <span class="n">mins</span> <span class="o">/</span> <span class="mi">2</span>
|
|
|
|
<span class="n">target</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">zeros_like</span><span class="p">(</span><span class="n">divg</span><span class="p">)</span>
|
|
|
|
<span class="n">solve_pde_multigrid</span><span class="p">(</span>
|
|
<span class="n">divg</span><span class="p">,</span>
|
|
<span class="n">target</span><span class="p">,</span>
|
|
<span class="n">vcycleiterations</span><span class="p">,</span>
|
|
<span class="n">linbcgiterations</span><span class="p">,</span>
|
|
<span class="n">smoothiterations</span><span class="p">,</span>
|
|
<span class="n">mins</span><span class="p">,</span>
|
|
<span class="n">levels</span><span class="p">,</span>
|
|
<span class="n">useplanar</span><span class="p">,</span>
|
|
<span class="n">planar</span><span class="p">,</span>
|
|
<span class="p">)</span>
|
|
|
|
<span class="n">tonemap</span><span class="p">(</span><span class="n">target</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
|
|
|
|
<span class="n">build_mesh</span><span class="p">(</span><span class="n">target</span><span class="p">,</span> <span class="n">br</span><span class="p">)</span>
|
|
|
|
<span class="n">t</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="o">-</span> <span class="n">t</span>
|
|
<span class="nb">print</span><span class="p">(</span><span class="s2">"total time:"</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">t</span><span class="p">)</span> <span class="o">+</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">"</span><span class="p">)</span></div>
|
|
|
|
</pre></div>
|
|
|
|
</article>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<footer class="prev-next-footer d-print-none">
|
|
|
|
<div class="prev-next-area">
|
|
</div>
|
|
</footer>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
</div>
|
|
<footer class="bd-footer-content">
|
|
|
|
<div class="bd-footer-content__inner container">
|
|
|
|
<div class="footer-item">
|
|
|
|
<p class="component-author">
|
|
By Vilem Novak, Alain Pelletier & Contributors
|
|
</p>
|
|
|
|
</div>
|
|
|
|
<div class="footer-item">
|
|
|
|
|
|
<p class="copyright">
|
|
|
|
© Copyright 2025.
|
|
<br/>
|
|
|
|
</p>
|
|
|
|
</div>
|
|
|
|
<div class="footer-item">
|
|
|
|
</div>
|
|
|
|
<div class="footer-item">
|
|
|
|
</div>
|
|
|
|
</div>
|
|
</footer>
|
|
|
|
|
|
</main>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Scripts loaded after <body> so the DOM is not blocked -->
|
|
<script src="../../_static/scripts/bootstrap.js?digest=dfe6caa3a7d634c4db9b"></script>
|
|
<script src="../../_static/scripts/pydata-sphinx-theme.js?digest=dfe6caa3a7d634c4db9b"></script>
|
|
|
|
<footer class="bd-footer">
|
|
</footer>
|
|
</body>
|
|
</html> |