CsGrafeq:用C#实现一个几何画板
CsGrafeq:用C#实现一个几何画板一、引言什么是几何画板几何画板是一种交互式绘图工具允许用户通过数学公式或几何约束来创建和操作图形对象。传统几何画板如GeoGebra、几何画板The Geometer’s Sketchpad等通常用于数学教学和探索。而CsGrafeq是一个基于C#的开源项目它用代码实现了类似的功能——通过编程方式绘制几何图形、处理坐标系、支持交互操作。本文将带你从零开始逐步构建一个简单的几何画板核心功能包括坐标系管理、基本图形绘制、交互操作和数学表达式解析。即使你没有C#基础也能通过本文理解核心思想。## 二、基础概念坐标系与像素映射几何画板的核心是将数学坐标系如笛卡尔坐标系映射到屏幕像素坐标。数学坐标系中y轴向上为正屏幕坐标系中y轴向下为正。我们需要一个转换函数。### 2.1 坐标转换类csharpusing System;using System.Drawing;/// summary/// 数学坐标系与屏幕坐标系的映射/// /summarypublic class CoordinateSystem{ // 屏幕中心点像素坐标 public PointF ScreenCenter { get; set; } // 每单位数学长度对应的像素数 public float Scale { get; set; } public CoordinateSystem(PointF screenCenter, float scale) { ScreenCenter screenCenter; Scale scale; } /// summary /// 将数学坐标转换为屏幕像素坐标 /// /summary public PointF MathToScreen(float mathX, float mathY) { float screenX ScreenCenter.X mathX * Scale; float screenY ScreenCenter.Y - mathY * Scale; // y轴取反 return new PointF(screenX, screenY); } /// summary /// 将屏幕坐标转换为数学坐标用于鼠标交互 /// /summary public PointF ScreenToMath(float screenX, float screenY) { float mathX (screenX - ScreenCenter.X) / Scale; float mathY (ScreenCenter.Y - screenY) / Scale; return new PointF(mathX, mathY); }}这个类提供了双向转换是几何画板的基础。Scale参数控制缩放比例例如Scale50表示1个单位长度对应50像素。## 三、绘制基本几何图形有了坐标系我们就可以在Paint事件中绘制图形。下面实现一个函数绘制坐标轴、网格线和圆。### 3.1 绘制坐标轴与网格csharpusing System.Drawing;using System.Windows.Forms;public partial class GeometryBoard : Form{ private CoordinateSystem cs; private Timer refreshTimer; public GeometryBoard() { // 初始化坐标系屏幕中心(400,300)缩放50像素/单位 cs new CoordinateSystem(new PointF(400, 300), 50f); this.Paint GeometryBoard_Paint; this.Size new Size(800, 600); this.Text CsGrafeq - 几何画板示例; } private void GeometryBoard_Paint(object sender, PaintEventArgs e) { Graphics g e.Graphics; g.SmoothingMode System.Drawing.Drawing2D.SmoothingMode.AntiAlias; // 绘制网格每隔0.5单位画一条线 Pen gridPen new Pen(Color.LightGray, 0.5f); for (float x -8; x 8; x 0.5f) { PointF p1 cs.MathToScreen(x, -6); PointF p2 cs.MathToScreen(x, 6); g.DrawLine(gridPen, p1, p2); } for (float y -6; y 6; y 0.5f) { PointF p1 cs.MathToScreen(-8, y); PointF p2 cs.MathToScreen(8, y); g.DrawLine(gridPen, p1, p2); } // 绘制坐标轴 Pen axisPen new Pen(Color.Black, 2f); PointF origin cs.MathToScreen(0, 0); PointF xEnd cs.MathToScreen(8, 0); PointF yEnd cs.MathToScreen(0, 6); g.DrawLine(axisPen, cs.MathToScreen(-8, 0), xEnd); g.DrawLine(axisPen, cs.MathToScreen(0, -6), yEnd); // 绘制一个圆圆心(2,1)半径3 DrawCircle(g, new PointF(2, 1), 3, Color.Blue); } /// summary /// 在数学坐标系中绘制圆 /// /summary private void DrawCircle(Graphics g, PointF center, float radius, Color color) { PointF screenCenter cs.MathToScreen(center.X, center.Y); float screenRadius radius * cs.Scale; Pen pen new Pen(color, 2); g.DrawEllipse(pen, screenCenter.X - screenRadius, screenCenter.Y - screenRadius, screenRadius * 2, screenRadius * 2); }}运行这段代码你会看到一个带网格和坐标轴的窗口中心位置绘制了一个半径为3的蓝色圆。## 四、交互操作鼠标拖拽与动态更新几何画板的魅力在于交互。我们可以让用户通过鼠标拖拽来平移视图平移坐标系或者滚动滚轮缩放。### 4.1 实现平移与缩放csharpprivate PointF lastMousePos; // 鼠标上次位置数学坐标private bool isDragging false;// 在构造函数中添加事件绑定public GeometryBoard(){ // ... 之前的初始化代码 ... this.MouseDown GeometryBoard_MouseDown; this.MouseMove GeometryBoard_MouseMove; this.MouseUp GeometryBoard_MouseUp; this.MouseWheel GeometryBoard_MouseWheel;}private void GeometryBoard_MouseDown(object sender, MouseEventArgs e){ if (e.Button MouseButtons.Left) { isDragging true; // 记录鼠标按下时的数学坐标 lastMousePos cs.ScreenToMath(e.X, e.Y); }}private void GeometryBoard_MouseMove(object sender, MouseEventArgs e){ if (isDragging) { // 计算鼠标移动的数学偏移量 PointF currentMath cs.ScreenToMath(e.X, e.Y); float dx currentMath.X - lastMousePos.X; float dy currentMath.Y - lastMousePos.Y; // 平移坐标系反向移动实现拖拽效果 cs.ScreenCenter new PointF( cs.ScreenCenter.X dx * cs.Scale, cs.ScreenCenter.Y - dy * cs.Scale ); // 更新上次位置 lastMousePos currentMath; this.Invalidate(); // 触发重绘 }}private void GeometryBoard_MouseUp(object sender, MouseEventArgs e){ isDragging false;}private void GeometryBoard_MouseWheel(object sender, MouseEventArgs e){ // 滚轮缩放滚轮向上放大向下缩小 float zoomFactor e.Delta 0 ? 1.1f : 0.9f; cs.Scale * zoomFactor; // 限制缩放范围避免死循环 if (cs.Scale 10) cs.Scale 10; if (cs.Scale 500) cs.Scale 500; this.Invalidate();}现在你可以用鼠标拖拽平移视图滚动滚轮缩放。每次交互都会触发Invalidate()重新绘制所有图形。## 五、高级功能引入表达式解析器真正的几何画板允许用户输入数学表达式如y x^2来绘制函数曲线。我们可以使用C#的DataTable.Compute或第三方库如NCalc实现表达式解析。下面用简单方法实现函数绘图。### 5.1 函数绘图器csharp/// summary/// 绘制数学函数 y f(x) 的曲线/// /summaryprivate void DrawFunction(Graphics g, string expression, Color color){ // 使用DataTable计算表达式简单但有限制 System.Data.DataTable table new System.Data.DataTable(); table.Columns.Add(x, typeof(double)); table.Columns.Add(y, typeof(double)); Pen pen new Pen(color, 2); PointF? lastPoint null; // 在x范围[-8,8]内采样步长0.01 for (float x -8; x 8; x 0.01f) { // 替换表达式中的x变量 string expr expression.Replace(x, x.ToString(0.000)); try { double y Convert.ToDouble(table.Compute(expr, )); if (double.IsNaN(y) || double.IsInfinity(y)) continue; PointF current cs.MathToScreen(x, (float)y); if (lastPoint.HasValue) { g.DrawLine(pen, lastPoint.Value, current); } lastPoint current; } catch { // 忽略计算错误如除零 lastPoint null; } }}在Paint事件中调用csharp// 在GeometryBoard_Paint方法末尾添加DrawFunction(g, x*x, Color.Red); // 抛物线 yx^2DrawFunction(g, Sin(x), Color.Green); // 正弦曲线注意DataTable.Compute不支持三角函数的弧度计算实际项目中应使用Math.Sin等原生函数。这里仅示意思路。## 六、完整代码整合与运行将上述所有代码合并到一个GeometryBoard.cs文件中添加Main入口csharpstatic class Program{ [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new GeometryBoard()); }}运行后你将看到- 带网格和坐标轴的画布- 一个蓝色圆圆心(2,1)半径3- 红色抛物线yx^2和绿色正弦曲线- 鼠标左键拖拽平移滚轮缩放## 总结本文从零开始用C#实现了一个简化版的几何画板核心功能1.坐标系映射解决了数学坐标与屏幕像素的转换问题。2.图形绘制展示了如何绘制网格、坐标轴和圆。3.交互操作实现了鼠标拖拽平移和滚轮缩放提升了用户体验。4.表达式解析初步实现了函数曲线的动态绘制。CsGrafeq的完整版本还包括更多高级特性点选与拖动对象、几何约束求解、动画生成、导出图片等。通过本文的学习你已经掌握了构建几何画板的基础框架可以继续扩展功能比如添加矩形、直线、角度测量等对象甚至实现类似于GeoGebra的交互式几何学习工具。C#的Windows Forms结合GDI提供了强大的绘图能力而数学与编程的结合正是几何画板项目的魅力所在。希望你能以此为基础创造出属于自己的数学可视化工具

相关新闻

热敏电阻工作原理、应用电路与硬件面试全解析

热敏电阻工作原理、应用电路与硬件面试全解析

热敏电阻是硬件工程师笔面试中的高频考点,这次我们直接切入核心:它是什么、怎么工作、用在哪儿、怎么测。如果你准备硬件岗位面试,或者在实际项目中需要选型测温、过流保护元件,这篇文章可以帮你快速掌握关键参数和测试方法。 热…

2026/7/30 14:27:03阅读更多 →
Simulink直流电机仿真:从模型搭建到控制环路设计的工程实践

Simulink直流电机仿真:从模型搭建到控制环路设计的工程实践

1. 从零开始:为什么电力电子仿真绕不开Simulink与直流电机 如果你刚接触电力电子,或者正在做电机控制相关的课程设计、毕业项目,大概率会听到一个建议:“用Matlab/Simulink搭个模型先仿真看看”。这几乎成了行业里的一个标准动作。…

2026/7/30 14:27:03阅读更多 →
Python Pillow图像批处理实战:尺寸调整、格式转换与水印添加

Python Pillow图像批处理实战:尺寸调整、格式转换与水印添加

在实际图像处理项目中,经常需要批量处理图片,例如调整尺寸、转换格式、添加水印或批量重命名。这类任务如果手动操作,不仅效率低下,还容易出错。本文将基于常见的Python图像处理库Pillow,演示如何构建一个实用的批量图…

2026/7/30 14:27:03阅读更多 →
人物设定总是不完整?这5组资产卡提示词帮你补齐细节

人物设定总是不完整?这5组资产卡提示词帮你补齐细节

横版 16:9 AIGC 女性角色资产设定档案海报,主题为清透治愈系少女写真风,白色高级背景,天蓝色、纯白色与浅银灰配色,细线边框、微光星点、透明玻璃质感装饰,优雅时尚杂志排版,角色名【许知夏】。顶部大标题为“人物设定档案”,右上角设置角色姓名区域、天蓝色角色徽章与简…

2026/7/30 15:43:22阅读更多 →
QGroundControl无人机地面站:新手入门到精通的全方位指南

QGroundControl无人机地面站:新手入门到精通的全方位指南

QGroundControl无人机地面站:新手入门到精通的全方位指南 【免费下载链接】qgroundcontrol Cross-platform ground control station for drones (Android, iOS, Mac OS, Linux, Windows) 项目地址: https://gitcode.com/gh_mirrors/qg/qgroundcontrol QGroun…

2026/7/30 15:43:22阅读更多 →
为什么你的AI渠道ROI始终卡在1.8?资深架构师亲授:4步动态校准法,72小时内重置评估体系

为什么你的AI渠道ROI始终卡在1.8?资深架构师亲授:4步动态校准法,72小时内重置评估体系

更多请点击: https://intelliparadigm.com 第一章:AI 渠道效益分析 AI渠道正从技术实验阶段迈向规模化商业落地,其效益评估需超越单一指标,构建涵盖获客效率、转化质量、运营成本与客户生命周期价值的多维分析框架。企业部署AI驱…

2026/7/30 15:43:22阅读更多 →
“生成即可用”不是口号:SD贴图直出工作流上线72小时后,某SLG项目贴图产能提升417%(附完整Pipeline审计报告)

“生成即可用”不是口号:SD贴图直出工作流上线72小时后,某SLG项目贴图产能提升417%(附完整Pipeline审计报告)

更多请点击: https://kaifayun.com 第一章:SD贴图直出工作流的落地价值与行业意义 在游戏开发、影视资产制作与工业可视化等实时渲染密集型领域,传统贴图管线长期依赖 Photoshop 手绘、Substance Designer 多层节点烘焙及 Painter 手动绘制&…

2026/7/30 15:43:22阅读更多 →
RTX 5080 vs 5090:1440p与4K游戏性能实测对比分析

RTX 5080 vs 5090:1440p与4K游戏性能实测对比分析

如果你最近在关注下一代显卡的动向,大概率已经看到了各种关于 RTX 5080 和 RTX 5090 的性能预测和跑分泄露。但比起抽象的跑分数字,真正让人纠结的问题是:在真实的游戏场景里,尤其是在主流的 1440p 和高要求的 4K 分辨率下&#x…

2026/7/30 15:43:22阅读更多 →
Node.js 安装与配置全攻略:从零搭建稳定开发环境

Node.js 安装与配置全攻略:从零搭建稳定开发环境

1. 项目概述:为什么Node.js的安装值得你花时间 如果你刚开始接触Web开发,或者想从后端Java、PHP转向更现代的JavaScript全栈,那么Node.js绝对是你绕不开的第一道坎。很多人觉得“安装”不就是点下一步吗?但恰恰是这一步&#xff0…

2026/7/30 15:41:22阅读更多 →
覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

🔹 工具基础介绍 OpenClaw 是开源生态中一款实用性较强的本地智能工具,凭借本地离线运行、可视化图形操作和任务自动化三大核心特性,赢得了众多用户的青睐。与普通在线对话AI工具不同,它属于能够直接操控本机软硬件的智能数字员工…

2026/7/30 15:03:16阅读更多 →
伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

所谓液压伺服阀体的精密激光焊接,是用激光束对阀座壳体(通常为不锈钢或铝合金)进行密封焊接,使阀体在21-35MPa的高压液压油或压缩气体中长期运行而不发生介质泄漏。液压伺服阀是高端液压系统的"大脑"。从航空航天飞行控…

2026/7/30 12:22:27阅读更多 →
D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你是否还在…

2026/7/30 15:13:02阅读更多 →
3分钟解锁iOS应用自由:TrollInstallerX让你的iPhone摆脱安装限制 [特殊字符]

3分钟解锁iOS应用自由:TrollInstallerX让你的iPhone摆脱安装限制 [特殊字符]

3分钟解锁iOS应用自由:TrollInstallerX让你的iPhone摆脱安装限制 🚀 【免费下载链接】TrollInstallerX A TrollStore installer for iOS 14.0 - 16.6.1 项目地址: https://gitcode.com/gh_mirrors/tr/TrollInstallerX 你是否曾经因为iOS系统的严格…

2026/7/30 0:00:58阅读更多 →
[GESP202606 四级] 扫雷

[GESP202606 四级] 扫雷

B4557 [GESP202606 四级] 扫雷 https://www.luogu.com.cn/problem/B4557 中国计算机学会(CCF)2026年6月C四级讲解——扫雷 https://www.bilibili.com/video/BV1MCMg6AEXR/ B4557 [GESP202606 四级] 扫雷 https://www.bilibili.com/video/BV1ZKTj6ZEVh/ 2…

2026/7/30 0:00:58阅读更多 →
Windows驱动存储终极清理工具:DriverStoreExplorer完全指南

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 您是否曾因Windows系统盘空间不足而烦恼?是否遇到过设…

2026/7/30 0:00:58阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/30 0:27:26阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/30 4:47:18阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/29 14:26:42阅读更多 →