使用c#制作坐标

devtools/2024/12/27 21:26:26/

1、建立坐标

2、坐标系的放大缩小

3、标定刻度

4、实时显示鼠标在坐标系上的坐标

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Reflection.Emit;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace coordinates
{public partial class Form1 : Form{private PictureBox pictureBox;private float zoomFactor = 1.2f;   //初始放缩因子private float zoomLevel = 1.0f;   //每次滚动缩放变化的步长private Point offset;              // 视图偏移量public Form1(){InitializeComponent();// 初始化 PictureBoxpictureBox = new PictureBox{Dock = DockStyle.Fill,         //填满窗体SizeMode = PictureBoxSizeMode.AutoSize};this.Controls.Add(pictureBox);// 订阅 Paint 事件pictureBox1.Paint += PictureBox_Paint;// 为pictureBox1的MouseWheel事件添加处理程序this.pictureBox1.MouseWheel += new MouseEventHandler(pictureBox1_MouseWheel);//订阅鼠标移动事件this.pictureBox1.MouseMove += new MouseEventHandler(pictureBox1_MouseMove);}private string fullname = null;//图像文件完整路径public Form1(string a){InitializeComponent1();fullname = a;}private int originalWidth;private int originalHeight;private void InitializeComponent1(){// 初始化 PictureBox 的原始大小originalWidth = pictureBox1.Width;originalHeight = pictureBox1.Height;// 其他初始化代码}//鼠标滚轮事件private void pictureBox1_MouseWheel(object sender, MouseEventArgs e){// 根据鼠标滚轮的滚动方向调整缩放级别if (e.Delta > 0){zoomLevel *= 1.1f; // 放大}else{zoomLevel /= 1.1f; // 缩小}// 确保缩放级别在合理范围内(放大到最大,缩小到最小)zoomLevel = Math.Max(0.1f, Math.Min(1.0f, zoomLevel));// 重新绘制 PictureBoxpictureBox1.Invalidate();}//画板制作--网格坐标private void PictureBox_Paint(object sender, PaintEventArgs e){// 网络坐标Graphics g = e.Graphics;Pen gridPen = new Pen(Color.LightGray, 1); // 网格线的颜色和宽度Font font = new Font("Arial", 8);SolidBrush brush = new SolidBrush(Color.Black);  //实例画刷// 获取 PictureBox 的尺寸int width = pictureBox1.Width;int height = pictureBox1.Height;// 根据放缩级别调整网格线的绘制间隔int gridSize = (int)(15 / zoomLevel); // zoomLevel步长// ———————————绘制网格坐标线————————————//水平线for (int i = width / 2; i <= width; i += gridSize){g.DrawLine(gridPen, i, 0, i, height);}for (int i = width / 2 - gridSize; i >= 0; i -= gridSize){g.DrawLine(gridPen, i, 0, i, height);}// 垂直线for (int i = height / 2; i <= height; i += gridSize){g.DrawLine(gridPen, 0, i, width, i);}for (int i = height / 2 - gridSize; i >= 0; i -= gridSize){g.DrawLine(gridPen, 0, i, width, i);}// 绘制坐标轴Pen axisPen = new Pen(Color.Black, 2);axisPen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dash; // 设置为虚线g.DrawLine(axisPen, 0, height / 2, width, height / 2); // X轴g.DrawLine(axisPen, width / 2, 0, width / 2, height); // Y轴// 绘制顶部刻度线// 假设你想让刻度值从 0 开始,每条刻度线增加 1int scaleValue = 0;for (int i = width / 2; i <= width; i += gridSize){g.DrawLine(axisPen, i, 0, i, 5); // 顶部刻度线g.DrawString(scaleValue.ToString(), font, brush, i - 5, 10); // 顶部刻度值//scaleValue++;scaleValue += 5;}scaleValue =0;for (int i = width / 2 ; i >= 0; i -= gridSize){g.DrawLine(axisPen, i, 0, i, 5); // 顶部刻度线g.DrawString(scaleValue.ToString(), font, brush, i - 5, 10); // 顶部刻度值scaleValue -= 5;}// 绘制左侧刻度线// 假设你想让刻度值从 0 开始,每条刻度线增加 1int leftScaleValue = 0;for (int i = height / 2; i <= height; i += gridSize){g.DrawLine(axisPen, 0, i, 5, i); // 左侧刻度线g.DrawString(leftScaleValue.ToString(), font, brush, 10, i - 5); // 左侧刻度值leftScaleValue -= 5;}leftScaleValue = 5;for (int i = height / 2 - gridSize; i >= 0; i -= gridSize){g.DrawLine(axisPen, 0, i, 5, i); // 左侧刻度线g.DrawString(leftScaleValue.ToString(), font, brush, 10, i - 5); // 左侧刻度值leftScaleValue += 5;}//刻度线边缘线Pen sige_Pen = new Pen(Color.Black, 2);sige_Pen.DashStyle = System.Drawing.Drawing2D.DashStyle.Solid; // 设置为实线g.DrawLine(sige_Pen, 0, 0, width,0); g.DrawLine(sige_Pen, 0, 0, 0, height);g.DrawLine(sige_Pen, width, 0, width, height);g.DrawLine(sige_Pen, 0, height, width, height);}private void pictureBox1_Click(object sender, EventArgs e){}private void pictureBox1_MouseDown(object sender, MouseEventArgs e){}//鼠标移动事件private void pictureBox1_MouseMove(object sender, MouseEventArgs e){// 计算鼠标相对于中心点的偏移量(原点)int centerX = pictureBox1.Width / 2;         int centerY = pictureBox1.Height / 2;// 获取相对中心点的偏移量并根据缩放级别进行调整float gridX = ((e.X - centerX) * zoomLevel / 15)*5;float gridY = ((centerY - e.Y) * zoomLevel / 15)*5;// 显示当前的网络坐标textBox1.Text = $"X: {gridX:F2}, Y: {gridY:F2}";}private void pictureBox1_MouseDown_1(object sender, MouseEventArgs e){}}
}


http://www.ppmy.cn/devtools/145925.html

相关文章

深圳南柯电子|医疗设备EMC测试整改:确保电磁安全的合规之路

在现代医疗领域&#xff0c;电子设备的广泛应用极大地提升了医疗服务的效率和质量。然而&#xff0c;这些设备在复杂的电磁环境中运行时&#xff0c;可能会受到各种电磁干扰&#xff08;EMI&#xff09;&#xff0c;同时也可能成为干扰源&#xff0c;影响其他设备的正常运行。因…

Go语言zero项目服务恢复与迁移文档

## 一. 服务器环境配置 在迁移和配置 项目时&#xff0c;首先需要确保服务器环境正确配置。以下是配置步骤&#xff1a; ### 1. 安装 Go 语言环境 首先&#xff0c;确保 Go 语言环境已经安装&#xff0c;并且配置正确。执行以下步骤&#xff1a; # 下载 Go 语言安装包 wge…

管理面板Ajenti的在Windows10下Ubuntu24.04/Ubuntu22.04里的配置管理

Ajenti是一款基于Web的开源系统管理控制面板&#xff0c;可用于通过Web浏览器&#xff0c;管理远程系统管理性任务&#xff0c;这一点与 Webmin模块 非常相似。 Ajenti是一款功能非常强大的轻型工具&#xff0c;它提供了快速的、反应灵敏的Web界面&#xff0c;可用于管理小型服…

【AI系统】LLVM 前端和优化层

LLVM 前端和优化层 在上一篇文章讲到了 LLVM 的 IR 贯穿了 LLVM 编译器的全生命周期&#xff0c;里面的每一个箭头都是一个 IR 的过程&#xff0c;这个就是整体 LLVM 最重要的核心概念。 有了 LVM IR 之后这并不意味着 LLVM 或者编译器的整个 Pipeline 都是使用一个单一的 IR…

SQL进阶技巧:如何计算加油站问题? | LeetCode 134. 加油站

目录 0 问题描述 1 数据准备 2 问题分析 计算每个加油站剩余油量(当前油量减去到下一个加油站消耗的油量)

Java爬虫技术:按关键字搜索VIP商品详情

在数字化时代&#xff0c;电子商务平台的竞争日益激烈&#xff0c;而精准的数据采集和分析成为了企业获取竞争优势的关键。对于电商平台而言&#xff0c;能够根据用户输入的关键字快速搜索并展示VIP商品的详细信息&#xff0c;不仅能够提升用户体验&#xff0c;还能够增加销售机…

使用 AI 辅助开发一个开源 IP 信息查询工具:一

本文将分享如何借助当下流行的 AI 工具,一步步完成一个开源项目的开发。 写在前面 在写代码时&#xff0c;总是会遇到一些有趣的机缘巧合。前几天&#xff0c;我在翻看自己之前的开源项目时&#xff0c;又看到了 DDNS 相关的讨论。虽然在 2021 年我写过两篇相对详细的教程&am…

Vue 3 中父子组件的交互与弹框控制:v-model 和事件传递的实践

目录 前言1. Demo2. 基本知识 前言 &#x1f91f; 找工作&#xff0c;来万码优才&#xff1a;&#x1f449; #小程序://万码优才/r6rqmzDaXpYkJZF 原先的父子组件传递已经说过很多知识&#xff0c;推荐阅读 详细分析Vue3中的props用法&#xff08;父传子&#xff09;详细分析V…