public Types.Rectangle GetBounds( Renderers.Renderer renderer ) { if( _bounds == null ) { _bounds = CalculateBounds( renderer ); if( _bounds == null ) { throw new InvalidOperationException(); } } return _bounds; }
public BoundsMarker( Types.Rectangle rectangle ) { _rectangle = rectangle; }
internal PrimitivesVisitor( GdiPlusRenderer renderer, Graphics g, Types.Rectangle clip ) { _renderer = renderer; _graphics = g; _clip = clip; }
private bool InClip( Primitives.VisualItem item ) { if( _clip == null ) { return true; } PointF tl = new PointF( (float) _clip.Left, (float) _clip.Top ); PointF br = new PointF( (float) _clip.Right, (float) _clip.Bottom ); PointF[] pts = new PointF[] { tl, br }; _graphics.TransformPoints( CoordinateSpace.World, CoordinateSpace.Device, pts ); Types.Rectangle clip = new Types.Rectangle( pts[0].X, pts[0].Y, pts[1].X - pts[0].X, pts[1].Y - pts[0].Y ); return Types.Rectangle.Overlap( item.GetBounds( _renderer ), clip ); }
public Primitives.Container Create( IData data, Settings settings ) { if( data == null ) { throw new ArgumentNullException( "data" ); } if( settings == null ) { throw new ArgumentNullException( "settings" ); } if( data.ColumnCount < 2 ) { throw new ArgumentException( "Line data must have at least two columns.", "data" ); } Primitives.Container container = new Primitives.Container(); Primitives.BoundsMarker bounds = new Primitives.BoundsMarker( new Types.Rectangle( 0, 0, settings.Width, settings.Height ) ); bounds.Style.Add( "GraphContainer" ); container.AddBack( bounds ); Primitives.Container lines = new Primitives.Container(); double minHorzData = double.MaxValue; double maxHorzData = double.MinValue; for( int i = 0; i < data.RowCount; ++i ) { double v = data[i, 0]; minHorzData = Math.Min( minHorzData, v ); maxHorzData = Math.Max( maxHorzData, v ); } double minVertData = double.MaxValue; double maxVertData = double.MinValue; for( int i = 0; i < data.RowCount; ++i ) { for( int j = 1; j < data.ColumnCount; ++j ) { double v = data[i, j]; minVertData = Math.Min( minVertData, v ); maxVertData = Math.Max( maxVertData, v ); } } if( maxVertData == minVertData ) { maxVertData = minVertData + 1; } double maxExtent = Math.Max( settings.Width, settings.Height); double textHeight = 2; double border = 20; Types.Rectangle visibleArea = new Types.Rectangle( border, border, settings.Width - border * 2, settings.Height - border * 2 - textHeight ); double zero = visibleArea.Bottom + minVertData / (maxVertData - minVertData) * visibleArea.Height; for( int col = 1; col < data.ColumnCount; ++col ) { Primitives.Container line = new Primitives.Container(); List<Types.Point> points = new List<Types.Point>(); List<Primitives.Path.Command> pathCommands = new List<Primitives.Path.Command>(); pathCommands.Add( new Primitives.Path.Move( new Types.Point( visibleArea.X, zero ) ) ); for( int row = 0; row < data.RowCount; ++row ) { double y = data[row, col]; double x = data[row, 0]; x = visibleArea.X + (x - minHorzData) / (maxHorzData - minHorzData) * visibleArea.Width; y = visibleArea.Bottom - (y - minVertData) / (maxVertData - minVertData) * visibleArea.Height; Primitives.Path.Command pathCommand = new Primitives.Path.Line( new Types.Point( x, y ) ); pathCommands.Add( pathCommand ); } pathCommands.Add( new Primitives.Path.Line( new Types.Point( visibleArea.Right, zero ) ) ); pathCommands.Add( new Primitives.Path.Close() ); Primitives.Path path = new Primitives.Path( pathCommands.ToArray() ); path.Style.Add( "GraphPiece" ); path.Style.AddExtra( "RowIndex", (col - 1).ToString() ); path.Style.AddExtra( "RowCount", (data.ColumnCount - 1).ToString() ); line.AddBack( path ); lines.AddBack( line ); } container.AddBack( lines ); double available = settings.Height - visibleArea.Bottom; for( int i = 0; i < data.RowCount; ++i ) { string label = data.GetRowExtra( i, "LABEL", null ); if( label != null ) { double x = data[i, 0]; x = visibleArea.X + (x - minHorzData) / (maxHorzData - minHorzData) * visibleArea.Width; Primitives.Text text = new Primitives.Text( label, new Types.Point( x, visibleArea.Bottom + available / 5 ), Primitives.Text.Position.TopCenter ); text.FontSizePoints = textHeight / 2; text.Style.Add( "GraphText" ); container.AddBack( text ); } } return container; }
internal void DirtyBounds() { _bounds = null; if( Parent != null ) { Parent.DirtyBounds(); } }