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;
}
}
}