PageRenderTime 32ms CodeModel.GetById 15ms RepoModel.GetById 1ms app.codeStats 0ms

/Diplom/DynamicDataDisplay/Main/src/DynamicDataDisplay/Transforms/CoordinateTransform.cs

#
C# | 187 lines | 116 code | 29 blank | 42 comment | 2 complexity | 01d6d1fef52a144477cbd74b8781f55a MD5 | raw file
Possible License(s): CC-BY-SA-3.0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Windows;
  6. using Microsoft.Research.DynamicDataDisplay.Common;
  7. using System.Diagnostics;
  8. using System.Windows.Media;
  9. namespace Microsoft.Research.DynamicDataDisplay
  10. {
  11. /// <summary>
  12. /// A central class in 2d coordinate transformation in DynamicDataDisplay.
  13. /// Provides methods to transform point from one coordinate system to another.
  14. /// Should be immutable.
  15. /// </summary>
  16. public sealed class CoordinateTransform
  17. {
  18. private CoordinateTransform(DataRect visibleRect, Rect screenRect)
  19. {
  20. this.visibleRect = visibleRect;
  21. this.screenRect = screenRect;
  22. rxToScreen = screenRect.Width / visibleRect.Width;
  23. ryToScreen = screenRect.Height / visibleRect.Height;
  24. cxToScreen = visibleRect.XMin * rxToScreen - screenRect.Left;
  25. cyToScreen = screenRect.Height + screenRect.Top + visibleRect.YMin * ryToScreen;
  26. rxToData = visibleRect.Width / screenRect.Width;
  27. ryToData = visibleRect.Height / screenRect.Height;
  28. cxToData = screenRect.Left * rxToData - visibleRect.XMin;
  29. cyToData = visibleRect.Height + visibleRect.YMin + screenRect.Top * ryToData;
  30. }
  31. #region Coeffs
  32. double rxToScreen;
  33. double ryToScreen;
  34. double cxToScreen;
  35. double cyToScreen;
  36. double rxToData;
  37. double ryToData;
  38. double cxToData;
  39. double cyToData;
  40. #endregion
  41. #region Creation methods
  42. internal static CoordinateTransform FromRects(DataRect visibleRect, Rect screenRect)
  43. {
  44. CoordinateTransform result = new CoordinateTransform(visibleRect, screenRect);
  45. return result;
  46. }
  47. internal CoordinateTransform WithRects(DataRect visibleRect, Rect screenRect)
  48. {
  49. CoordinateTransform copy = new CoordinateTransform(visibleRect, screenRect);
  50. copy.dataTransform = dataTransform;
  51. return copy;
  52. }
  53. /// <summary>
  54. /// Creates a new instance of CoordinateTransform with the given data transform.
  55. /// </summary>
  56. /// <param name="dataTransform">The data transform.</param>
  57. /// <returns></returns>
  58. public CoordinateTransform WithDataTransform(DataTransform dataTransform)
  59. {
  60. if (dataTransform == null)
  61. throw new ArgumentNullException("dataTransform");
  62. CoordinateTransform copy = new CoordinateTransform(visibleRect, screenRect);
  63. copy.dataTransform = dataTransform;
  64. return copy;
  65. }
  66. internal CoordinateTransform WithScreenOffset(double x, double y)
  67. {
  68. Rect screenCopy = screenRect;
  69. screenCopy.Offset(x, y);
  70. CoordinateTransform copy = new CoordinateTransform(visibleRect, screenCopy);
  71. return copy;
  72. }
  73. internal static CoordinateTransform CreateDefault()
  74. {
  75. CoordinateTransform transform = new CoordinateTransform(new Rect(0, 0, 1, 1), new Rect(0, 0, 1, 1));
  76. return transform;
  77. }
  78. #endregion
  79. #region Transform methods
  80. /// <summary>
  81. /// Transforms point from data coordinates to screen.
  82. /// </summary>
  83. /// <param name="dataPoint">The point in data coordinates.</param>
  84. /// <returns></returns>
  85. public Point DataToScreen(Point dataPoint)
  86. {
  87. Point viewportPoint = dataTransform.DataToViewport(dataPoint);
  88. Point screenPoint = new Point(viewportPoint.X * rxToScreen - cxToScreen,
  89. cyToScreen - viewportPoint.Y * ryToScreen);
  90. return screenPoint;
  91. }
  92. /// <summary>
  93. /// Transforms point from screen coordinates to data coordinates.
  94. /// </summary>
  95. /// <param name="screenPoint">The point in screen coordinates.</param>
  96. /// <returns></returns>
  97. public Point ScreenToData(Point screenPoint)
  98. {
  99. Point viewportPoint = new Point(screenPoint.X * rxToData - cxToData,
  100. cyToData - screenPoint.Y * ryToData);
  101. Point dataPoint = dataTransform.ViewportToData(viewportPoint);
  102. return dataPoint;
  103. }
  104. /// <summary>
  105. /// Transforms point from viewport coordinates to screen coordinates.
  106. /// </summary>
  107. /// <param name="viewportPoint">The point in viewport coordinates.</param>
  108. /// <returns></returns>
  109. public Point ViewportToScreen(Point viewportPoint)
  110. {
  111. Point screenPoint = new Point(viewportPoint.X * rxToScreen - cxToScreen,
  112. cyToScreen - viewportPoint.Y * ryToScreen);
  113. return screenPoint;
  114. }
  115. /// <summary>
  116. /// Transforms point from screen coordinates to viewport coordinates.
  117. /// </summary>
  118. /// <param name="screenPoint">The point in screen coordinates.</param>
  119. /// <returns></returns>
  120. public Point ScreenToViewport(Point screenPoint)
  121. {
  122. Point viewportPoint = new Point(screenPoint.X * rxToData - cxToData,
  123. cyToData - screenPoint.Y * ryToData);
  124. return viewportPoint;
  125. }
  126. #endregion
  127. [DebuggerBrowsable(DebuggerBrowsableState.Never)]
  128. private DataRect visibleRect;
  129. /// <summary>
  130. /// Gets the viewport rectangle.
  131. /// </summary>
  132. /// <value>The viewport rect.</value>
  133. public DataRect ViewportRect
  134. {
  135. get { return visibleRect; }
  136. }
  137. [DebuggerBrowsable(DebuggerBrowsableState.Never)]
  138. private Rect screenRect;
  139. /// <summary>
  140. /// Gets the screen rectangle.
  141. /// </summary>
  142. /// <value>The screen rect.</value>
  143. public Rect ScreenRect
  144. {
  145. get { return screenRect; }
  146. }
  147. [DebuggerBrowsable(DebuggerBrowsableState.Never)]
  148. private DataTransform dataTransform = DataTransforms.Identity;
  149. /// <summary>
  150. /// Gets the data transform.
  151. /// </summary>
  152. /// <value>The data transform.</value>
  153. public DataTransform DataTransform
  154. {
  155. get { return dataTransform; }
  156. }
  157. }
  158. }