///|
pub fn calibration_from_reference(
  pixel_distance : Double,
  physical_distance : Double,
) -> Double {
  match try_calibration_from_reference(pixel_distance, physical_distance) {
    Some(scale) => scale
    None => 0.0
  }
}

///|
pub fn try_calibration_from_reference(
  pixel_distance : Double,
  physical_distance : Double,
) -> Double? {
  if pixel_distance > 0.0 &&
    is_finite(pixel_distance) &&
    is_finite(physical_distance) {
    Some(physical_distance / pixel_distance)
  } else {
    None
  }
}

///|
pub fn Point::scale(point : Point, factor : Double) -> Point {
  Point(x=point.x * factor, y=point.y * factor)
}

///|
pub fn Line::offset(line : Line, pixels : Double) -> Line {
  { ..line, c: line.c - pixels }
}