Interface ICoordinateTransformer
Provides bidirectional coordinate transformation between canvas and viewport space.
Coordinate Spaces:
- Canvas Space: Logical coordinates where graph elements live. Node positions (e.g., node.Position.X = 100) are in canvas space. These values are stable regardless of zoom/pan.
- Viewport Space: Coordinates within the viewport window (the visible area). The viewport origin (0,0) is the top-left corner of the visible canvas area. These coordinates change as the user zooms and pans.
IMPORTANT - Viewport vs Control Coordinates:
- Viewport coordinates assume (0,0) is at the viewport's visual origin.
- Control coordinates (e.g., from
e.GetPosition(RootPanel)) may have an offset if the canvas is not at (0,0) within the control (e.g., due to toolbars, margins). - For pointer events, prefer
e.GetPosition(MainCanvas)which gives canvas coords directly, or use the viewport position if you need to account for the transform manually.
Transform Formulas:
ViewportToCanvas: canvasPoint = (viewportPoint - offset) / zoom
CanvasToViewport: viewportPoint = canvasPoint * zoom + offset
Inspired by:
- react-diagrams: CanvasEngine.getRelativeMousePoint(), getRelativePoint()
- Konva.js: Stage.getPointerPosition() vs Node.getRelativePointerPosition()
- AnyChart: scale.transform() / scale.inverseTransform()
public interface ICoordinateTransformer
- Extension Methods
Properties
OffsetX
The X component of the current pan offset in viewport coordinates.
double OffsetX { get; }
Property Value
OffsetY
The Y component of the current pan offset in viewport coordinates.
double OffsetY { get; }
Property Value
Zoom
The current zoom level (1.0 = 100%, 2.0 = 200%, 0.5 = 50%).
double Zoom { get; }
Property Value
Methods
CanvasToScreen(double, double)
Transforms a point from canvas space to screen space.
[Obsolete("Use CanvasToViewport instead. 'Screen' terminology was ambiguous - see ICoordinateTransformer docs.")]
Point CanvasToScreen(double canvasX, double canvasY)
Parameters
Returns
Remarks
DEPRECATED: The term "Screen" is ambiguous. Use CanvasToViewport(double, double) instead.
CanvasToScreenDelta(double, double)
Transforms a delta/vector from canvas space to screen space.
[Obsolete("Use CanvasToViewportDelta instead. 'Screen' terminology was ambiguous.")]
Point CanvasToScreenDelta(double canvasDeltaX, double canvasDeltaY)
Parameters
Returns
CanvasToViewport(double, double)
Transforms a point from canvas space to viewport space.
When to use:
- Drawing directly to a DrawingContext (bypassing visual tree transforms)
- Positioning overlay UI elements relative to the viewport
- Calculating visible bounds in viewport space for culling
When NOT to use:
- Positioning elements with Canvas.SetLeft/SetTop inside a transformed container - those should use canvas coordinates directly
Formula: viewportPoint = canvasPoint * zoom + offset
Point CanvasToViewport(double canvasX, double canvasY)
Parameters
Returns
- Point
The equivalent point in viewport coordinates.
CanvasToViewportDelta(double, double)
Transforms a delta/vector from canvas space to viewport space. Unlike point transforms, this only applies zoom (not offset).
Formula: viewportDelta = canvasDelta * zoom
Point CanvasToViewportDelta(double canvasDeltaX, double canvasDeltaY)
Parameters
Returns
- Point
The equivalent delta in viewport coordinates.
ScreenToCanvas(double, double)
Transforms a point from screen space to canvas space.
[Obsolete("Use ViewportToCanvas instead. 'Screen' terminology was ambiguous - see ICoordinateTransformer docs.")]
Point ScreenToCanvas(double screenX, double screenY)
Parameters
Returns
Remarks
DEPRECATED: The term "Screen" is ambiguous. Use ViewportToCanvas(double, double) instead,
or better yet, use e.GetPosition(MainCanvas) for pointer events which gives canvas coords directly.
ScreenToCanvasDelta(double, double)
Transforms a delta/vector from screen space to canvas space.
[Obsolete("Use ViewportToCanvasDelta instead. 'Screen' terminology was ambiguous.")]
Point ScreenToCanvasDelta(double screenDeltaX, double screenDeltaY)
Parameters
Returns
ViewportToCanvas(double, double)
Transforms a point from viewport space to canvas space.
When to use:
- Converting viewport-relative positions to canvas coordinates
- Inverse calculations from CanvasToViewport operations
When NOT to use:
- For pointer events - prefer
e.GetPosition(MainCanvas)which gives canvas coords directly - When the input is from RootPanel and canvas has an offset within RootPanel
Formula: canvasPoint = (viewportPoint - offset) / zoom
Point ViewportToCanvas(double viewportX, double viewportY)
Parameters
Returns
- Point
The equivalent point in canvas coordinates.
ViewportToCanvasDelta(double, double)
Transforms a delta/vector from viewport space to canvas space. Unlike point transforms, this only applies zoom (not offset).
When to use:
- Converting drag distances to canvas movement amounts
- Zoom-adjusted displacement calculations
- Measuring viewport distances in canvas units
Formula: canvasDelta = viewportDelta / zoom
Point ViewportToCanvasDelta(double viewportDeltaX, double viewportDeltaY)
Parameters
Returns
- Point
The equivalent delta in canvas coordinates.