comparison doodle/tk/pixel_model.d @ 79:535bae7a7305

Checkpoint
author "David Bryant <bagnose@gmail.com>"
date Sun, 15 Aug 2010 23:18:05 +0930
parents 024a5608087f
children
comparison
equal deleted inserted replaced
78:024a5608087f 79:535bae7a7305
22 22
23 // Choose the centre of the canvas as the centre of the view 23 // Choose the centre of the canvas as the centre of the view
24 _viewCentreModel = _canvasBoundsModel.centre; 24 _viewCentreModel = _canvasBoundsModel.centre;
25 } 25 }
26 26
27 void consolidateCanvasBounds(in Rectangle requiredCanvasBounds) { 27 void consolidateCanvasBounds(in Rectangle requiredCanvasBounds) { _canvasBoundsModel = screenToModel(_viewBoundsScreen) | requiredCanvasBounds; }
28 _canvasBoundsModel = screenToModel(_viewBoundsScreen) | requiredCanvasBounds; 28 void canvasAccommodate(in Rectangle bounds) { _canvasBoundsModel = _canvasBoundsModel | bounds; }
29 }
30
31 void canvasAccommodate(in Rectangle bounds) {
32 _canvasBoundsModel = _canvasBoundsModel | bounds;
33 }
34 29
35 void zoomRelative(in double factor, in Point screenDatum) { 30 void zoomRelative(in double factor, in Point screenDatum) {
36 // Work out screen distance from current centre to datum, 31 // Work out screen distance from current centre to datum,
37 // Do the zoom, then work out the new centre that keeps the 32 // Do the zoom, then work out the new centre that keeps the
38 // screen distance the same 33 // screen distance the same
44 } 39 }
45 40
46 void panRelativeScreen(in Vector screenDisplacement) { _viewCentreModel = _viewCentreModel + screenToModel(screenDisplacement); } 41 void panRelativeScreen(in Vector screenDisplacement) { _viewCentreModel = _viewCentreModel + screenToModel(screenDisplacement); }
47 void panRelativeModel(in Vector modelDisplacement) { _viewCentreModel = _viewCentreModel + modelDisplacement; } 42 void panRelativeModel(in Vector modelDisplacement) { _viewCentreModel = _viewCentreModel + modelDisplacement; }
48 43
49 // For userZoom 1.0 -> 100% means the presentation on the screen is 44 // For userZoom 1.0 -> 100% means the presentation on the screen is one-to-one with real-life
50 // one-to-one with real-life 45 double userZoom(in double pixelsPerMillimetre) const { return _zoom / pixelsPerMillimetre; }
51 double userZoom(in double screensPerMillimetre) const { return _zoom / screensPerMillimetre; }
52 double zoom() const { return _zoom; } 46 double zoom() const { return _zoom; }
53 Rectangle viewBoundsScreen() const { return _viewBoundsScreen; } 47 Rectangle viewBoundsScreen() const { return _viewBoundsScreen; }
48 Rectangle viewBoundsModel() const { return screenToModel(_viewBoundsScreen); }
54 Rectangle canvasBoundsModel() const { return _canvasBoundsModel; } 49 Rectangle canvasBoundsModel() const { return _canvasBoundsModel; }
50 Rectangle canvasBoundsScreen() const { return modelToScreen(_canvasBoundsModel); }
55 51
56 Point modelToScreen(in Point model) const { return _viewBoundsScreen.centre + _zoom * (model - _viewCentreModel); } 52 Point modelToScreen(in Point model) const { return _viewBoundsScreen.centre + _zoom * (model - _viewCentreModel); }
57 Point screenToModel(in Point screen) const { return _viewCentreModel + (screen - _viewBoundsScreen.centre) / _zoom; } 53 Point screenToModel(in Point screen) const { return _viewCentreModel + (screen - _viewBoundsScreen.centre) / _zoom; }
58 Vector modelToScreen(in Vector model) const { return _zoom * model; } 54 Vector modelToScreen(in Vector model) const { return _zoom * model; }
59 Vector screenToModel(in Vector screen) const { return screen / _zoom; } 55 Vector screenToModel(in Vector screen) const { return screen / _zoom; }
60 Rectangle modelToScreen(in Rectangle model) const { return Rectangle(modelToScreen(model.position), modelToScreen(model.size)); } 56 Rectangle modelToScreen(in Rectangle model) const { return Rectangle(modelToScreen(model.position), modelToScreen(model.size)); }
61 Rectangle screenToModel(in Rectangle model) const { return Rectangle(screenToModel(model.position), screenToModel(model.size)); } 57 Rectangle screenToModel(in Rectangle model) const { return Rectangle(screenToModel(model.position), screenToModel(model.size)); }
62 58
63 private { 59 private {
64 static double clampZoom(in double zoom) { return clamp(zoom, 0.1, 10.0); } 60 static double clampZoom(in double zoom) { return clamp(zoom, 1e-1, 1e2); }
65 61
66 // Screen units are pixels 62 // Screen units are pixels
67 // Model units are millimetres 63 // Model units are millimetres
68 double _zoom; // pixels-per-millimetre 64 double _zoom; // pixels-per-millimetre
69 Rectangle _viewBoundsScreen; // bounds of the viewport in screen space 65 Rectangle _viewBoundsScreen; // bounds of the viewport in screen space