sclass ScaledDiagram { settable int w = 600; settable int h = 400; int horizontalMargin = 10; 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()); } 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; } }