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

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

设计思路

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

完整实现代码

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(){// 初始化三角函数计算器UIangleTypeComboBox.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}";elsesecLabel.Text = "sec: undefined";if (Math.Sin(radians) != 0)cscLabel.Text = $"csc: {1.0 / Math.Sin(radians):F4}";elsecscLabel.Text = "csc: undefined";if (Math.Tan(radians) != 0)cotLabel.Text = $"cot: {1.0 / Math.Tan(radians):F4}";elsecotLabel.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: // eangleTextBox.Text = Math.E.ToString("F6");break;case 2: // √2angleTextBox.Text = Math.Sqrt(2).ToString("F6");break;case 3: // √3angleTextBox.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)

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 codeprivate 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();}#endregionprivate 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"按钮计算结果

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/bicheng/84191.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CSS 定位:原理 + 场景 + 示例全解析

一. 什么是CSS定位? CSS中的position属性用于设置元素的定位方式,它决定了元素在页面中的"定位行为" 为什么需要定位? 常规布局(如 display: block)适用于主结构 定位适用于浮动按钮,弹出层,粘性标题等场景帮助我们精确控制元素在页面中的位置 二. 定位类型全…

GESP 二级复习参考 A

本教程完整包含&#xff1a; 5000字详细知识点解析 36个Python/C双语言示例 15个GESP真题及模拟题 8张专业图表和流程图 # C编程二级标准终极教程## 一、计算机存储系统深度解析### 1.1 存储体系架构 mermaid graph TDA[CPU寄存器] --> B[L1缓存 1-2ns]B --> C[L2缓…

嵌入式面试常问问题

以下内容面向嵌入式/系统方向的初学者与面试备考者,全面梳理了以下几大板块,并在每个板块末尾列出常见的面试问答思路,帮助你既能夯实基础,又能应对面试挑战。 一、TCP/IP 协议 1.1 TCP/IP 五层模型概述 链路层(Link Layer) 包括网卡驱动、以太网、Wi‑Fi、PPP 等。负责…

【人工智能 | 项目开发】Python Flask实现本地AI大模型可视化界面

文末获取项目源码。 文章目录 项目背景项目结构app.py(后端服务)index.html(前端界面)项目运行项目图示项目源码项目背景 随着人工智能技术的快速发展,大语言模型在智能交互领域展现出巨大潜力。本项目基于 Qwen3-1.7B 模型,搭建一个轻量化的智能聊天助手,旨在为用户提…

【设计模式】1.简单工厂、工厂、抽象工厂模式

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 以下是 简单工厂模式、工厂方法模式 和 抽象工厂模式 的 Python 实现与对比&#xff0c;结合代码示例和实际应用场景说明&#xff1a; 1. 简单工厂模式&a…

浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)

✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义&#xff08;Task Definition&…

01.SQL语言概述

SQL 语言概述 SQL &#xff08;Structured Query Language&#xff09;结构化査询语言 1. 关系型数据库的常见组件 数据库: database 表的集合&#xff0c;物理上表现为一个目录表: table&#xff0c;行: row 列: column索引: index视图: view&#xff0c;虚拟的表存储过程:…

C++学习-入门到精通【14】标准库算法

C学习-入门到精通【14】标准库算法 目录 C学习-入门到精通【14】标准库算法一、对迭代器的最低要求迭代器无效 二、算法1.fill、fill_n、generate和generate_n2.equal、mismatch和lexicographical_compare3.remove、remove_if、remove_copy和remove_copy_if4.replace、replace_…

Vue 项目实战:三种方式实现列表→详情页表单数据保留与恢复

背景&#xff1a;在Vue项目中&#xff0c;实现列表页跳转详情页并保留表单数据&#xff0c;返回时恢复表单状态。 核心功能&#xff1a; 保存缓存&#xff1a;点击查询按钮时&#xff0c;表单数据保存恢复缓存&#xff1a;从详情页返回时&#xff0c;恢复表单数据清除缓存&…

iptables实验

实验一&#xff1a;搭建web服务&#xff0c;设置任何人能够通过80端口访问。 1.下载并启用httpd服务器 dnf -y install httpd 开启httpd服务器 systemctl start httpd 查看是否启用 下载并启用iptables&#xff0c;并关闭firewalld yum install iptable…

Razor编程RenderXXX相关方法大全

文章目录 第一章&#xff1a;RenderXXX方法概述1.1 RenderXXX方法的作用与意义1.2 基本工作原理1.3 主要方法分类 第二章&#xff1a;部分视图渲染方法2.1 Html.RenderPartial()2.2 Html.RenderAction()2.3 性能对比分析 第三章&#xff1a;视图组件渲染方法3.1 Html.RenderCom…

Go 语言 range 关键字全面解析

Go 语言 range 关键字全面解析 range 是 Go 语言中用于迭代数据结构的关键字&#xff0c;支持多种数据类型的遍历操作。它提供了一种简洁、安全且高效的方式来处理集合类型的数据。 基本语法 for index, value : range collection {// 循环体 } 1. 数组/切片迭代 fruits :…

美化显示LLDB调试的数据结构

前面的博文美化显示GDB调试的数据结构介绍了如何美化显示GDB中调试的数据结构&#xff0c;本文将还是以mupdf库为例介绍如何美化显示LLDB中调试的数据结构。 先看一下美化后的效果&#xff1a; 一、加载自定义脚本 与GDB类似&#xff0c;需要添加一个~/.lldbinit文件&#xf…

【Java学习笔记】日期类

日期类 第一代日期类&#xff1a;Date 引入包 import java.text.ParseException&#xff1a;日期转换可能会抛出转换异常 import java.text.SimpleDateFormat import java.util.Date 1. 基本介绍 Date&#xff1a;精确到毫秒&#xff0c;代表特定的瞬间 SimpleDateForma…

C++基础进阶:函数、内联函数与Lambda函数详解

引言 在C编程的旅程中&#xff0c;函数是构建复杂程序的基本单元。它们像乐高积木一样&#xff0c;允许我们将代码分解成更小、更易于管理的部分。今天&#xff0c;我们将深入探讨C中的三种重要函数类型&#xff1a;普通函数、内联函数以及Lambda函数。掌握它们&#xff0c;将…

从Node.js到React/Vue3:流式输出技术的全栈实现指南

本文将从底层原理到工程实践&#xff0c;完整解析如何使用Node.js后端结合React和Vue3前端实现流式输出功能&#xff0c;涵盖协议选择、性能优化、错误处理等关键细节&#xff0c;并通过真实场景案例演示完整开发流程。 一、流式输出的核心原理与协议选择 1.1 流式传输的底层机…

AT2401C中科微2.4g芯片PA

作为无线通信系统的核心模块&#xff0c;射频前端芯片通过整合功率放大器&#xff08;PA&#xff09;、滤波器、开关和低噪声放大器&#xff08;LNA&#xff09;等关键组件&#xff0c;成为保障通信质量、降低功耗及维持信号稳定的决定性因素。 AT2401C是一款面向2.4GHz无线通信…

Linux安装jdk、tomcat

1、安装jdk sudo yum install -y java-1.8.0-openjdk-devel碰到的问题&#xff1a;/var/run/yum.pid 已被锁定 Another app is currently holding the yum lock&#xff1b; waiting for it to exit… https://blog.csdn.net/u013669912/article/details/131259156 参考&#…

在本地电脑中部署阿里 Qwen3 大模型及连接到 Elasticsearch

在今天的文章中&#xff0c;我将参考文章 “使用 Elastic 和 LM Studio 的 Herding Llama 3.1” 来部署 Qwen3 大模型。据测评&#xff0c;这是一个非常不错的大模型。我们今天尝试使用 LM Studio 来对它进行部署&#xff0c;并详细描述如何结合 Elasticsearch 来对它进行使用。…

【设计模式】2.策略模式

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 商场收银软件为例 1. 基础版 total 0def click_ok(price,num):tot price * numtotal totprint(合计&#xff1a;, total)增加打折 total 0def cli…