Table of Contents

Interface ICoordinateTransformer

Namespace
FlowGraph.Core.Rendering
Assembly
FlowGraph.Core.dll

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

double

OffsetY

The Y component of the current pan offset in viewport coordinates.

double OffsetY { get; }

Property Value

double

Zoom

The current zoom level (1.0 = 100%, 2.0 = 200%, 0.5 = 50%).

double Zoom { get; }

Property Value

double

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

canvasX double
canvasY double

Returns

Point

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

canvasDeltaX double
canvasDeltaY double

Returns

Point

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

canvasX double

X coordinate in canvas space.

canvasY double

Y coordinate in canvas space.

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

canvasDeltaX double

X delta in canvas space.

canvasDeltaY double

Y delta in canvas space.

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

screenX double
screenY double

Returns

Point

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

screenDeltaX double
screenDeltaY double

Returns

Point

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

viewportX double

X coordinate in viewport space.

viewportY double

Y coordinate in viewport space.

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

viewportDeltaX double

X delta in viewport space.

viewportDeltaY double

Y delta in viewport space.

Returns

Point

The equivalent delta in canvas coordinates.