Custom Gain Tutorial

You can create your own Gain.

Here, we will define a FocalPoint that generates a single focus just like Focus.

use autd3::prelude::*;
use autd3::core::derive::*;

#[derive(Gain, Debug)]
pub struct FocalPoint {
    pos: Point3,
}

pub struct Context {
    pos: Point3,
    wavenumber: f32,
}

impl GainContext for Context {
    fn calc(&self, tr: &Transducer) -> Drive {
        (
            Phase::from(-(self.pos - tr.position()).norm() * self.wavenumber * rad),
            EmitIntensity::MAX,
        )
            .into()
    }
}

impl GainContextGenerator for FocalPoint {
    type Context = Context;

    fn generate(&mut self, device: &Device) -> Self::Context {
        Context {
            pos: self.pos,
            wavenumber: device.wavenumber(),
        }
    }
}

impl Gain for FocalPoint {
    type G = FocalPoint;

    fn init(
        self,
        _geometry: &Geometry,
        _filter: Option<&HashMap<usize, BitVec>>,
    ) -> Result<Self::G, GainError> {
        Ok(self)
    }
}

#[allow(unused_variables)]
fn main() { 
}
{{#include ../../../codes/Users_Manual/advanced/custom_gain_0.cpp}}
{{#include ../../../codes/Users_Manual/advanced/custom_gain_0.cs}}
{{#include ../../../codes/Users_Manual/advanced/custom_gain_0.py}}