sclass ScaledDiagram { settable int w = 600; settable int h = 400; settable int horizontalMargin = 10; settable int verticalMargin = 10; settable DoubleRange horizontalRange; settable DoubleRange verticalRange; // Ranges in pixels that we can paint in (image size minus margins) DoubleRange xRange() { ret doubleRange(horizontalMargin, w-horizontalMargin); } DoubleRange yRange() { ret doubleRange(h-verticalMargin, verticalMargin); } double xToScreen(double x) { ret transformBetweenDoubleRanges(x, horizontalRange(), xRange()); } double yToScreen(double y) { ret transformBetweenDoubleRanges(y, verticalRange(), yRange()); } int xToScreen_int(double x) { ret iround(xToScreen(x)); } int yToScreen_int(double y) { ret iround(yToScreen(y)); } double xFromScreen(double x) { ret transformBetweenDoubleRanges(x, xRange(), horizontalRange()); } double yFromScreen(double y) { ret transformBetweenDoubleRanges(y, yRange(), verticalRange()); } public int getWidth() { ret w; } public int getHeight() { ret h; } bool hasScale() { ret horizontalRange != null && verticalRange != null; } }