smart_arrays_contour_finder 2.0.4

Smart Arrays Contour Finder #

What the package can do for you #

The purpose of this package is to contour the three-dimensional surface represented by the values f(x,y) of a matrix with coordinate axes x and y. The detected contour lines are passed on to a user-provided renderer e.g. for graphical displaying the contours.

Example #

The major API functionalities #

  • Class ContourFinder with the method findContour to contour a matrix.

  • Abstract class ContourRenderer with the method drawContourLine to be provided by the user to render the found contours, e.g. on a graphics screen.

smart_arrays_base: Basic functions for 1D and 2D arrays

smart_arrays_numerics: Numerics with 1D and 2D arrays

smart_arrays_compress: Compress 1D and 2D arrays to a smaller size.

smart_arrays_sample_data: Computes 1D and 2D arrays containing sample data.

smart_arrays_dbstore: Store 1D and 2D arrays along with metadata on the local device.

smart_arrays_plot_polyline: Plot 1D arrays as polyline along with axes and more.

smart_arrays_peaks: Detect peaks in 1D and 2D arrays.

smart_arrays_lmfit: Fits (x, y) data given as arrays to a specified model function using the Levenberg-Marquardt algorithm.

smart_lorentz-gauss: Compute Lorentz-Gauss (pseudo-Voigt) line shapes.

smart_signal_processing: Fourier transform and more of arrays.

smart_dialogs: Easy-to-use dialogs in Web applications

Smart Dialogs for Web Apps #

Version history #

2.0.0 - 2019-08-24 First version available on pub.dev

2.0.1 - 2019-09-01 Documentation update

2.0.2 - 2019-09-14 Example now uses a function from package smart_arrays_sample_data.

2.0.3 - 2019-09-14 Account for changed "getters" in smart_arrays_sample_data

2.0.4 - 2019-09-15 Documentation update

example/example.dart

import 'dart:html';
import 'dart:typed_data';
import 'dart:math' as math;
import 'package:smart_arrays_contour_finder/smart_arrays_contour_finder.dart';
import 'package:smart_arrays_base/smart_arrays_base.dart';
import 'package:smart_arrays_sample_data/smart_arrays_sample_data.dart';

/// Example how to use the [ContourFinder] of the package
/// [smart_arrays_contour_finder]. First, a matrix to be contoured is computed.
/// Then [ContourFinder.findContour] is employed to search for the contours
/// and to graphically display the contours using the provided
/// [SampleContourRenderer]. You can execute this example by downloading the
/// files [example.dart.js] and [example.html], and executing the latter one in
/// your browser.
main() {
  // First create a sample 2D matrix to be contoured: f(x,y)=x*sin(y)+y*cos(x)
  XsinYcos2D mixedSin2D = XsinYcos2D(400, 600, 3 * math.pi, 3 * math.pi);

  // Compute equally spaced contour levels
  final int NLEVELS = 12;
  MinMax minmax = Array2D.getMinMax(mixedSin2D.matrix);
  double levelDelta = (minmax.maxValue - minmax.minValue).abs() / (NLEVELS - 1);
  Float64List levels = Float64List(NLEVELS);
  for (int i = 0; i < NLEVELS; i++) {
    levels[i] = (minmax.minValue + i * levelDelta) * 0.95;
  }

  // construct a ContourFinder emitting the found contours to the sample renderer.
  ContourFinder contourFinder = ContourFinder(SampleContourRenderer());

  // Start contour search and rendering using [ContourRendererSample].
  contourFinder.findContour(
      mixedSin2D.matrix, // in this matrix
      0, // from this row
      mixedSin2D.matrix.length - 1, // to this row
      0, // from this col
      mixedSin2D.matrix[0].length - 1, // to this col
      mixedSin2D.yRowCoordinates, // normalized row coordinates (0...1)
      mixedSin2D.xColCoordinates, // normalized col coordinates (0...1)
      levels.length, // number of levels
      levels); // contour levels to draw
}

/// A sample countour renderer drawing the contours into the [CanvasElement].
/// defined in [example.html]. Negative contours are drawn in magenta, positive
/// ones in blue.
class SampleContourRenderer implements ContourRenderer {
  CanvasRenderingContext2D c2d;
  CanvasElement contourCanvas;
  int last_x1, last_y1, last_x2, last_y2;
  // size and location of drawing area:
  int dataAreaWidth, dataAreaHeight, dataAreaX = 0, dataAreaY = 0;
  bool rotate90 = true; // optional rotation of contour plot

  /// Sets up the graphics 2D context to which drawing will be performed.
  SampleContourRenderer() {
    Element ccel = document.getElementById("contour_canvas");
    contourCanvas = ccel; // cast
    contourCanvas.style
      ..position = "absolute"
      ..backgroundColor = "transparent";
    c2d = contourCanvas.getContext("2d");

    dataAreaWidth = contourCanvas.width;
    dataAreaHeight = contourCanvas.height;
  }

  /// Implements the ContourRenderer: draws the specified contour line
  /// belonging to [contourLevel] into the graphics 2D context. [contourLevel]
  /// is needed to color the line: Here we give a different color to positive
  /// and negative levels.
  void drawContourLine(double startX, double startY, double endX, double endY,
      double contourLevel) {
    // Some apps need to rotate the contour by -90 deg. around the data area center
    // to obtain the typical contour representation. This code shows how to do that.
    // The rows will be drawn from the botton to the top, i.e. the biggest row
    // number will be drawn at the top of the data area.
    // This code also applies the data area origin, and accounts for the data area
    // width/height ratio.
    int x1 = (startY * dataAreaWidth).round() + dataAreaX;
    int x2 = (endY * dataAreaWidth).round() + dataAreaX;
    int y1 = ((1 - startX) * dataAreaHeight).round() + dataAreaY;
    int y2 = ((1 - endX) * dataAreaHeight).round() + dataAreaY;

    // skip lines that don't change the plot.
    // This speeds up drawing as long as we don't use compressed data.
    if (x1 == x2 && y1 == y2) {
      return;
    }

    if (last_x1 != null) {
      // would overlap last line
      if ((last_x1 == x1 && last_x2 == x2) &&
          (last_y1 == y1 && last_y2 == y2)) {
        return;
      }
    }

    last_x1 = x1;
    last_x2 = x2;
    last_y1 = y1;
    last_y2 = y2;

    // Draw directly into canvas
    c2d.beginPath();
    c2d.moveTo(x1, y1);
    c2d.lineTo(x2, y2);

    if (contourLevel < 0) {
      c2d.strokeStyle = "magenta";
    } else {
      c2d.strokeStyle = "blue";
    }

    c2d.lineWidth = 1;
    c2d.stroke();
  }
}

Use this package as a library

1. Depend on it

Add this to your package's pubspec.yaml file:


dependencies:
  smart_arrays_contour_finder: ^2.0.4

2. Install it

You can install packages from the command line:

with pub:


$ pub get

with Flutter:


$ flutter pub get

Alternatively, your editor might support pub get or flutter pub get. Check the docs for your editor to learn more.

3. Import it

Now in your Dart code, you can use:


import 'package:smart_arrays_contour_finder/smart_arrays_contour_finder.dart';
  
Popularity:
Describes how popular the package is relative to other packages. [more]
0
Health:
Code health derived from static analysis. [more]
100
Maintenance:
Reflects how tidy and up-to-date the package is. [more]
100
Overall:
Weighted score of the above. [more]
50
Learn more about scoring.

We analyzed this package on Sep 15, 2019, and provided a score, details, and suggestions below. Analysis was completed with status completed using:

  • Dart: 2.5.0
  • pana: 0.12.21

Platforms

Detected platforms: Flutter, web, other

No platform restriction found in primary library package:smart_arrays_contour_finder/smart_arrays_contour_finder.dart.

Dependencies

Package Constraint Resolved Available
Direct dependencies
Dart SDK >=2.4.0 <3.0.0
build_runner ^1.6.2 1.7.0
build_web_compilers ^2.0.0 2.4.0
pedantic ^1.7.0 1.8.0+1
smart_arrays_base ^2.0.9 2.0.9
smart_arrays_sample_data ^2.0.3 2.0.3
Transitive dependencies
analyzer 0.38.2
archive 2.0.10
args 1.5.2
async 2.3.0
bazel_worker 0.1.22
build 1.1.6
build_config 0.4.1+1
build_daemon 2.1.0
build_modules 2.5.0
build_resolvers 1.0.7
build_runner_core 4.0.0
built_collection 4.2.2
built_value 6.7.1
charcode 1.1.2
checked_yaml 1.0.2
code_builder 3.2.0
collection 1.14.12
convert 2.1.1
crypto 2.1.3
csslib 0.16.1
dart_style 1.2.10
fixnum 0.10.9
front_end 0.1.24
glob 1.1.7
graphs 0.2.0
html 0.14.0+2
http 0.12.0+2
http_multi_server 2.1.0
http_parser 3.1.3
io 0.3.3
js 0.6.1+1
json_annotation 3.0.0
kernel 0.3.24
logging 0.11.3+2
matcher 0.12.5
meta 1.1.7
mime 0.9.6+3
package_config 1.1.0
package_resolver 1.0.10
path 1.6.4
pool 1.4.0
protobuf 0.14.1
pub_semver 1.4.2
pubspec_parse 0.1.5
quiver 2.0.5
scratch_space 0.0.4
shelf 0.7.5
shelf_web_socket 0.2.3
smart_arrays_compress 2.0.9
smart_arrays_plot_polyline 2.1.0
source_maps 0.10.8
source_span 1.5.5
stack_trace 1.9.3
stream_channel 2.0.0
stream_transform 0.0.19
string_scanner 1.0.5
term_glyph 1.1.0
timing 0.1.1+2
typed_data 1.1.6
watcher 0.9.7+12
web_socket_channel 1.0.15
yaml 2.1.16