DashedHelper.cs 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Drawing;
  4. using System.Linq;
  5. using System.Numerics;
  6. using System.Text;
  7. using Veldrid.Common.Plot;
  8. namespace Veldrid.Common.Tools
  9. {
  10. internal static class DashedHelper
  11. {
  12. public static Vector2[] CalcDashedPoints(IRender render,CursorLineStyle lineStyle,float local,Vector2 imagepositionvirsize,Position imageposition = Position.Left)
  13. {
  14. return CalcDashedPoints(render,lineStyle,local,imagepositionvirsize,new DashedStyle(),imageposition);
  15. }
  16. public static Vector2[] CalcDashedPoints(IRender render,CursorLineStyle lineStyle,float local,Vector2 imagepositionvirsize,DashedStyle dashedStyle,Position imageposition = Position.Left)
  17. {
  18. var position = 0f;
  19. if (imagepositionvirsize.X == 0 || imagepositionvirsize.Y == 0 || Single.IsNaN(imagepositionvirsize.X) || Single.IsNaN(imagepositionvirsize.Y) || Single.IsInfinity(imagepositionvirsize.X) || Single.IsInfinity(imagepositionvirsize.Y))
  20. {
  21. return new Vector2[0];
  22. }
  23. var start = new Vector2(0, 0);
  24. var end = new Vector2(0, 0);
  25. float range = 0;
  26. switch (imageposition)
  27. {
  28. case Position.Left:
  29. position = local;
  30. start.X = render.LineRange.MinX + imagepositionvirsize.X + render.Margin.Left;
  31. start.Y = position;
  32. end.X = render.LineRange.MaxX;
  33. end.Y = position;
  34. range = end.X - start.X;
  35. break;
  36. case Position.Bottom:
  37. position = local;
  38. start.Y = render.LineRange.MinY + imagepositionvirsize.Y + render.Margin.Bottom;
  39. start.X = position;
  40. end.Y = render.LineRange.MaxY;
  41. end.X = position;
  42. range = end.Y - start.Y;
  43. break;
  44. case Position.Right:
  45. position = local;
  46. start.X = render.LineRange.MinX;
  47. start.Y = position;
  48. end.X = render.LineRange.MaxX - imagepositionvirsize.X - render.Margin.Right;
  49. end.Y = position;
  50. range = end.X - start.X;
  51. break;
  52. case Position.Top:
  53. position = local;
  54. start.Y = render.LineRange.MinY;
  55. start.X = position;
  56. end.Y = render.LineRange.MaxY - imagepositionvirsize.Y - render.Margin.Top;
  57. end.X = position;
  58. range = end.Y - start.Y;
  59. break;
  60. }
  61. if (range <= 0)
  62. {
  63. return new Vector2[0];
  64. }
  65. switch (lineStyle)
  66. {
  67. case CursorLineStyle.Line:
  68. return new Vector2[] { start, end };
  69. case CursorLineStyle.None:
  70. default:
  71. return new Vector2[0];
  72. case CursorLineStyle.Dashed:
  73. Vector2[] temp = Enumerable.Range(0, (int)Math.Ceiling(range / (dashedStyle.LineLength + dashedStyle.DashedLength))).SelectMany(x =>
  74. {
  75. Vector2[] temps = new Vector2[2];
  76. temps[0] = start;
  77. switch (imageposition)
  78. {
  79. case Position.Left:
  80. case Position.Right:
  81. temps[1].X = start.X + dashedStyle.LineLength;
  82. start.X = temps[1].X + dashedStyle.DashedLength;
  83. temps[1].Y = start.Y;
  84. break;
  85. case Position.Top:
  86. case Position.Bottom:
  87. temps[1].Y = start.Y + dashedStyle.LineLength;
  88. start.Y = temps[1].Y + dashedStyle.DashedLength;
  89. temps[1].X = temps[0].X;
  90. break;
  91. }
  92. return temps;
  93. }).ToArray();
  94. return temp;
  95. }
  96. }
  97. }
  98. }