5#ifndef OAKFIELD_STIMULUS_COORDS_H
6#define OAKFIELD_STIMULUS_COORDS_H
18#define STIMULUS_COORD_EPS 1.0e-12
105 double y,
double t,
double *out_x,
double *out_y) {
106 if (out_x == NULL || out_y == NULL) {
135 double y,
double t,
double *out_dx,
137 if (out_dx == NULL || out_dy == NULL) {
146 sim_stimulus_coord_sample_xy(coord, x, y, t, &sample_x, &sample_y);
151 *out_dx = sample_x - cx;
152 *out_dy = sample_y - cy;
168static inline void sim_stimulus_coord_rotate_xy(
double x,
double y,
double angle,
double *out_u,
170 if (out_u == NULL || out_v == NULL) {
174 double s = sin(angle);
175 double c = cos(angle);
176 *out_u = x * c + y * s;
177 *out_v = -x * s + y * c;
193 double dy,
double *out_u,
double *out_v) {
194 if (out_u == NULL || out_v == NULL) {
204 sim_stimulus_coord_rotate_xy(dx, dy, coord->
angle, &ur, &vr);
209 if (fabs(au) <= STIMULUS_COORD_EPS) {
212 if (fabs(av) <= STIMULUS_COORD_EPS) {
233 double dy,
double *out_r,
double *out_theta) {
237 sim_stimulus_coord_elliptic_local(coord, dx, dy, &u, &v);
240 *out_r = hypot(u, v);
242 if (out_theta != NULL) {
243 *out_theta = atan2(v, u);
261 double t,
double *out_r,
double *out_theta) {
265 sim_stimulus_coord_centered_xy(coord, x, y, t, &dx, &dy);
268 *out_r = hypot(dx, dy);
270 if (out_theta != NULL) {
271 *out_theta = atan2(dy, dx);
298 if (!isfinite(coord->
angle)) {
366 if (fabs(coord->
velocity_x) > STIMULUS_COORD_EPS ||
367 fabs(coord->
velocity_y) > STIMULUS_COORD_EPS) {
391 size_t ix,
size_t iy,
double *out_x,
393 if (coord == NULL || out_x == NULL || out_y == NULL) {
421 row_offset >= patch->
height) {
426 row.
y0 = patch->
y0 + row_offset;
433 if (sim_stimulus_coord_xy_at_indices(coord, row.
x0, row.
y0, &row.
x, &row.
y) !=
SIM_RESULT_OK) {
456 const SimField *field,
size_t index,
double *out_x,
462 if (coord == NULL || field == NULL || out_x == NULL || out_y == NULL) {
471 return sim_stimulus_coord_xy_at_indices(coord, ix, iy, out_x, out_y);
494 sim_stimulus_coord_sample_xy(coord, x, y, t, &sample_x, &sample_y);
495 switch (coord->
mode) {
501 sim_stimulus_coord_rotate_xy(sample_x, sample_y, coord->
angle, &u, &v);
507 sim_stimulus_coord_centered_xy(coord, x, y, t, &dx, &dy);
508 return hypot(dx, dy);
512 sim_stimulus_coord_polar(coord, x, y, t, &r, NULL);
518 sim_stimulus_coord_centered_xy(coord, x, y, t, &dx, &dy);
519 return atan2(dy, dx);
525 sim_stimulus_coord_centered_xy(coord, x, y, t, &dx, &dy);
526 sim_stimulus_coord_elliptic_polar(coord, dx, dy, &r, NULL);
532 sim_stimulus_coord_centered_xy(coord, x, y, t, &dx, &dy);
533 double r = hypot(dx, dy);
534 double theta = atan2(dy, dx);
SimStimulusSeparableMode
Combination mode for separable X/Y stimulus coordinates.
Definition coords.h:45
@ SIM_STIMULUS_SEPARABLE_ADD
Definition coords.h:47
@ SIM_STIMULUS_SEPARABLE_MULTIPLY
Definition coords.h:46
SimStimulusCoordAxis
Cartesian axis selector for stimulus coordinates.
Definition coords.h:37
@ SIM_STIMULUS_AXIS_Y
Definition coords.h:39
@ SIM_STIMULUS_AXIS_X
Definition coords.h:38
SimStimulusCoordMode
Spatial coordinate mappings shared by stimulus operators.
Definition coords.h:23
@ SIM_STIMULUS_COORD_RADIAL
Definition coords.h:26
@ SIM_STIMULUS_COORD_AXIS
Definition coords.h:24
@ SIM_STIMULUS_COORD_SPIRAL
Definition coords.h:31
@ SIM_STIMULUS_COORD_ELLIPTIC
Definition coords.h:29
@ SIM_STIMULUS_COORD_AZIMUTH
Definition coords.h:28
@ SIM_STIMULUS_COORD_SEPARABLE
Definition coords.h:30
@ SIM_STIMULUS_COORD_ANGLE
Definition coords.h:25
@ SIM_STIMULUS_COORD_POLAR
Definition coords.h:27
Multidimensional contiguous field abstraction with configurable layout.
SimResult sim_field_index_to_xy(const SimField *field, size_t index, size_t *out_x, size_t *out_y)
Convert a linear element index into 2D coordinates.
SimResult
Return codes shared by libsimcore modules.
Definition field.h:29
@ SIM_RESULT_OK
Definition field.h:30
@ SIM_RESULT_INVALID_ARGUMENT
Definition field.h:31
Shared index-space field patch descriptors and zero-copy patch views.
bool sim_field_patch_is_valid(const SimFieldPatch *patch)
Validate patch bounds, dimensions, and source-field extents.
Public special-function entry points, including Zeta/Xi and q-method helpers.
Rectangular non-empty region of a 2D field index space.
Definition field_patch.h:32
size_t width
Definition field_patch.h:35
size_t height
Definition field_patch.h:36
size_t x0
Definition field_patch.h:33
size_t y0
Definition field_patch.h:34
Owning multidimensional field.
Definition field.h:157
Shared coordinate mapping configuration used by stimulus operators.
Definition coords.h:53
double velocity_y
Definition coords.h:65
double spacing_y
Definition coords.h:61
double center_y
Definition coords.h:63
double angle
Definition coords.h:57
double spiral_phase
Definition coords.h:70
SimStimulusSeparableMode combine
Definition coords.h:56
double origin_x
Definition coords.h:58
double spiral_pitch
Definition coords.h:69
SimStimulusCoordMode mode
Definition coords.h:54
double ellipse_u
Definition coords.h:66
double spiral_angular_velocity
Definition coords.h:71
double velocity_x
Definition coords.h:64
double origin_y
Definition coords.h:59
double spiral_arms
Definition coords.h:68
double spacing_x
Definition coords.h:60
SimStimulusCoordAxis axis
Definition coords.h:55
double ellipse_v
Definition coords.h:67
double center_x
Definition coords.h:62
Precomputed coordinate row state for efficient stimulus patch iteration.
Definition coords.h:77
double y_step
Definition coords.h:84
double sample_y_step
Definition coords.h:88
double y
Definition coords.h:82
double sample_y
Definition coords.h:86
double sample_x
Definition coords.h:85
double x_step
Definition coords.h:83
double sample_x_step
Definition coords.h:87
size_t x0
Definition coords.h:78
size_t width
Definition coords.h:80
size_t y0
Definition coords.h:79
double x
Definition coords.h:81