几何绘图与三角函数计算应用

几何绘图与三角函数计算应用

设计思路

  • 左侧为绘图控制面板,右侧为绘图区域
  • 支持绘制点、线、矩形、圆、多边形等基本几何图形
  • 实现三角函数计算器(正弦、余弦、正切等)
  • 包含角度/弧度切换和常用数学常数
  • 历史记录功能保存用户绘图

完整实现代码

csharp 复制代码
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;

namespace GeometryDrawingApp
{
    public partial class MainForm : Form
    {
        // 绘图状态变量
        private enum DrawingMode { None, Point, Line, Rectangle, Circle, Polygon, Select }
        private DrawingMode currentMode = DrawingMode.None;

        // 图形存储
        private List<Shape> shapes = new List<Shape>();
        private Shape currentShape = null;
        private Point startPoint;
        private Point endPoint;

        // 多边形绘制状态
        private List<Point> polygonPoints = new List<Point>();
        private bool isPolygonDrawing = false;

        // 选择状态
        private Shape selectedShape = null;

        // 颜色设置
        private Color drawingColor = Color.Blue;
        private Color selectedColor = Color.Red;

        public MainForm()
        {
            InitializeComponent();
            InitializeApp();
        }

        private void InitializeApp()
        {
            // 设置绘图区域背景
            drawingPanel.BackColor = Color.White;
            drawingPanel.Paint += DrawingPanel_Paint;
            drawingPanel.MouseDown += DrawingPanel_MouseDown;
            drawingPanel.MouseMove += DrawingPanel_MouseMove;
            drawingPanel.MouseUp += DrawingPanel_MouseUp;

            // 设置初始绘图模式
            SetDrawingMode(DrawingMode.Select);

            // 初始化三角函数计算器
            InitializeTrigCalculator();

            // 设置颜色选择器
            colorComboBox.Items.AddRange(new object[] { "Blue", "Red", "Green", "Purple", "Orange", "Black" });
            colorComboBox.SelectedIndex = 0;
            colorComboBox.SelectedIndexChanged += (s, e) =>
            {
                string colorName = colorComboBox.SelectedItem.ToString();
                drawingColor = Color.FromName(colorName);
            };

            // 设置线宽选择器
            for (int i = 1; i <= 5; i++)
                lineWidthComboBox.Items.Add(i);
            lineWidthComboBox.SelectedIndex = 0;

            // 设置填充样式
            fillStyleComboBox.Items.AddRange(new object[] { "None", "Solid", "Hatch" });
            fillStyleComboBox.SelectedIndex = 0;

            // 设置历史记录列表
            historyListBox.DisplayMember = "Description";
        }

        private void InitializeTrigCalculator()
        {
            // 初始化三角函数计算器UI
            angleTypeComboBox.Items.AddRange(new object[] { "Degrees", "Radians" });
            angleTypeComboBox.SelectedIndex = 0;

            // 添加常用常数
            constantComboBox.Items.AddRange(new object[] { "π", "e", "√2", "√3", "φ" });
            constantComboBox.SelectedIndex = 0;

            // 设置默认值
            angleTextBox.Text = "30";
            CalculateTrigFunctions();
        }

        private void SetDrawingMode(DrawingMode mode)
        {
            currentMode = mode;
            statusLabel.Text = $"Mode: {mode}";

            // 如果从多边形绘制切换到其他模式,清除多边形点
            if (mode != DrawingMode.Polygon && isPolygonDrawing)
            {
                polygonPoints.Clear();
                isPolygonDrawing = false;
                polygonButton.Text = "Polygon";
            }
        }

        // 图形基类
        public abstract class Shape
        {
            public Color Color { get; set; }
            public int LineWidth { get; set; }
            public bool Filled { get; set; }
            public bool Selected { get; set; }

            public abstract void Draw(Graphics g);
            public abstract bool Contains(Point point);
            public abstract string Description { get; }
        }

        // 点类
        public class PointShape : Shape
        {
            public Point Location { get; set; }

            public override void Draw(Graphics g)
            {
                using (Brush brush = new SolidBrush(Selected ? Color.Red : Color))
                {
                    g.FillEllipse(brush, Location.X - 3, Location.Y - 3, 6, 6);
                }
            }

            public override bool Contains(Point point)
            {
                return Math.Sqrt(Math.Pow(point.X - Location.X, 2) + Math.Pow(point.Y - Location.Y, 2)) < 5;
            }

            public override string Description => $"Point at ({Location.X}, {Location.Y})";
        }

        // 线类
        public class LineShape : Shape
        {
            public Point Start { get; set; }
            public Point End { get; set; }

            public override void Draw(Graphics g)
            {
                using (Pen pen = new Pen(Selected ? Color.Red : Color, LineWidth))
                {
                    g.DrawLine(pen, Start, End);
                }
            }

            public override bool Contains(Point point)
            {
                // 简化的点线距离计算
                double distance = Math.Abs((End.Y - Start.Y) * point.X - (End.X - Start.X) * point.Y +
                                          End.X * Start.Y - End.Y * Start.X) /
                                 Math.Sqrt(Math.Pow(End.Y - Start.Y, 2) + Math.Pow(End.X - Start.X, 2));
                return distance < 5;
            }

            public override string Description => $"Line from ({Start.X}, {Start.Y}) to ({End.X}, {End.Y})";
        }

        // 矩形类
        public class RectangleShape : Shape
        {
            public Rectangle Rect { get; set; }

            public override void Draw(Graphics g)
            {
                using (Pen pen = new Pen(Selected ? Color.Red : Color, LineWidth))
                {
                    if (Filled)
                    {
                        using (Brush brush = new SolidBrush(Color.FromArgb(100, Color)))
                        {
                            g.FillRectangle(brush, Rect);
                        }
                    }
                    g.DrawRectangle(pen, Rect);
                }
            }

            public override bool Contains(Point point)
            {
                return Rect.Contains(point);
            }

            public override string Description => $"Rectangle at ({Rect.X}, {Rect.Y}), Size: {Rect.Width}x{Rect.Height}";
        }

        // 圆类
        public class CircleShape : Shape
        {
            public Point Center { get; set; }
            public int Radius { get; set; }

            public override void Draw(Graphics g)
            {
                Rectangle rect = new Rectangle(Center.X - Radius, Center.Y - Radius,
                                               Radius * 2, Radius * 2);
                using (Pen pen = new Pen(Selected ? Color.Red : Color, LineWidth))
                {
                    if (Filled)
                    {
                        using (Brush brush = new SolidBrush(Color.FromArgb(100, Color)))
                        {
                            g.FillEllipse(brush, rect);
                        }
                    }
                    g.DrawEllipse(pen, rect);
                }
            }

            public override bool Contains(Point point)
            {
                double distance = Math.Sqrt(Math.Pow(point.X - Center.X, 2) + Math.Pow(point.Y - Center.Y, 2));
                return distance <= Radius + 3 && distance >= Radius - 3;
            }

            public override string Description => $"Circle at ({Center.X}, {Center.Y}), Radius: {Radius}";
        }

        // 多边形类
        public class PolygonShape : Shape
        {
            public List<Point> Points { get; set; } = new List<Point>();

            public override void Draw(Graphics g)
            {
                if (Points.Count < 2) return;

                using (Pen pen = new Pen(Selected ? Color.Red : Color, LineWidth))
                {
                    if (Filled && Points.Count > 2)
                    {
                        using (Brush brush = new SolidBrush(Color.FromArgb(100, Color)))
                        {
                            g.FillPolygon(brush, Points.ToArray());
                        }
                    }

                    // 修复:当只有两个点时绘制线段而不是多边形
                    if (Points.Count == 2)
                    {
                        g.DrawLine(pen, Points[0], Points[1]);
                    }
                    else
                    {
                        g.DrawPolygon(pen, Points.ToArray());
                    }
                }
            }

            public override bool Contains(Point point)
            {
                if (Points.Count == 0) return false;

                // 对于只有两个点的情况,使用线段包含检测
                if (Points.Count == 2)
                {
                    double distance = Math.Abs((Points[1].Y - Points[0].Y) * point.X -
                                     (Points[1].X - Points[0].X) * point.Y +
                                     Points[1].X * Points[0].Y - Points[1].Y * Points[0].X) /
                                Math.Sqrt(Math.Pow(Points[1].Y - Points[0].Y, 2) +
                                          Math.Pow(Points[1].X - Points[0].X, 2));
                    return distance < 5;
                }

                // 对于三个点以上的多边形
                GraphicsPath path = new GraphicsPath();
                path.AddPolygon(Points.ToArray());
                return path.IsVisible(point);
            }

            public override string Description => $"Polygon with {Points.Count} points";
        }

        private void DrawingPanel_Paint(object sender, PaintEventArgs e)
        {
            Graphics g = e.Graphics;
            g.SmoothingMode = SmoothingMode.AntiAlias;

            // 绘制所有图形
            foreach (Shape shape in shapes)
            {
                shape.Draw(g);
            }

            // 绘制当前正在绘制的图形
            if (currentShape != null)
            {
                currentShape.Draw(g);
            }

            // 绘制多边形点(如果正在绘制多边形)
            if (isPolygonDrawing && polygonPoints.Count > 0)
            {
                // 绘制点之间的连线
                if (polygonPoints.Count > 1)
                {
                    using (Pen pen = new Pen(Color.Gray, 1))
                    {
                        pen.DashStyle = DashStyle.Dash;
                        g.DrawLines(pen, polygonPoints.ToArray());
                    }
                }

                // 绘制所有点
                foreach (Point p in polygonPoints)
                {
                    g.FillEllipse(Brushes.Blue, p.X - 3, p.Y - 3, 6, 6);
                }

                // 绘制从最后一个点到当前鼠标位置的线
                Point currentPos = drawingPanel.PointToClient(Cursor.Position);
                if (polygonPoints.Count > 0)
                {
                    using (Pen pen = new Pen(Color.DarkGray, 1))
                    {
                        pen.DashStyle = DashStyle.Dot;
                        g.DrawLine(pen, polygonPoints[polygonPoints.Count - 1], currentPos);
                    }
                }
            }
        }

        private void DrawingPanel_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Right && isPolygonDrawing)
            {
                // 右键取消多边形绘制
                polygonPoints.Clear();
                isPolygonDrawing = false;
                polygonButton.Text = "Polygon";
                drawingPanel.Invalidate();
                return;
            }

            if (e.Button != MouseButtons.Left) return;

            if (currentMode == DrawingMode.Select)
            {
                // 选择图形
                selectedShape = null;
                foreach (Shape shape in shapes)
                {
                    shape.Selected = false;
                    if (shape.Contains(e.Location))
                    {
                        selectedShape = shape;
                        shape.Selected = true;
                        statusLabel.Text = $"Selected: {shape.Description}";
                    }
                }
                drawingPanel.Invalidate();
                return;
            }

            startPoint = e.Location;

            switch (currentMode)
            {
                case DrawingMode.Point:
                    currentShape = new PointShape
                    {
                        Location = e.Location,
                        Color = drawingColor,
                        LineWidth = (int)lineWidthComboBox.SelectedItem
                    };
                    shapes.Add(currentShape);
                    historyListBox.Items.Add(currentShape.Description);
                    currentShape = null;
                    break;

                case DrawingMode.Line:
                case DrawingMode.Rectangle:
                case DrawingMode.Circle:
                    // 这些图形需要开始点和结束点
                    break;

                case DrawingMode.Polygon:
                    if (!isPolygonDrawing)
                    {
                        isPolygonDrawing = true;
                        polygonPoints.Clear();
                        polygonPoints.Add(e.Location);
                        polygonButton.Text = "Complete Polygon";
                    }
                    else
                    {
                        polygonPoints.Add(e.Location);
                    }
                    break;
            }

            drawingPanel.Invalidate();
        }

        private void DrawingPanel_MouseMove(object sender, MouseEventArgs e)
        {
            // 更新坐标显示
            coordinatesLabel.Text = $"X: {e.X}, Y: {e.Y}";

            if (e.Button != MouseButtons.Left) return;

            endPoint = e.Location;

            switch (currentMode)
            {
                case DrawingMode.Line:
                    currentShape = new LineShape
                    {
                        Start = startPoint,
                        End = endPoint,
                        Color = drawingColor,
                        LineWidth = (int)lineWidthComboBox.SelectedItem
                    };
                    break;

                case DrawingMode.Rectangle:
                    int width = endPoint.X - startPoint.X;
                    int height = endPoint.Y - startPoint.Y;
                    currentShape = new RectangleShape
                    {
                        Rect = new Rectangle(startPoint.X, startPoint.Y, width, height),
                        Color = drawingColor,
                        LineWidth = (int)lineWidthComboBox.SelectedItem,
                        Filled = fillStyleComboBox.SelectedIndex > 0
                    };
                    break;

                case DrawingMode.Circle:
                    int radius = (int)Math.Sqrt(Math.Pow(endPoint.X - startPoint.X, 2) +
                                               Math.Pow(endPoint.Y - startPoint.Y, 2));
                    currentShape = new CircleShape
                    {
                        Center = startPoint,
                        Radius = radius,
                        Color = drawingColor,
                        LineWidth = (int)lineWidthComboBox.SelectedItem,
                        Filled = fillStyleComboBox.SelectedIndex > 0
                    };
                    break;
            }

            drawingPanel.Invalidate();
        }

        private void DrawingPanel_MouseUp(object sender, MouseEventArgs e)
        {
            if (e.Button != MouseButtons.Left || currentShape == null) return;

            switch (currentMode)
            {
                case DrawingMode.Line:
                case DrawingMode.Rectangle:
                case DrawingMode.Circle:
                    shapes.Add(currentShape);
                    historyListBox.Items.Add(currentShape.Description);
                    currentShape = null;
                    break;
            }
        }

        private void pointButton_Click(object sender, EventArgs e) => SetDrawingMode(DrawingMode.Point);
        private void lineButton_Click(object sender, EventArgs e) => SetDrawingMode(DrawingMode.Line);
        private void rectangleButton_Click(object sender, EventArgs e) => SetDrawingMode(DrawingMode.Rectangle);
        private void circleButton_Click(object sender, EventArgs e) => SetDrawingMode(DrawingMode.Circle);
        private void selectButton_Click(object sender, EventArgs e) => SetDrawingMode(DrawingMode.Select);

        private void polygonButton_Click(object sender, EventArgs e)
        {
            if (isPolygonDrawing)
            {
                // 完成多边形绘制
                if (polygonPoints.Count > 1) // 至少需要两个点
                {
                    currentShape = new PolygonShape
                    {
                        Points = new List<Point>(polygonPoints),
                        Color = drawingColor,
                        LineWidth = (int)lineWidthComboBox.SelectedItem,
                        Filled = fillStyleComboBox.SelectedIndex > 0
                    };
                    shapes.Add(currentShape);
                    historyListBox.Items.Add(currentShape.Description);
                }
                else if (polygonPoints.Count == 1)
                {
                    // 如果只有一个点,创建点对象
                    currentShape = new PointShape
                    {
                        Location = polygonPoints[0],
                        Color = drawingColor,
                        LineWidth = (int)lineWidthComboBox.SelectedItem
                    };
                    shapes.Add(currentShape);
                    historyListBox.Items.Add(currentShape.Description);
                }

                polygonPoints.Clear();
                isPolygonDrawing = false;
                polygonButton.Text = "Polygon";
                SetDrawingMode(DrawingMode.Select);
            }
            else
            {
                SetDrawingMode(DrawingMode.Polygon);
            }
            drawingPanel.Invalidate();
        }

        private void clearButton_Click(object sender, EventArgs e)
        {
            // 修复:正确清空所有图形和多边形状态
            shapes.Clear();
            historyListBox.Items.Clear();
            selectedShape = null;

            // 清空多边形绘制状态
            polygonPoints.Clear();
            isPolygonDrawing = false;
            polygonButton.Text = "Polygon";

            // 重置为选择模式
            SetDrawingMode(DrawingMode.Select);

            drawingPanel.Invalidate();
        }

        private void CalculateTrigFunctions()
        {
            if (double.TryParse(angleTextBox.Text, out double angleValue))
            {
                bool isDegrees = angleTypeComboBox.SelectedIndex == 0;
                double radians = isDegrees ? angleValue * Math.PI / 180.0 : angleValue;

                sinLabel.Text = $"sin: {Math.Sin(radians):F4}";
                cosLabel.Text = $"cos: {Math.Cos(radians):F4}";
                tanLabel.Text = $"tan: {Math.Tan(radians):F4}";

                // 避免除以零错误
                if (Math.Cos(radians) != 0)
                    secLabel.Text = $"sec: {1.0 / Math.Cos(radians):F4}";
                else
                    secLabel.Text = "sec: undefined";

                if (Math.Sin(radians) != 0)
                    cscLabel.Text = $"csc: {1.0 / Math.Sin(radians):F4}";
                else
                    cscLabel.Text = "csc: undefined";

                if (Math.Tan(radians) != 0)
                    cotLabel.Text = $"cot: {1.0 / Math.Tan(radians):F4}";
                else
                    cotLabel.Text = "cot: undefined";
            }
            else
            {
                sinLabel.Text = "sin: invalid input";
                cosLabel.Text = "cos: invalid input";
                tanLabel.Text = "tan: invalid input";
                secLabel.Text = "sec: invalid input";
                cscLabel.Text = "csc: invalid input";
                cotLabel.Text = "cot: invalid input";
            }
        }

        private void calculateButton_Click(object sender, EventArgs e)
        {
            CalculateTrigFunctions();
        }

        private void constantComboBox_SelectedIndexChanged(object sender, EventArgs e)
        {
            switch (constantComboBox.SelectedIndex)
            {
                case 0: // π
                    angleTextBox.Text = Math.PI.ToString("F6");
                    break;
                case 1: // e
                    angleTextBox.Text = Math.E.ToString("F6");
                    break;
                case 2: // √2
                    angleTextBox.Text = Math.Sqrt(2).ToString("F6");
                    break;
                case 3: // √3
                    angleTextBox.Text = Math.Sqrt(3).ToString("F6");
                    break;
                case 4: // φ (黄金比例)
                    angleTextBox.Text = ((1 + Math.Sqrt(5)) / 2).ToString("F6");
                    break;
            }
            CalculateTrigFunctions();
        }

        private void deleteButton_Click(object sender, EventArgs e)
        {
            if (selectedShape != null)
            {
                shapes.Remove(selectedShape);
                selectedShape = null;
                drawingPanel.Invalidate();

                // 更新历史记录
                historyListBox.Items.Clear();
                foreach (Shape shape in shapes)
                {
                    historyListBox.Items.Add(shape.Description);
                }
            }
        }

        private void MainForm_Load(object sender, EventArgs e)
        {
            // 添加示例图形
            shapes.Add(new PointShape { Location = new Point(100, 100), Color = Color.Blue });
            shapes.Add(new LineShape
            {
                Start = new Point(150, 150),
                End = new Point(250, 200),
                Color = Color.Green,
                LineWidth = 2
            });
            shapes.Add(new RectangleShape
            {
                Rect = new Rectangle(300, 100, 80, 60),
                Color = Color.Purple,
                LineWidth = 2
            });
            shapes.Add(new CircleShape
            {
                Center = new Point(200, 300),
                Radius = 50,
                Color = Color.Orange,
                LineWidth = 2
            });

            // 添加历史记录
            foreach (Shape shape in shapes)
            {
                historyListBox.Items.Add(shape.Description);
            }
        }

        private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            HelpForm f = new HelpForm();
            f.ShowDialog();
        }
    }
}

窗体设计代码 (MainForm.Designer.cs)

csharp 复制代码
namespace GeometryDrawingApp
{
    partial class MainForm
    {
        private System.ComponentModel.IContainer components = null;

        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Windows Form Designer generated code

        private void InitializeComponent()
        {
            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm));
            this.drawingPanel = new System.Windows.Forms.Panel();
            this.controlPanel = new System.Windows.Forms.Panel();
            this.deleteButton = new System.Windows.Forms.Button();
            this.clearButton = new System.Windows.Forms.Button();
            this.fillStyleComboBox = new System.Windows.Forms.ComboBox();
            this.label5 = new System.Windows.Forms.Label();
            this.lineWidthComboBox = new System.Windows.Forms.ComboBox();
            this.label4 = new System.Windows.Forms.Label();
            this.colorComboBox = new System.Windows.Forms.ComboBox();
            this.label3 = new System.Windows.Forms.Label();
            this.polygonButton = new System.Windows.Forms.Button();
            this.selectButton = new System.Windows.Forms.Button();
            this.circleButton = new System.Windows.Forms.Button();
            this.rectangleButton = new System.Windows.Forms.Button();
            this.lineButton = new System.Windows.Forms.Button();
            this.pointButton = new System.Windows.Forms.Button();
            this.calculatorGroup = new System.Windows.Forms.GroupBox();
            this.cotLabel = new System.Windows.Forms.Label();
            this.cscLabel = new System.Windows.Forms.Label();
            this.secLabel = new System.Windows.Forms.Label();
            this.tanLabel = new System.Windows.Forms.Label();
            this.cosLabel = new System.Windows.Forms.Label();
            this.sinLabel = new System.Windows.Forms.Label();
            this.calculateButton = new System.Windows.Forms.Button();
            this.constantComboBox = new System.Windows.Forms.ComboBox();
            this.label2 = new System.Windows.Forms.Label();
            this.angleTypeComboBox = new System.Windows.Forms.ComboBox();
            this.angleTextBox = new System.Windows.Forms.TextBox();
            this.label1 = new System.Windows.Forms.Label();
            this.statusStrip = new System.Windows.Forms.StatusStrip();
            this.statusLabel = new System.Windows.Forms.ToolStripStatusLabel();
            this.coordinatesLabel = new System.Windows.Forms.ToolStripStatusLabel();
            this.historyGroup = new System.Windows.Forms.GroupBox();
            this.historyListBox = new System.Windows.Forms.ListBox();
            this.controlPanel.SuspendLayout();
            this.calculatorGroup.SuspendLayout();
            this.statusStrip.SuspendLayout();
            this.historyGroup.SuspendLayout();
            this.SuspendLayout();
            // 
            // drawingPanel
            // 
            this.drawingPanel.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
            | System.Windows.Forms.AnchorStyles.Left) 
            | System.Windows.Forms.AnchorStyles.Right)));
            this.drawingPanel.BackColor = System.Drawing.Color.White;
            this.drawingPanel.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
            this.drawingPanel.Location = new System.Drawing.Point(12, 12);
            this.drawingPanel.Name = "drawingPanel";
            this.drawingPanel.Size = new System.Drawing.Size(600, 500);
            this.drawingPanel.TabIndex = 0;
            // 
            // controlPanel
            // 
            this.controlPanel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
            | System.Windows.Forms.AnchorStyles.Right));
            this.controlPanel.BackColor = System.Drawing.SystemColors.ControlLight;
            this.controlPanel.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
            this.controlPanel.Controls.Add(this.deleteButton);
            this.controlPanel.Controls.Add(this.clearButton);
            this.controlPanel.Controls.Add(this.fillStyleComboBox);
            this.controlPanel.Controls.Add(this.label5);
            this.controlPanel.Controls.Add(this.lineWidthComboBox);
            this.controlPanel.Controls.Add(this.label4);
            this.controlPanel.Controls.Add(this.colorComboBox);
            this.controlPanel.Controls.Add(this.label3);
            this.controlPanel.Controls.Add(this.polygonButton);
            this.controlPanel.Controls.Add(this.selectButton);
            this.controlPanel.Controls.Add(this.circleButton);
            this.controlPanel.Controls.Add(this.rectangleButton);
            this.controlPanel.Controls.Add(this.lineButton);
            this.controlPanel.Controls.Add(this.pointButton);
            this.controlPanel.Controls.Add(this.calculatorGroup);
            this.controlPanel.Controls.Add(this.historyGroup);
            this.controlPanel.Location = new System.Drawing.Point(618, 12);
            this.controlPanel.Name = "controlPanel";
            this.controlPanel.Size = new System.Drawing.Size(280, 640);
            this.controlPanel.TabIndex = 1;
            // 
            // deleteButton
            // 
            this.deleteButton.BackColor = System.Drawing.Color.LightCoral;
            this.deleteButton.Location = new System.Drawing.Point(142, 295);
            this.deleteButton.Name = "deleteButton";
            this.deleteButton.Size = new System.Drawing.Size(120, 30);
            this.deleteButton.TabIndex = 16;
            this.deleteButton.Text = "Delete Selected";
            this.deleteButton.UseVisualStyleBackColor = false;
            this.deleteButton.Click += new System.EventHandler(this.deleteButton_Click);
            // 
            // clearButton
            // 
            this.clearButton.BackColor = System.Drawing.Color.LightCoral;
            this.clearButton.Location = new System.Drawing.Point(16, 295);
            this.clearButton.Name = "clearButton";
            this.clearButton.Size = new System.Drawing.Size(120, 30);
            this.clearButton.TabIndex = 15;
            this.clearButton.Text = "Clear All";
            this.clearButton.UseVisualStyleBackColor = false;
            this.clearButton.Click += new System.EventHandler(this.clearButton_Click);
            // 
            // fillStyleComboBox
            // 
            this.fillStyleComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
            this.fillStyleComboBox.FormattingEnabled = true;
            this.fillStyleComboBox.Location = new System.Drawing.Point(90, 258);
            this.fillStyleComboBox.Name = "fillStyleComboBox";
            this.fillStyleComboBox.Size = new System.Drawing.Size(172, 21);
            this.fillStyleComboBox.TabIndex = 14;
            // 
            // label5
            // 
            this.label5.AutoSize = true;
            this.label5.Location = new System.Drawing.Point(16, 261);
            this.label5.Name = "label5";
            this.label5.Size = new System.Drawing.Size(48, 13);
            this.label5.TabIndex = 13;
            this.label5.Text = "Fill Style:";
            // 
            // lineWidthComboBox
            // 
            this.lineWidthComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
            this.lineWidthComboBox.FormattingEnabled = true;
            this.lineWidthComboBox.Location = new System.Drawing.Point(90, 231);
            this.lineWidthComboBox.Name = "lineWidthComboBox";
            this.lineWidthComboBox.Size = new System.Drawing.Size(172, 21);
            this.lineWidthComboBox.TabIndex = 12;
            // 
            // label4
            // 
            this.label4.AutoSize = true;
            this.label4.Location = new System.Drawing.Point(16, 234);
            this.label4.Name = "label4";
            this.label4.Size = new System.Drawing.Size(60, 13);
            this.label4.TabIndex = 11;
            this.label4.Text = "Line Width:";
            // 
            // colorComboBox
            // 
            this.colorComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
            this.colorComboBox.FormattingEnabled = true;
            this.colorComboBox.Location = new System.Drawing.Point(90, 204);
            this.colorComboBox.Name = "colorComboBox";
            this.colorComboBox.Size = new System.Drawing.Size(172, 21);
            this.colorComboBox.TabIndex = 10;
            // 
            // label3
            // 
            this.label3.AutoSize = true;
            this.label3.Location = new System.Drawing.Point(16, 207);
            this.label3.Name = "label3";
            this.label3.Size = new System.Drawing.Size(34, 13);
            this.label3.TabIndex = 9;
            this.label3.Text = "Color:";
            // 
            // polygonButton
            // 
            this.polygonButton.Location = new System.Drawing.Point(142, 168);
            this.polygonButton.Name = "polygonButton";
            this.polygonButton.Size = new System.Drawing.Size(120, 30);
            this.polygonButton.TabIndex = 8;
            this.polygonButton.Text = "Polygon";
            this.polygonButton.UseVisualStyleBackColor = true;
            this.polygonButton.Click += new System.EventHandler(this.polygonButton_Click);
            // 
            // selectButton
            // 
            this.selectButton.Location = new System.Drawing.Point(16, 168);
            this.selectButton.Name = "selectButton";
            this.selectButton.Size = new System.Drawing.Size(120, 30);
            this.selectButton.TabIndex = 7;
            this.selectButton.Text = "Select";
            this.selectButton.UseVisualStyleBackColor = true;
            this.selectButton.Click += new System.EventHandler(this.selectButton_Click);
            // 
            // circleButton
            // 
            this.circleButton.Location = new System.Drawing.Point(142, 132);
            this.circleButton.Name = "circleButton";
            this.circleButton.Size = new System.Drawing.Size(120, 30);
            this.circleButton.TabIndex = 6;
            this.circleButton.Text = "Circle";
            this.circleButton.UseVisualStyleBackColor = true;
            this.circleButton.Click += new System.EventHandler(this.circleButton_Click);
            // 
            // rectangleButton
            // 
            this.rectangleButton.Location = new System.Drawing.Point(16, 132);
            this.rectangleButton.Name = "rectangleButton";
            this.rectangleButton.Size = new System.Drawing.Size(120, 30);
            this.rectangleButton.TabIndex = 5;
            this.rectangleButton.Text = "Rectangle";
            this.rectangleButton.UseVisualStyleBackColor = true;
            this.rectangleButton.Click += new System.EventHandler(this.rectangleButton_Click);
            // 
            // lineButton
            // 
            this.lineButton.Location = new System.Drawing.Point(142, 96);
            this.lineButton.Name = "lineButton";
            this.lineButton.Size = new System.Drawing.Size(120, 30);
            this.lineButton.TabIndex = 4;
            this.lineButton.Text = "Line";
            this.lineButton.UseVisualStyleBackColor = true;
            this.lineButton.Click += new System.EventHandler(this.lineButton_Click);
            // 
            // pointButton
            // 
            this.pointButton.Location = new System.Drawing.Point(16, 96);
            this.pointButton.Name = "pointButton";
            this.pointButton.Size = new System.Drawing.Size(120, 30);
            this.pointButton.TabIndex = 3;
            this.pointButton.Text = "Point";
            this.pointButton.UseVisualStyleBackColor = true;
            this.pointButton.Click += new System.EventHandler(this.pointButton_Click);
            // 
            // calculatorGroup
            // 
            this.calculatorGroup.Controls.Add(this.cotLabel);
            this.calculatorGroup.Controls.Add(this.cscLabel);
            this.calculatorGroup.Controls.Add(this.secLabel);
            this.calculatorGroup.Controls.Add(this.tanLabel);
            this.calculatorGroup.Controls.Add(this.cosLabel);
            this.calculatorGroup.Controls.Add(this.sinLabel);
            this.calculatorGroup.Controls.Add(this.calculateButton);
            this.calculatorGroup.Controls.Add(this.constantComboBox);
            this.calculatorGroup.Controls.Add(this.label2);
            this.calculatorGroup.Controls.Add(this.angleTypeComboBox);
            this.calculatorGroup.Controls.Add(this.angleTextBox);
            this.calculatorGroup.Controls.Add(this.label1);
            this.calculatorGroup.Location = new System.Drawing.Point(16, 331);
            this.calculatorGroup.Name = "calculatorGroup";
            this.calculatorGroup.Size = new System.Drawing.Size(246, 180);
            this.calculatorGroup.TabIndex = 2;
            this.calculatorGroup.TabStop = false;
            this.calculatorGroup.Text = "Trigonometry Calculator";
            // 
            // cotLabel
            // 
            this.cotLabel.AutoSize = true;
            this.cotLabel.Location = new System.Drawing.Point(130, 150);
            this.cotLabel.Name = "cotLabel";
            this.cotLabel.Size = new System.Drawing.Size(30, 13);
            this.cotLabel.TabIndex = 11;
            this.cotLabel.Text = "cot: ";
            // 
            // cscLabel
            // 
            this.cscLabel.AutoSize = true;
            this.cscLabel.Location = new System.Drawing.Point(130, 130);
            this.cscLabel.Name = "cscLabel";
            this.cscLabel.Size = new System.Drawing.Size(30, 13);
            this.cscLabel.TabIndex = 10;
            this.cscLabel.Text = "csc: ";
            // 
            // secLabel
            // 
            this.secLabel.AutoSize = true;
            this.secLabel.Location = new System.Drawing.Point(130, 110);
            this.secLabel.Name = "secLabel";
            this.secLabel.Size = new System.Drawing.Size(30, 13);
            this.secLabel.TabIndex = 9;
            this.secLabel.Text = "sec: ";
            // 
            // tanLabel
            // 
            this.tanLabel.AutoSize = true;
            this.tanLabel.Location = new System.Drawing.Point(20, 150);
            this.tanLabel.Name = "tanLabel";
            this.tanLabel.Size = new System.Drawing.Size(28, 13);
            this.tanLabel.TabIndex = 8;
            this.tanLabel.Text = "tan: ";
            // 
            // cosLabel
            // 
            this.cosLabel.AutoSize = true;
            this.cosLabel.Location = new System.Drawing.Point(20, 130);
            this.cosLabel.Name = "cosLabel";
            this.cosLabel.Size = new System.Drawing.Size(30, 13);
            this.cosLabel.TabIndex = 7;
            this.cosLabel.Text = "cos: ";
            // 
            // sinLabel
            // 
            this.sinLabel.AutoSize = true;
            this.sinLabel.Location = new System.Drawing.Point(20, 110);
            this.sinLabel.Name = "sinLabel";
            this.sinLabel.Size = new System.Drawing.Size(27, 13);
            this.sinLabel.TabIndex = 6;
            this.sinLabel.Text = "sin: ";
            // 
            // calculateButton
            // 
            this.calculateButton.Location = new System.Drawing.Point(150, 70);
            this.calculateButton.Name = "calculateButton";
            this.calculateButton.Size = new System.Drawing.Size(80, 25);
            this.calculateButton.TabIndex = 5;
            this.calculateButton.Text = "Calculate";
            this.calculateButton.UseVisualStyleBackColor = true;
            this.calculateButton.Click += new System.EventHandler(this.calculateButton_Click);
            // 
            // constantComboBox
            // 
            this.constantComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
            this.constantComboBox.FormattingEnabled = true;
            this.constantComboBox.Location = new System.Drawing.Point(90, 73);
            this.constantComboBox.Name = "constantComboBox";
            this.constantComboBox.Size = new System.Drawing.Size(54, 21);
            this.constantComboBox.TabIndex = 4;
            this.constantComboBox.SelectedIndexChanged += new System.EventHandler(this.constantComboBox_SelectedIndexChanged);
            // 
            // label2
            // 
            this.label2.AutoSize = true;
            this.label2.Location = new System.Drawing.Point(20, 76);
            this.label2.Name = "label2";
            this.label2.Size = new System.Drawing.Size(56, 13);
            this.label2.TabIndex = 3;
            this.label2.Text = "Constants:";
            // 
            // angleTypeComboBox
            // 
            this.angleTypeComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
            this.angleTypeComboBox.FormattingEnabled = true;
            this.angleTypeComboBox.Location = new System.Drawing.Point(170, 43);
            this.angleTypeComboBox.Name = "angleTypeComboBox";
            this.angleTypeComboBox.Size = new System.Drawing.Size(60, 21);
            this.angleTypeComboBox.TabIndex = 2;
            // 
            // angleTextBox
            // 
            this.angleTextBox.Location = new System.Drawing.Point(90, 43);
            this.angleTextBox.Name = "angleTextBox";
            this.angleTextBox.Size = new System.Drawing.Size(74, 20);
            this.angleTextBox.TabIndex = 1;
            this.angleTextBox.Text = "30";
            // 
            // label1
            // 
            this.label1.AutoSize = true;
            this.label1.Location = new System.Drawing.Point(20, 46);
            this.label1.Name = "label1";
            this.label1.Size = new System.Drawing.Size(37, 13);
            this.label1.TabIndex = 0;
            this.label1.Text = "Angle:";
            // 
            // statusStrip
            // 
            this.statusStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
            this.statusLabel,
            this.coordinatesLabel});
            this.statusStrip.Location = new System.Drawing.Point(0, 665);
            this.statusStrip.Name = "statusStrip";
            this.statusStrip.Size = new System.Drawing.Size(910, 22);
            this.statusStrip.TabIndex = 2;
            this.statusStrip.Text = "statusStrip1";
            // 
            // statusLabel
            // 
            this.statusLabel.Name = "statusLabel";
            this.statusLabel.Size = new System.Drawing.Size(42, 17);
            this.statusLabel.Text = "Ready";
            // 
            // coordinatesLabel
            // 
            this.coordinatesLabel.Name = "coordinatesLabel";
            this.coordinatesLabel.Size = new System.Drawing.Size(34, 17);
            this.coordinatesLabel.Text = "X: Y:";
            // 
            // historyGroup
            // 
            this.historyGroup.Controls.Add(this.historyListBox);
            this.historyGroup.Location = new System.Drawing.Point(16, 3);
            this.historyGroup.Name = "historyGroup";
            this.historyGroup.Size = new System.Drawing.Size(246, 87);
            this.historyGroup.TabIndex = 0;
            this.historyGroup.TabStop = false;
            this.historyGroup.Text = "Drawing History";
            // 
            // historyListBox
            // 
            this.historyListBox.Dock = System.Windows.Forms.DockStyle.Fill;
            this.historyListBox.FormattingEnabled = true;
            this.historyListBox.Location = new System.Drawing.Point(3, 16);
            this.historyListBox.Name = "historyListBox";
            this.historyListBox.Size = new System.Drawing.Size(240, 68);
            this.historyListBox.TabIndex = 0;
            // 
            // MainForm
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(910, 687);
            this.Controls.Add(this.statusStrip);
            this.Controls.Add(this.controlPanel);
            this.Controls.Add(this.drawingPanel);
            this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
            this.Name = "MainForm";
            this.Text = "Geometry Drawing App";
            this.Load += new System.EventHandler(this.MainForm_Load);
            this.controlPanel.ResumeLayout(false);
            this.controlPanel.PerformLayout();
            this.calculatorGroup.ResumeLayout(false);
            this.calculatorGroup.PerformLayout();
            this.statusStrip.ResumeLayout(false);
            this.statusStrip.PerformLayout();
            this.historyGroup.ResumeLayout(false);
            this.ResumeLayout(false);
            this.PerformLayout();

        }

        #endregion

        private System.Windows.Forms.Panel drawingPanel;
        private System.Windows.Forms.Panel controlPanel;
        private System.Windows.Forms.StatusStrip statusStrip;
        private System.Windows.Forms.ToolStripStatusLabel statusLabel;
        private System.Windows.Forms.GroupBox historyGroup;
        private System.Windows.Forms.ListBox historyListBox;
        private System.Windows.Forms.Button pointButton;
        private System.Windows.Forms.Button lineButton;
        private System.Windows.Forms.Button rectangleButton;
        private System.Windows.Forms.Button circleButton;
        private System.Windows.Forms.Button polygonButton;
        private System.Windows.Forms.Button selectButton;
        private System.Windows.Forms.ComboBox colorComboBox;
        private System.Windows.Forms.Label label3;
        private System.Windows.Forms.ComboBox lineWidthComboBox;
        private System.Windows.Forms.Label label4;
        private System.Windows.Forms.ComboBox fillStyleComboBox;
        private System.Windows.Forms.Label label5;
        private System.Windows.Forms.Button clearButton;
        private System.Windows.Forms.GroupBox calculatorGroup;
        private System.Windows.Forms.Label label1;
        private System.Windows.Forms.TextBox angleTextBox;
        private System.Windows.Forms.ComboBox angleTypeComboBox;
        private System.Windows.Forms.Button calculateButton;
        private System.Windows.Forms.ComboBox constantComboBox;
        private System.Windows.Forms.Label label2;
        private System.Windows.Forms.Label sinLabel;
        private System.Windows.Forms.Label cotLabel;
        private System.Windows.Forms.Label cscLabel;
        private System.Windows.Forms.Label secLabel;
        private System.Windows.Forms.Label tanLabel;
        private System.Windows.Forms.Label cosLabel;
        private System.Windows.Forms.Button deleteButton;
        private System.Windows.Forms.ToolStripStatusLabel coordinatesLabel;
    }
}

功能说明

这个几何绘图应用包含以下核心功能:

  1. 绘图功能

    • 支持绘制点、线、矩形、圆和多边形
    • 可选择颜色、线宽和填充样式
    • 选择工具可选取已绘制的图形
    • 可删除选中的图形或清空整个画布
  2. 三角函数计算器

    • 支持角度和弧度模式
    • 计算正弦、余弦、正切及其倒数函数
    • 内置常用数学常数(π、e、√2等)
  3. 历史记录

    • 记录所有绘制的图形
    • 显示图形类型和位置信息
  4. 用户界面

    • 左侧为绘图区域,右侧为控制面板
    • 状态栏显示当前模式和鼠标坐标
    • 直观的工具栏和设置选项

使用说明

  1. 绘图

    • 选择要绘制的图形类型(点、线、矩形等)
    • 在绘图区域点击并拖动鼠标创建图形
    • 对于多边形:点击多个点,最后点击"Complete Polygon"按钮完成
  2. 编辑

    • 使用选择工具点击图形可选中它
    • 点击"Delete Selected"删除选中图形
    • 点击"Clear All"清空整个画布
  3. 三角函数计算

    • 输入角度值(或使用预设常数)
    • 选择角度单位(度或弧度)
    • 点击"Calculate"按钮计算结果

这个应用程序结合了几何绘图和数学计算功能,适合用于教学、工程绘图和数学学习场景。界面设计直观,功能完整,代码结构清晰易于扩展。

相关推荐
Thanks_ks20 天前
43 C 语言 math.h 库函数详解:绝对值、数学运算、取整舍入、分解组合、三角反三角、双曲函数及宏定义常量
三角函数·math.h 库函数·绝对值函数·数学运算函数·取整与舍入函数·分解与组合函数·反三角函数
IOT那些事儿24 天前
DSP使用三角函数问题
dsp·三角函数·sinf
巽星石9 个月前
【Blender Python】7.一些运算、三角函数以及随机
python·blender·三角函数·随机·环形阵列
临床数据科学和人工智能兴趣组1 年前
用R语言进行绝对值运算、平方根运算和三角函数运算
数据挖掘·数据分析·r语言·r·三角函数·运算
荒原之梦网1 年前
【考研高数】tan(arcsin x)、tan(arccos x)、sin(arccos x)、cos(arcsin x) 等于多少?
考研·考研数学·三角函数
LaoZhangGong1232 年前
傅里叶级数系数的完整详细算法
经验分享·算法·高等数学·滤波·三角函数·傅里叶级数·积分
xuchaoxin13752 年前
EM@三角恒等变换P1
三角函数