当前位置: 首页 > article >正文

使用c#制作坐标

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();

            // 初始化 PictureBox
            pictureBox = 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));

            // 重新绘制 PictureBox
            pictureBox1.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 开始,每条刻度线增加 1
            int 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 开始,每条刻度线增加 1
            int 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.kler.cn/a/455491.html

相关文章:

  • 0039__屏幕帧缓冲机制
  • 大语言模型(LLM)中大数据的压缩存储及其重要性
  • 光谱相机与普通相机的区别
  • OpenCV相机标定与3D重建(37)计算两幅图像之间单应性矩阵(Homography Matrix)的函数findHomography()的使用
  • 使用Excel制作通达信自定义外部数据,安排!!!
  • OpenFOAM2.3.x 圆柱体网格 blockMeshDict
  • MySql索引(基础篇)
  • 【UE5 C++课程系列笔记】12——Gameplay标签的基本使用
  • 聊聊强化学习在无人机中的前沿应用
  • act小试牛刀
  • CCF-GESP 等级考试 2023年9月认证C++五级真题解析
  • vue+elementUI 表单项赋值后无法修改的问题
  • php怎么去除数点后面的0
  • 第十九章 C++ 日期 时间
  • 前端学习DAY26(华为平板页面)
  • “智能控制的新纪元:2025年机器学习与控制工程国际会议引领变革
  • 嵌入式学习-QT-Day01
  • FFMPEG解码+SDL2播放视频
  • Oracle 11G还有新BUG?ORACLE 表空间迷案!
  • Debian安装配置RocketMQ
  • 组件库TDesign的表格<t-table>的使用,行列合并以及嵌入插槽实现图标展示,附踩坑
  • UGUI源码分析 --- UI的更新入口
  • “游戏信息化”:游戏后台系统的未来发展
  • Windows 11 系统下,通过 WSL(Windows Subsystem for Linux)里的 Ubuntu 24.04 安装 CUDNN 记录
  • 【C++决策和状态管理】从状态模式,有限状态机,行为树到决策树(一):从电梯出发的状态模式State Pattern
  • 面试题整理13----deployment和statefulset区别