PageRenderTime 38ms CodeModel.GetById 12ms RepoModel.GetById 1ms app.codeStats 0ms

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

#
C# | 199 lines | 116 code | 29 blank | 54 comment | 2 complexity | bc98ea6916df9074ac6c9ffc9c4c668b 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. /// <summary>
  43. /// Creates CoordinateTransform fro specified rectangles and with Identity transform.
  44. /// </summary>
  45. /// <param name="visibleRect">The visible rect.</param>
  46. /// <param name="screenRect">The screen rect.</param>
  47. /// <returns></returns>
  48. public static CoordinateTransform FromRects(DataRect visibleRect, Rect screenRect)
  49. {
  50. CoordinateTransform result = new CoordinateTransform(visibleRect, screenRect);
  51. return result;
  52. }
  53. /// <summary>
  54. /// Closnes transform with current dataTransform and specified rectangles.
  55. /// </summary>
  56. /// <param name="visibleRect">The visible rect.</param>
  57. /// <param name="screenRect">The screen rect.</param>
  58. /// <returns></returns>
  59. public CoordinateTransform WithRects(DataRect visibleRect, Rect screenRect)
  60. {
  61. CoordinateTransform copy = new CoordinateTransform(visibleRect, screenRect);
  62. copy.dataTransform = dataTransform;
  63. return copy;
  64. }
  65. /// <summary>
  66. /// Creates a new instance of CoordinateTransform with the given data transform.
  67. /// </summary>
  68. /// <param name="dataTransform">The data transform.</param>
  69. /// <returns></returns>
  70. public CoordinateTransform WithDataTransform(DataTransform dataTransform)
  71. {
  72. if (dataTransform == null)
  73. throw new ArgumentNullException("dataTransform");
  74. CoordinateTransform copy = new CoordinateTransform(visibleRect, screenRect);
  75. copy.dataTransform = dataTransform;
  76. return copy;
  77. }
  78. internal CoordinateTransform WithScreenOffset(double x, double y)
  79. {
  80. Rect screenCopy = screenRect;
  81. screenCopy.Offset(x, y);
  82. CoordinateTransform copy = new CoordinateTransform(visibleRect, screenCopy);
  83. return copy;
  84. }
  85. internal static CoordinateTransform CreateDefault()
  86. {
  87. CoordinateTransform transform = new CoordinateTransform(new Rect(0, 0, 1, 1), new Rect(0, 0, 1, 1));
  88. return transform;
  89. }
  90. #endregion
  91. #region Transform methods
  92. /// <summary>
  93. /// Transforms point from data coordinates to screen.
  94. /// </summary>
  95. /// <param name="dataPoint">The point in data coordinates.</param>
  96. /// <returns></returns>
  97. public Point DataToScreen(Point dataPoint)
  98. {
  99. Point viewportPoint = dataTransform.DataToViewport(dataPoint);
  100. Point screenPoint = new Point(viewportPoint.X * rxToScreen - cxToScreen,
  101. cyToScreen - viewportPoint.Y * ryToScreen);
  102. return screenPoint;
  103. }
  104. /// <summary>
  105. /// Transforms point from screen coordinates to data coordinates.
  106. /// </summary>
  107. /// <param name="screenPoint">The point in screen coordinates.</param>
  108. /// <returns></returns>
  109. public Point ScreenToData(Point screenPoint)
  110. {
  111. Point viewportPoint = new Point(screenPoint.X * rxToData - cxToData,
  112. cyToData - screenPoint.Y * ryToData);
  113. Point dataPoint = dataTransform.ViewportToData(viewportPoint);
  114. return dataPoint;
  115. }
  116. /// <summary>
  117. /// Transforms point from viewport coordinates to screen coordinates.
  118. /// </summary>
  119. /// <param name="viewportPoint">The point in viewport coordinates.</param>
  120. /// <returns></returns>
  121. public Point ViewportToScreen(Point viewportPoint)
  122. {
  123. Point screenPoint = new Point(viewportPoint.X * rxToScreen - cxToScreen,
  124. cyToScreen - viewportPoint.Y * ryToScreen);
  125. return screenPoint;
  126. }
  127. /// <summary>
  128. /// Transforms point from screen coordinates to viewport coordinates.
  129. /// </summary>
  130. /// <param name="screenPoint">The point in screen coordinates.</param>
  131. /// <returns></returns>
  132. public Point ScreenToViewport(Point screenPoint)
  133. {
  134. Point viewportPoint = new Point(screenPoint.X * rxToData - cxToData,
  135. cyToData - screenPoint.Y * ryToData);
  136. return viewportPoint;
  137. }
  138. #endregion
  139. [DebuggerBrowsable(DebuggerBrowsableState.Never)]
  140. private DataRect visibleRect;
  141. /// <summary>
  142. /// Gets the viewport rectangle.
  143. /// </summary>
  144. /// <value>The viewport rect.</value>
  145. public DataRect ViewportRect
  146. {
  147. get { return visibleRect; }
  148. }
  149. [DebuggerBrowsable(DebuggerBrowsableState.Never)]
  150. private Rect screenRect;
  151. /// <summary>
  152. /// Gets the screen rectangle.
  153. /// </summary>
  154. /// <value>The screen rect.</value>
  155. public Rect ScreenRect
  156. {
  157. get { return screenRect; }
  158. }
  159. [DebuggerBrowsable(DebuggerBrowsableState.Never)]
  160. private DataTransform dataTransform = DataTransforms.Identity;
  161. /// <summary>
  162. /// Gets the data transform.
  163. /// </summary>
  164. /// <value>The data transform.</value>
  165. public DataTransform DataTransform
  166. {
  167. get { return dataTransform; }
  168. }
  169. }
  170. }