123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126 |
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.Windows;
- using System.Windows.Media;
- using System.Windows.Shapes;
- namespace WpfApp1 {
- public class Vertex : Shape, IVertex {
- protected override Geometry DefiningGeometry => new EllipseGeometry {
- Center = Position,
- RadiusX = RadiusX,
- RadiusY = RadiusY
- };
- public Point Position { get; set; }
- public string ElementId { get; set; }
- public Action<string> ShowAction { set; private get; }
- private static double radiusX = 1.6;
- private static double radiusY = 1.6;
- public static void SetRadius(double x, double y) {
- radiusX = x;
- radiusY = y;
- }
- public double RadiusX
- {
- get => radiusX;
- set => radiusX = value;
- }
- public double RadiusY
- {
- get => radiusY;
- set => radiusY = value;
- }
- public Vertex(Point center) {
- this.Fill = Brushes.Red;
- this.Position = center;
- this.MouseLeftButtonDown += Vertex_MouseLeftButtonDown;
- this.MouseEnter += Vertex_MouseEnter;
- this.MouseLeave += Vertex_MouseLeave;
- }
- private void Vertex_MouseLeave(object sender, System.Windows.Input.MouseEventArgs e) {
- if (Fill != Brushes.Transparent) {//空心不适用事件
- this.Fill = Brushes.Red;
- this.RadiusY = RadiusY / 2.0d;
- this.RadiusX /= 2.0d;
- }
- }
- private void Vertex_MouseEnter(object sender, System.Windows.Input.MouseEventArgs e) {
- if (Fill != Brushes.Transparent) {//空心不适用事件
- this.Fill = Brushes.Blue;
- this.RadiusY = RadiusY * 2;
- this.RadiusX *= 2;
- }
- }
- private void Vertex_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e) {
- ShowAction?.Invoke(this.ElementId);
- }
- public static Vertex GetHollow(Point center) {
- return new Vertex(center) {
- StrokeThickness = 2,
- Stroke = Brushes.Red,
- Fill = Brushes.Transparent
- };
- }
- }
- public interface IVertex {
- Point Position { get; }
- double RadiusX { get; set; }
- double RadiusY { get; set; }
- }
- public interface ILine {
- Point StartPoint { get; set; }
- Point EndPoint { get; set; }
- }
- public class SgLine : Shape, ILine {
- protected override Geometry DefiningGeometry => new LineGeometry(StartPoint, EndPoint);
- public Point StartPoint { get; set; }
- public Point EndPoint { get; set; }
- public double Length { get; set; } = 50;
- public double Angle { get; set; }
- private SgLine() {
- StrokeThickness = 1;
- Stroke = Brushes.Red;
- }
- public SgLine(Vertex start, Vertex end) : this() {
- this.StartPoint = start.Position;
- this.EndPoint = end.Position;
- }
- public SgLine(Point start, Point end) : this() {
- this.StartPoint = start;
- this.EndPoint = end;
- System.Diagnostics.Debug.WriteLine($"start:{start.ToString()},end:{end}");
- }
- public SgLine(Point start, double angle) : this() {
- this.StartPoint = start;
- this.EndPoint = GetEndPoint(angle);
- }
- Point GetEndPoint(double angle) {
- if (angle == 90) {
- return new Point(StartPoint.X, StartPoint.Y + Length);
- }
- else if (angle == 270) {
- return new Point(StartPoint.X, StartPoint.Y - Length);
- }
- else {
- return new Point(StartPoint.X + Length, Math.Tan(angle / 180d * Math.PI) * Length + StartPoint.Y);
- }
- }
- }
- }
|