首页 > 编程语言 >C# Graphics 中如何快速反转Y轴坐标系,方便后续绘图

C# Graphics 中如何快速反转Y轴坐标系,方便后续绘图

时间:2024-12-18 09:55:11浏览次数:5  
标签:原点 C# Height Windows 绘图 Graphics ClientSize 坐标系

这段时间搞东西发现 C# Windows库里 没有了以前 C++ 中 修改坐标系 的一些 API,比如  SetViewportExtEx, SetWindowExtEx 这些东西。

众所周知,在 Windows 系统中,坐标系的原点是从左上角开始为(0,0)的,Y轴越下值越大。这与现实生活中场景,低的Y才是0,向上Y值会越来越大,正好相反。

 

如果顺从于Windows这样的坐标系,那么,我们在向Windows上画很多“现实”坐标内容时,不得不逐个修改”现实“坐标Y去”重计算“。这样会造成代码很难看,太耦合,或者有可能降低了绘制效率。

所以,在使用 Graphics 前这样两步设置后,就会很省事了。

代码如下:

private void testFlipY(Graphics g)
{
	g.ScaleTransform(1, -1);
	g.TranslateTransform(0, -this.ClientSize.Height+1);

	g.DrawLine(Pens.Black, 0, 0, 300, 200);

	//g.ResetTransform();
}

private void Form1_Paint(object sender, PaintEventArgs e)
{
	testFlipY(e.Graphics);
}

ScaleTransform(1,-1),让Y轴坐标值相反。如果没有下面那一句 TranslateTransform(0, -this.ClientSize.Height+1),同样 DrawLine 时,Y轴就会从屏幕左上角往上画到窗口外去了,所以就看不到线。

TranslateTransform(0, -this.ClientSize.Height+1),重新定位后续的原点坐标,因为前面ScaleTransform(1,-1)后,左上角为(0,0)开始,Y轴向下为负值,向上为正值,现实生活中,我们通常认为从左下角开始为原点,因此没有调用这句前,左下角的Y值是窗口客户端的负高度值【-this.ClientSize.Height+1】,这句调用后,左下角的坐标就是新的原点(0,0)。此时,再调画线函数,Y值200就是向上方向,就可以画在窗口中了。

 

 至于为啥要 -this.ClientSize.Height+1,因为这里是坐标值,系统是从0值开始的,若窗口高度有100时,最高的地方值应是99,反之。

标签:原点,C#,Height,Windows,绘图,Graphics,ClientSize,坐标系
From: https://www.cnblogs.com/pencilstart/p/18613985

相关文章

  • RocketMQ系列3:核心技术介绍
    1介绍RocketMQ是一款分布式消息中间件,其核心技术涉及多个核心概念,包括主题、队列、消息、生产者、消费者、消费者分组以及订阅关系。以下是对这些核心技术的详细说明:2核心技术实现2.1主题(Topic)1.定义:主题是RocketMQ中消息传输和存储的顶层容器,用于标识同一类型业务逻辑的......
  • AT_agc032_d [AGC032D] Rotation Sort 题解
    考虑确定哪些点不动,这些点一定构成一个单调递增子序列,那么对于剩下的点:若在它之前存在一个不动点大于它,则需要花费\(b\)的代价向前移动。若在它之后存在一个不动点小于它,则需要花费\(a\)的代价向后移动。如果两个都不存在,则它一定可以加入不动点序列。考虑dp,记\(f_{i,......
  • ChatGPT生成测试用例的最佳实践(三)
        还记得在第1章,我们利用ChatGPT生成的业务用例吗?这种业务用例生成方式其实和场景法用例设计十分相似,我们是不是也可以直接将业务用例输入ChatGPT,让它输出测试用例呢?笔者输入相关提示词让其补充以需求规格说明书中的业务用例为依据的测试用例,ChatGPT输出如图3-5所示。......
  • harmony_flutter_videoCompress(视频压缩)
    harmony_flutter_videoCompress(视频压缩)一.MethodChannel1.flutter端代码创建MethodChannel交互通道video_compress接收ohos端传递过来的进度finalcompressProgress$=ObservableBuilder<double>();final_channel=constMethodChannel('video_compress');@......
  • Flutter OHOS flutter_console
    flutter_consoleAFlutterConsoleUI项目介绍一个在Flutter端Console可视化的组件,将ConsoleWindow置于页面最顶层,用于调试,输出日志等。安装使用安装步骤简单Demoimport'package:flutter/material.dart';import'dart:async';import'package:flutter_console/flutter_......
  • AtomicServiceWeb 使用方法
    AtomicServiceWeb使用方法全解析一、整体概述AtomicServiceWeb是对Web组件的升级,用于在特定场景下实现更高效和功能丰富的网页交互。它在一些接口和属性的使用上与Web组件有所不同,需要开发者按照新的规范进行操作。二、参数传递通过src传递参数适用场景:例如在登......
  • 【MATLAB源码-第248期】基于matlab的EMD算法+ICA算法轴承故障分析。
    操作环境:MATLAB2022a1、算法描述经验模态分解(EMD)与轴承故障识别EMD的基本原理EMD是一种自适应的信号分解技术,最初由Huang等人在1998年提出,旨在分析非线性和非平稳信号。传统的信号处理方法通常假设信号是线性和稳态的,但在实际工程应用中,许多信号,包括轴承振动信号,都......
  • flutter_ohos_sequence
    性能分析第一步-梳理线程顺序Flutter应用在性能分析的时候,需要使用分析工具去抓取应用的trace,并对trace进行分析。Flutter应用在渲染流程上与几个线程密不可分,而这篇指南里,主要介绍这几个密不可分的线程,以及它们在渲染流程上顺序。分析工具常用的分析工具有DevEcoStudioProfi......
  • Flutter OHOS fluttertpc_screenshot_callback
    screenshot_callback监听系统截图注意事项Android需要获取存储权限才能正常使用需要真机才能验证截图Flutter中使用注意如果在flutter中重写didChangeAppLifecycleState,其中在三星手机上,侧面截图功能会执行resumed生命周期。caseAppLifecycleState.resumed://应用程......
  • Flutter OHOS fluttertpc_device_util
    fluttertpc_device_util鸿蒙设备工具类Flutter代码调用创建通道staticconstMethodChannel_channel=constMethodChannel('device_util');获取versionname///TheversionnameofthisapplicationstaticFuture<StringgetversionNameasync{finalString......