SgLine.cs 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using System.Windows;
  7. using System.Windows.Media;
  8. using System.Windows.Shapes;
  9. namespace WpfApp1 {
  10. public class Vertex : Shape, IVertex {
  11. protected override Geometry DefiningGeometry => new EllipseGeometry {
  12. Center = Position,
  13. RadiusX = RadiusX,
  14. RadiusY = RadiusY
  15. };
  16. public Point Position { get; set; }
  17. public string ElementId { get; set; }
  18. public Action<string> ShowAction { set; private get; }
  19. private static double radiusX = 1.6;
  20. private static double radiusY = 1.6;
  21. public static void SetRadius(double x, double y) {
  22. radiusX = x;
  23. radiusY = y;
  24. }
  25. public double RadiusX
  26. {
  27. get => radiusX;
  28. set => radiusX = value;
  29. }
  30. public double RadiusY
  31. {
  32. get => radiusY;
  33. set => radiusY = value;
  34. }
  35. public Vertex(Point center) {
  36. this.Fill = Brushes.Red;
  37. this.Position = center;
  38. this.MouseLeftButtonDown += Vertex_MouseLeftButtonDown;
  39. this.MouseEnter += Vertex_MouseEnter;
  40. this.MouseLeave += Vertex_MouseLeave;
  41. }
  42. private void Vertex_MouseLeave(object sender, System.Windows.Input.MouseEventArgs e) {
  43. if (Fill != Brushes.Transparent) {//空心不适用事件
  44. this.Fill = Brushes.Red;
  45. this.RadiusY = RadiusY / 2.0d;
  46. this.RadiusX /= 2.0d;
  47. }
  48. }
  49. private void Vertex_MouseEnter(object sender, System.Windows.Input.MouseEventArgs e) {
  50. if (Fill != Brushes.Transparent) {//空心不适用事件
  51. this.Fill = Brushes.Blue;
  52. this.RadiusY = RadiusY * 2;
  53. this.RadiusX *= 2;
  54. }
  55. }
  56. private void Vertex_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e) {
  57. ShowAction?.Invoke(this.ElementId);
  58. }
  59. public static Vertex GetHollow(Point center) {
  60. return new Vertex(center) {
  61. StrokeThickness = 2,
  62. Stroke = Brushes.Red,
  63. Fill = Brushes.Transparent
  64. };
  65. }
  66. }
  67. public interface IVertex {
  68. Point Position { get; }
  69. double RadiusX { get; set; }
  70. double RadiusY { get; set; }
  71. }
  72. public interface ILine {
  73. Point StartPoint { get; set; }
  74. Point EndPoint { get; set; }
  75. }
  76. public class SgLine : Shape, ILine {
  77. protected override Geometry DefiningGeometry => new LineGeometry(StartPoint, EndPoint);
  78. public Point StartPoint { get; set; }
  79. public Point EndPoint { get; set; }
  80. public double Length { get; set; } = 50;
  81. public double Angle { get; set; }
  82. private SgLine() {
  83. StrokeThickness = 1;
  84. Stroke = Brushes.Red;
  85. }
  86. public SgLine(Vertex start, Vertex end) : this() {
  87. this.StartPoint = start.Position;
  88. this.EndPoint = end.Position;
  89. }
  90. public SgLine(Point start, Point end) : this() {
  91. this.StartPoint = start;
  92. this.EndPoint = end;
  93. System.Diagnostics.Debug.WriteLine($"start:{start.ToString()},end:{end}");
  94. }
  95. public SgLine(Point start, double angle) : this() {
  96. this.StartPoint = start;
  97. this.EndPoint = GetEndPoint(angle);
  98. }
  99. Point GetEndPoint(double angle) {
  100. if (angle == 90) {
  101. return new Point(StartPoint.X, StartPoint.Y + Length);
  102. }
  103. else if (angle == 270) {
  104. return new Point(StartPoint.X, StartPoint.Y - Length);
  105. }
  106. else {
  107. return new Point(StartPoint.X + Length, Math.Tan(angle / 180d * Math.PI) * Length + StartPoint.Y);
  108. }
  109. }
  110. }
  111. }