public static bool DrawScales(Graphics graphics, Geometry.Box box, Colors colors, bool fill) { if (!box.IsValid()) { return(false); } LocalCS cs = new LocalCS(box, graphics, fill); // Aabb float min_x = cs.ConvertX(box.Min[0]); float min_y = cs.ConvertY(box.Min[1]); float max_x = cs.ConvertX(box.Max[0]); float max_y = cs.ConvertY(box.Max[1]); // pen for lines Pen penAabb = new Pen(colors.AabbColor, 1); float maxHeight = 20.0f; // font and brush for text Font font = new Font(new FontFamily(System.Drawing.Text.GenericFontFamilies.SansSerif), maxHeight / 2.0f); SolidBrush brushText = new SolidBrush(colors.TextColor); // Scales { float wWidth = graphics.VisibleClipBounds.Width; float wHeight = graphics.VisibleClipBounds.Height; // In CS coordinates double mi_x = cs.InverseConvertX(0); double mi_y = cs.InverseConvertY(wHeight); double ma_x = cs.InverseConvertX(wWidth); double ma_y = cs.InverseConvertY(0); double mima_x = ma_x - mi_x; double mima_y = ma_y - mi_y; // Esstimate numbers of strings for both axes double esst_x = Math.Abs(mima_x) < 10 ? mima_x / 10 : mima_x; float wStrNumX = wWidth / StringWidth(graphics, font, esst_x) / 1.25f; float wStrNumH = wHeight / StringWidth(graphics, font, 1.0) / 2.0f; // Find closest power of 10 lesser than the width and height double pd_x = AbsOuterPow10(mima_x / wStrNumX); double pd_y = AbsOuterPow10(mima_y / wStrNumH); // Find starting x and y values being the first lesser whole // values of the same magnitude, per axis double x = ScaleStart(mi_x, pd_x); double y = ScaleStart(mi_y, pd_y); // Make sure the scale starts outside the view if (x > mi_x) { x -= pd_x; } if (y > mi_y) { y -= pd_y; } // Create the string output pattern, e.g. 0.00 for previously calculated step string xStrFormat = StringFormat(pd_x); string yStrFormat = StringFormat(pd_y); float wd_x = cs.ConvertDimensionX(pd_x); int smallScaleX = SmallScaleSegments(wd_x, 10); float wd_x_step = wd_x / smallScaleX; float wd_x_limit = wd_x - wd_x_step / 2; float wd_y = cs.ConvertDimensionY(pd_y); int smallScaleY = SmallScaleSegments(wd_y, 10); float wd_y_step = wd_y / smallScaleY; float wd_y_limit = wd_y - wd_y_step / 2; // Draw horizontal scale double limit_x = ma_x + pd_x * 1.001; for (; x < limit_x; x += pd_x) { float wx = cs.ConvertX(x); // scale graphics.DrawLine(penAabb, wx, wHeight, wx, wHeight - 5); // value string xStr = Util.ToString(x, xStrFormat); SizeF xStrSize = graphics.MeasureString(xStr, font); float xStrLeft = wx - xStrSize.Width / 2; float xStrTop = wHeight - 5 - xStrSize.Height; graphics.DrawString(xStr, font, brushText, xStrLeft, xStrTop); // small scale for (float wsx = wx + wd_x_step; wsx < wx + wd_x_limit; wsx += wd_x_step) { graphics.DrawLine(penAabb, wsx, wHeight, wsx, wHeight - 3); } } // Draw vertical scale double limit_y = ma_y + pd_y * 1.001; for (; y < limit_y; y += pd_y) { float wy = cs.ConvertY(y); // scale graphics.DrawLine(penAabb, wWidth, wy, wWidth - 5, wy); // value string yStr = Util.ToString(y, yStrFormat); SizeF yStrSize = graphics.MeasureString(yStr, font); float yStrLeft = wWidth - 5 - yStrSize.Width; float yStrTop = wy - yStrSize.Height / 2; graphics.DrawString(yStr, font, brushText, yStrLeft, yStrTop); // small scale for (float wsy = wy - wd_y_step; wsy > wy - wd_y_limit; wsy -= wd_y_step) { graphics.DrawLine(penAabb, wWidth, wsy, wWidth - 3, wsy); } } } return(true); }
private void imageGrid_MouseMove(object sender, System.Windows.Input.MouseEventArgs e) { System.Windows.Point point = e.GetPosition(imageGrid); m_mouseVLine.X1 = point.X; m_mouseVLine.Y1 = 0; m_mouseVLine.X2 = point.X; m_mouseVLine.Y2 = image.ActualHeight; m_mouseVLine.Visibility = Visibility.Visible; m_mouseHLine.X1 = 0; m_mouseHLine.Y1 = point.Y; m_mouseHLine.X2 = image.ActualWidth; m_mouseHLine.Y2 = point.Y; m_mouseHLine.Visibility = Visibility.Visible; if (m_currentBox != null && m_currentBox.IsValid()) { if (m_currentLocalCS == null) { m_currentLocalCS = new LocalCS(m_currentBox, (float)image.ActualWidth, (float)image.ActualHeight); } else { m_currentLocalCS.Reset(m_currentBox, (float)image.ActualWidth, (float)image.ActualHeight); } m_mouseTxt.Text = "(" + Util.ToString(m_currentLocalCS.InverseConvertX(point.X)) + " " + Util.ToString(m_currentLocalCS.InverseConvertY(point.Y)) + ")"; Canvas.SetLeft(m_mouseTxt, point.X + 2); Canvas.SetTop(m_mouseTxt, point.Y + 2); m_mouseTxt.Visibility = Visibility.Visible; } else { m_mouseTxt.Visibility = Visibility.Hidden; } if (m_mouseDown) { if (m_pointDown[0] != point.X || m_pointDown[1] != point.Y) { double ox = m_pointDown[0]; double oy = m_pointDown[1]; double x = Math.Min(Math.Max(point.X, 0), image.ActualWidth); double y = Math.Min(Math.Max(point.Y, 0), image.ActualHeight); double w = Math.Abs(x - ox); double h = Math.Abs(y - oy); double prop = h / w; double iProp = image.ActualHeight / image.ActualWidth; if (prop < iProp) { h = iProp * w; } else if (prop > iProp) { w = h / iProp; } double l = ox; double t = oy; if (ox <= x) { if (ox + w > image.ActualWidth) { w = image.ActualWidth - ox; h = iProp * w; } } else { if (ox - w < 0) { w = ox; h = iProp * w; } l = ox - w; } if (oy <= y) { if (oy + h > image.ActualHeight) { h = image.ActualHeight - oy; w = h / iProp; } } else { if (oy - h < 0) { h = oy; w = h / iProp; } t = oy - h; } if (w > 0 && h > 0) { Canvas.SetLeft(m_selectionRect, l); Canvas.SetTop(m_selectionRect, t); m_selectionRect.Width = w; m_selectionRect.Height = h; m_selectionRect.Visibility = Visibility.Visible; } } } }
private void imageGrid_MouseMove(object sender, System.Windows.Input.MouseEventArgs e) { System.Windows.Point point = e.GetPosition(imageGrid); m_mouseVLine.X1 = point.X; m_mouseVLine.Y1 = 0; m_mouseVLine.X2 = point.X; m_mouseVLine.Y2 = image.ActualHeight; m_mouseVLine.Visibility = Visibility.Visible; m_mouseHLine.X1 = 0; m_mouseHLine.Y1 = point.Y; m_mouseHLine.X2 = image.ActualWidth; m_mouseHLine.Y2 = point.Y; m_mouseHLine.Visibility = Visibility.Visible; if (m_currentBox != null && m_currentBox.IsValid()) { // TODO: pass correct fill parameter later when point plot is implemented bool fill = true; if (m_currentLocalCS == null) { m_currentLocalCS = new LocalCS(m_currentBox, (float)image.ActualWidth, (float)image.ActualHeight, fill); } else { m_currentLocalCS.Reset(m_currentBox, (float)image.ActualWidth, (float)image.ActualHeight, fill); } m_mouseTxt.Text = "(" + Util.ToString(m_currentLocalCS.InverseConvertX(point.X)) + " " + Util.ToString(m_currentLocalCS.InverseConvertY(point.Y)) + ")"; Canvas.SetLeft(m_mouseTxt, point.X + 2); Canvas.SetTop(m_mouseTxt, point.Y + 2); m_mouseTxt.Visibility = Visibility.Visible; } else { m_mouseTxt.Visibility = Visibility.Hidden; } if (m_mouseDown) { if (m_pointDown[0] != point.X || m_pointDown[1] != point.Y) { double originx = m_pointDown[0]; double originy = m_pointDown[1]; double x = Math.Min(Math.Max(point.X, 0), image.ActualWidth); double y = Math.Min(Math.Max(point.Y, 0), image.ActualHeight); double width = Math.Abs(x - originx); double height = Math.Abs(y - originy); if (originx > x) { originx -= width; } if (originy > y) { originy -= height; } Canvas.SetLeft(m_selectionRect, originx); m_selectionRect.Width = width; Canvas.SetTop(m_selectionRect, originy); m_selectionRect.Height = height; m_selectionRect.Visibility = Visibility.Visible; } } }