Contour plotting algorithms module
This module implements the marching squares algorithm and related functions for contour line extraction and rendering.
Calculate marching squares configuration for a cell
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| real(kind=wp), | intent(in) | :: | z1 | |||
| real(kind=wp), | intent(in) | :: | z2 | |||
| real(kind=wp), | intent(in) | :: | z3 | |||
| real(kind=wp), | intent(in) | :: | z4 | |||
| real(kind=wp), | intent(in) | :: | level | |||
| integer, | intent(out) | :: | config |
Extract contour lines from a cell using marching squares
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| integer, | intent(in) | :: | config | |||
| real(kind=wp), | intent(in) | :: | x1 | |||
| real(kind=wp), | intent(in) | :: | y1 | |||
| real(kind=wp), | intent(in) | :: | x2 | |||
| real(kind=wp), | intent(in) | :: | y2 | |||
| real(kind=wp), | intent(in) | :: | x3 | |||
| real(kind=wp), | intent(in) | :: | y3 | |||
| real(kind=wp), | intent(in) | :: | x4 | |||
| real(kind=wp), | intent(in) | :: | y4 | |||
| real(kind=wp), | intent(in) | :: | z1 | |||
| real(kind=wp), | intent(in) | :: | z2 | |||
| real(kind=wp), | intent(in) | :: | z3 | |||
| real(kind=wp), | intent(in) | :: | z4 | |||
| real(kind=wp), | intent(in) | :: | level | |||
| real(kind=wp), | intent(out) | :: | line_points(8) | |||
| integer, | intent(out) | :: | num_lines |
Interpolate the positions where contour crosses cell edges
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| real(kind=wp), | intent(in) | :: | x1 | |||
| real(kind=wp), | intent(in) | :: | y1 | |||
| real(kind=wp), | intent(in) | :: | x2 | |||
| real(kind=wp), | intent(in) | :: | y2 | |||
| real(kind=wp), | intent(in) | :: | x3 | |||
| real(kind=wp), | intent(in) | :: | y3 | |||
| real(kind=wp), | intent(in) | :: | x4 | |||
| real(kind=wp), | intent(in) | :: | y4 | |||
| real(kind=wp), | intent(in) | :: | z1 | |||
| real(kind=wp), | intent(in) | :: | z2 | |||
| real(kind=wp), | intent(in) | :: | z3 | |||
| real(kind=wp), | intent(in) | :: | z4 | |||
| real(kind=wp), | intent(in) | :: | level | |||
| real(kind=wp), | intent(out) | :: | xa | |||
| real(kind=wp), | intent(out) | :: | ya | |||
| real(kind=wp), | intent(out) | :: | xb | |||
| real(kind=wp), | intent(out) | :: | yb | |||
| real(kind=wp), | intent(out) | :: | xc | |||
| real(kind=wp), | intent(out) | :: | yc | |||
| real(kind=wp), | intent(out) | :: | xd | |||
| real(kind=wp), | intent(out) | :: | yd |
Apply marching squares lookup table to get line segments
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| integer, | intent(in) | :: | config | |||
| real(kind=wp), | intent(in) | :: | xa | |||
| real(kind=wp), | intent(in) | :: | ya | |||
| real(kind=wp), | intent(in) | :: | xb | |||
| real(kind=wp), | intent(in) | :: | yb | |||
| real(kind=wp), | intent(in) | :: | xc | |||
| real(kind=wp), | intent(in) | :: | yc | |||
| real(kind=wp), | intent(in) | :: | xd | |||
| real(kind=wp), | intent(in) | :: | yd | |||
| real(kind=wp), | intent(out) | :: | line_points(8) | |||
| integer, | intent(out) | :: | num_lines |
Smooth a polyline using Catmull-Rom spline interpolation
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| integer, | intent(in) | :: | n_in | |||
| real(kind=wp), | intent(in) | :: | x_in(:) | |||
| real(kind=wp), | intent(in) | :: | y_in(:) | |||
| integer, | intent(in) | :: | subdivisions | |||
| integer, | intent(out) | :: | n_out | |||
| real(kind=wp), | intent(out), | allocatable | :: | x_out(:) | ||
| real(kind=wp), | intent(out), | allocatable | :: | y_out(:) |
Catmull-Rom spline interpolation between P1 and P2 t in [0,1], P0/P3 are control points
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| real(kind=wp), | intent(in) | :: | t | |||
| real(kind=wp), | intent(in) | :: | x0 | |||
| real(kind=wp), | intent(in) | :: | y0 | |||
| real(kind=wp), | intent(in) | :: | x1 | |||
| real(kind=wp), | intent(in) | :: | y1 | |||
| real(kind=wp), | intent(in) | :: | x2 | |||
| real(kind=wp), | intent(in) | :: | y2 | |||
| real(kind=wp), | intent(in) | :: | x3 | |||
| real(kind=wp), | intent(in) | :: | y3 | |||
| real(kind=wp), | intent(out) | :: | px | |||
| real(kind=wp), | intent(out) | :: | py |