几何绘图与三角函数计算应用
设计思路
- 左侧为绘图控制面板,右侧为绘图区域
- 支持绘制点、线、矩形、圆、多边形等基本几何图形
- 实现三角函数计算器(正弦、余弦、正切等)
- 包含角度/弧度切换和常用数学常数
- 历史记录功能保存用户绘图
完整实现代码
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)
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;
}
}
功能说明
这个几何绘图应用包含以下核心功能:
-
绘图功能:
- 支持绘制点、线、矩形、圆和多边形
- 可选择颜色、线宽和填充样式
- 选择工具可选取已绘制的图形
- 可删除选中的图形或清空整个画布
-
三角函数计算器:
- 支持角度和弧度模式
- 计算正弦、余弦、正切及其倒数函数
- 内置常用数学常数(π、e、√2等)
-
历史记录:
- 记录所有绘制的图形
- 显示图形类型和位置信息
-
用户界面:
- 左侧为绘图区域,右侧为控制面板
- 状态栏显示当前模式和鼠标坐标
- 直观的工具栏和设置选项
使用说明
-
绘图:
- 选择要绘制的图形类型(点、线、矩形等)
- 在绘图区域点击并拖动鼠标创建图形
- 对于多边形:点击多个点,最后点击"Complete Polygon"按钮完成
-
编辑:
- 使用选择工具点击图形可选中它
- 点击"Delete Selected"删除选中图形
- 点击"Clear All"清空整个画布
-
三角函数计算:
- 输入角度值(或使用预设常数)
- 选择角度单位(度或弧度)
- 点击"Calculate"按钮计算结果
这个应用程序结合了几何绘图和数学计算功能,适合用于教学、工程绘图和数学学习场景。界面设计直观,功能完整,代码结构清晰易于扩展。