using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; namespace Microsoft.Research.DynamicDataDisplay.ViewportRestrictions { /// /// Represents a restriction in which actual visible rect's proportions depends on /// actual output rect's proportions. /// public sealed class PhysicalProportionsRestriction : ViewportRestriction { /// /// Initializes a new instance of the class. /// public PhysicalProportionsRestriction() { } /// /// Initializes a new instance of the class with the given proportion ratio. /// /// The proportion ratio. public PhysicalProportionsRestriction(double proportionRatio) { ProportionRatio = proportionRatio; } private double proportionRatio = 1.0; /// /// Gets or sets the proportion ratio. /// Default value is 1.0. /// /// The proportion ratio. public double ProportionRatio { get { return proportionRatio; } set { if (proportionRatio != value) { proportionRatio = value; RaiseChanged(); } } } /// /// Applies the restriction. /// /// Previous data rectangle. /// Proposed data rectangle. /// The viewport, to which current restriction is being applied. /// New changed visible rectangle. public override DataRect Apply(DataRect previousDataRect, DataRect proposedDataRect, Viewport2D viewport) { Rect output = viewport.Output; if (output.Width == 0 || output.Height == 0) return proposedDataRect; double screenRatio = output.Width / output.Height; double viewportRatio = proposedDataRect.Width / proposedDataRect.Height; double ratio = screenRatio / viewportRatio; double width = proportionRatio * proposedDataRect.Width * ratio; double height = proposedDataRect.Height; if (width < proposedDataRect.Width) { height = proposedDataRect.Height / proportionRatio / ratio; width = proposedDataRect.Width; } Point center = proposedDataRect.GetCenter(); Rect res = RectExtensions.FromCenterSize(center, width, height); return res; } } }