使用c#制作坐标

ops/2024/12/28 12:47:22/

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/ops/145656.html

相关文章

Cornerstone3d 基础概念

基础Cornerstone流程&#xff1a; 获取ImageId。通过Image Loader使用ImageId得到Image Object。通过Rendering Engine使用Image Object渲染到视口Viewports。 ImageId 简介&#xff1a;ImageId是一个URL&#xff0c;用于标识单张图片。 ImageId格式&#xff1a; Image Load…

Android Https和WebView

系统会提示说不安全&#xff0c;因为网站通过js就能调用你的android代码&#xff0c;如果你确认你的网站没用到JS的话就不要打开这个开关&#xff0c;如果用到了&#xff0c;就添加一个注解忽略它就行了。 后来就使用我们公司的网站了&#xff0c;发现也出不来&#xff0c;后来…

云计算时代携程的网络架构变迁

大家觉得有意义和帮助记得及时关注和点赞!!! 前言0 携程云平台简介 网络演进时间线1 基于 VLAN 的二层网络 1.1 需求1.2 解决方案&#xff1a;OpenStack Provider Network 模型1.3 硬件网络拓扑1.4 宿主机内部网络拓扑1.5 小结 优点缺点2 基于 SDN 的大二层网络 2.1 面临的新问…

Python爬虫获取1688详情接口详细解析

概述 1688作为阿里巴巴集团旗下的批发交易平台&#xff0c;提供了丰富的API接口供开发者获取商品详情信息。本文将详细介绍如何使用Python爬虫技术结合1688的API接口来获取商品详情数据。 1688 API接口简介 1688提供的商品详情API接口允许开发者获取商品的详细信息&#xff…

Rocky DEM tutorial7_Conical Dryer_锥形干燥器

tutorial 7_Conical Dryer_锥形干燥器 文章目录 tutorial 7_Conical Dryer_锥形干燥器0. 目的1. 模型介绍2. 模型设置2.1设置physics2.2 导入几何2.3 设置motion2.4 Boundary边界设置2.5 设置材料2.6设置材料间相互作用2.7 创建粒子2.8 设置颗粒进口2.9 求解器设置3. 后处理Enj…

Flink 的并行度配置低于Kafka 分区数会出现的问题

在 Flink 中使用 Kafka 数据源时&#xff0c;设置的 Kafka 分区数 和 Flink 的并行度 会直接影响数据的处理方式。如果你的 Kafka 分区数大于 Flink 的并行度&#xff0c;可能会引发以下问题&#xff1a; 1. Kafka 分区与 Flink 任务不匹配 Flink 在读取 Kafka 数据时&#xf…

web服务器之云主机、物理机租用、服务器托管的区别

云主机、物理机租用和服务器托管是三种不同的Web服务器部署方式&#xff0c;它们各有特点&#xff0c;适用于不同需求的用户。以下是这三种服务的区别&#xff1a; 云主机&#xff08;Cloud Hosting&#xff09;&#xff1a; 资源分配&#xff1a;基于虚拟化技术&#xff0c;多…

面试场景题系列:设计指标监控和告警系统

在本文中&#xff0c;我们将探讨可扩展的指标监控和告警系统的设计。理解基础设施的状况对维持其可用性和可靠性至关重要。 图-1展示了一些市面上最流行的商用和开源的指标监控和告警服务。 图-1 1.场景边界界定 为了便于展开设计以及考虑通用性&#xff0c;监控和告警需求如…