OpenLayers水平镜像和垂直镜像

news2024/12/31 5:08:09

目录

  • 1.前言
  • 2.概念介绍
    • 2.1 旋转
    • 2.2 水平镜像
    • 2.3 垂直镜像
  • 3.要素的镜像
    • 3.1 镜像轴始终是水平的或者垂直的
    • 3.2 镜像轴是任意角度
  • 4.图片的镜像
  • 5.总结

1.前言

  最近项目中用到了要素和图片的水平镜像和垂直镜像功能。这些功能说难不难,说简单也不简单,就是稍微费点劲,这里记录一下。

2.概念介绍

  有很多人把镜像和旋转混淆,但镜像的图形是不可能通过旋转得到的,我们这里来看一下二者的区别,直接上图。

2.1 旋转

在这里插入图片描述

2.2 水平镜像

在这里插入图片描述

2.3 垂直镜像

在这里插入图片描述

3.要素的镜像

3.1 镜像轴始终是水平的或者垂直的

  明白了原理之后,那么要素的镜像就方便多了。不论是水平镜像还是垂直镜像,首先图形的坐标我们是知道的,然后以某一个位置为锚去计算就行了。比如,如果是水平镜像,那么只要计算出来新的纬度值就可以了,经度值不变。相应的,如果是垂直镜像,那么只要计算出来新的经度值,纬度值不变。值得一提的是,如果我们以图形的中心为锚去计算,那么图形看起来就像在原始位置做了一个翻转一样。
  这种情况下的代码太简单了,所以我们直接略过代码,下面开始上一点难度,考虑一下旋转轴的角度。

3.2 镜像轴是任意角度

  什么叫镜像轴是任意角度?我们还是以图片来展示一下:
在这里插入图片描述
  想一想这种情况下的垂直镜像应该怎么实现?这种情况下就不能再向上面一样去计算了,因为要考虑角度。
  所以我们的做法是,首先将获取到这个镜像轴的角度,然后将图形逆时针旋转到0度,做垂直镜像,然后将镜像后的图形,再顺时针旋转这个角度,就可以了。水平镜像同理。
  当然了,要实现这种带角度的镜像,还可以通过矩阵运算,但是我觉得这种方式比较简单易懂,读者可以自行选择实现方式。
在这里插入图片描述

getMirror(feature){
    // 给定的角度(逆时针为正,顺时针为负,角度为度数而不是弧度)
    let angle = 30; // 示例角度
    // 将角度转换为弧度,因为OpenLayers的旋转函数需要弧度作为单位
    let angleInRadians = angle * Math.PI / 180;
    // 获取要素的几何对象
    let geometry = feature.getGeometry();
    // 获取要素的中心点
    let center = extent.getCenter(geometry.getExtent());
    // 步骤1: 逆时针旋转要素(传入正值)
    geometry.rotate(angleInRadians, center);
    // 水平镜像
    // geometry.scale(1, -1, center);
    //垂直镜像
    geometry.scale(-1, 1, center);
    // 步骤3: 顺时针旋转要素(传入负值)
    geometry.rotate(-angleInRadians, center);
    return feature
},

4.图片的镜像

  图片的镜像需要借助canvas来实现,我们来看下效果
在这里插入图片描述

let point = new Feature({
  geometry:new Point([116,39])
})
let image = new Image()
image.src = '300.jpg'
let obj={
  width:375,
  height:300,
  image:image,
  angle:0,
  horizontalMirroring:true,
  // verticalMirroring:true,
}
point.setStyle(this.getPicMirrorStyle(obj));
getPicMirrorStyle(obj){
  const canvas = document.createElement('canvas');
  canvas.width = obj.width;
  canvas.height = obj.height;
  const con = canvas.getContext('2d');
  //水平镜像
  if(obj.horizontalMirroring){
    con.translate(0,obj.height);
    con.scale(1,-1);
  }
  //垂直镜像
  if(obj.verticalMirroring){
    con.translate(obj.width,0);
    con.scale(-1,1);
  }
  // 图像存在延迟加载的问题,不能直接画
  obj.image.onload = () => {
    con.drawImage(obj.image, 0, 0, obj.width, obj.height);
  };
  return new Style({
    image:new Icon({
      img:canvas,
      // src:"300.jpg",
      crossOrigin:'anonymous',
      imgSize:[obj.width,obj.height],
      rotation:(obj.angle * Math.PI) / 180,
      scale:0.5
    })
  })
},

5.总结

  我们在本文中实现了要素和图片的垂直镜像和水平镜像。值得注意的是:
1.要素的旋转和图片的旋转都需要传入弧度值
2.要素的旋转,逆时针为正,顺时针为负
3.图片的旋转,顺时针为正,逆时针为负

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1463348.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【SQL注入】靶场SQLI DUMB SERIES-24通过二次注入重置用户密码

先使用已知信息admin/admin登录进去查下题,发现可以修改密码 猜测可能存在的SQL语句:UPDATE user SET password新密码 WHERE user用户名 and password旧密码 假设我们知道有个admin用户,但是不知道其密码,如何可以将其密码重置&…

[AIGC] 使用Curl进行网络请求的常见用法

使用Curl进行网络请求的常见用法 Curl是一个无比强大的工具,它可以用来获取和发送数据,支持众多的协议,包括HTTP、HTTPS、FTP、FTPS、SFTP和更多。它还支持HTTP POST,HTTP PUT,HTTPS证书,HTTP基础验证等。…

【2024软件测试面试必会技能】Postman(1): postman的介绍和安装

Postman的介绍 Postman 是一款谷歌开发的接口测试工具,使API的调试与测试更加便捷。 它提供功能强大的 Web API & HTTP 请求调试。它能够发送任何类型的HTTP 请求 (GET, HEAD, POST, PUT..),附带任何数量的参数 headers。 postman是一款支持http协议的接口调试…

流动人员人事档案主要有哪些作用

流动人员人事档案是指记录企事业单位与个人之间的雇佣关系的文件。在企事业单位中,流动人员是指临时聘用的员工、实习生、临时工等,他们的雇佣关系相对不稳定,因此需要建立相应的人事档案来管理和记录他们的基本信息、工作经历、劳动合同等重…

unity学习(34)——角色选取界面(跨场景坑多)

先把SelectMenu中的camera的audio listener去掉。 现在还是平面,直接在camera下面添加两个panel即可,应该是用不到canvas了,都是2D的UI。 加完以后问题来了,角色选择界面的按钮跑到主界面上边了,而且现在账号密码都输…

机器人内部传感器阅读笔记及心得-位置传感器-电位器式位置传感器

位置传感器 位置感觉是机器人最基本的感觉要求,可以通过多种传感器来实现。位置传感器包括位置和角度检测传感器。常用的机器人位置传感器有电位器式、光电式、电感式、电容式、霍尔元件式、磁栅式及机械式位置传感器等。机器人各关节和连杆的运动定位精度要求、重…

C语言自定义类型:结构体的使用及其内存对齐【超详细建议点赞收藏】

目录 1. 结构体类型的声明1.1 结构的声明1.2 结构体变量的创建和初始化1.3 结构的特殊声明---匿名结构体1.4 结构的自引用 2.结构体内存对齐(重点!!)2.1 对齐规则2.2 例题讲解2.3 为什么存在内存对齐?2.4 修改默认对齐…

vue3前端excel导出;组件表格,自定义表格导出;Vue3 + xlsx + xlsx-style

当画面有自定义的表格或者样式过于复杂的表格时,导出功能可以由前端实现 1. 使用的插件 : sheet.js-xlsx 文档地址:https://docs.sheetjs.com/ 中文地址:https://geekdaxue.co/read/SheetJS-docs-zh/README.md xlsx-style&#…

⭐北邮复试刷题LCR 052. 递增顺序搜索树__DFS (力扣119经典题变种挑战)

LCR 052. 递增顺序搜索树 给你一棵二叉搜索树,请 按中序遍历 将其重新排列为一棵递增顺序搜索树,使树中最左边的节点成为树的根节点,并且每个节点没有左子节点,只有一个右子节点。 示例 1: 输入:root [5,…

跨境电商消息多发脚本制作需要用到的代码!

在跨境电商的运营中,为了更有效地推广产品、提升品牌知名度并增强与消费者的互动,消息群发成为了一个重要的营销手段。 为了实现这一目的,许多跨境电商团队会选择制作消息多发脚本,通过自动化发送消息来提高效率和覆盖面&#xf…

算法沉淀——穷举、暴搜、深搜、回溯、剪枝综合练习三(leetcode真题剖析)

算法沉淀——穷举、暴搜、深搜、回溯、剪枝综合练习三 01.字母大小写全排列02.优美的排列03.N 皇后04.有效的数独 01.字母大小写全排列 题目链接:https://leetcode.cn/problems/letter-case-permutation/ 给定一个字符串 s ,通过将字符串 s 中的每个字…

获取discord上自己创建的服务器的服务器ID、频道ID以及discord的登录token(用于第三方登录)

在服务器图标上右键点击-》复制服务器ID 在频道上右键点击-》复制频道ID F12->手机模式-》application-》local storage-》填写过滤条件【token】 我开发的chatgpt网站: https://chat.xutongbao.top

铌酸锂芯片与精密划片机:科技突破引领半导体制造新潮流

在当今快速发展的半导体行业中,一种结合了铌酸锂芯片与精密划片机的创新技术正在崭露头角。这种技术不仅引领着半导体制造领域的进步,更为其他产业带来了前所未有的变革。 铌酸锂芯片是一种新型的微电子芯片,它使用铌酸锂作为基底材料&#x…

dp入门(模板题)

解法一&#xff1a; 双指针&#xff0c;没必要开数组直接边输边算&#xff0c;max至少要2个数&#xff0c;补一个数时的特判 #include <iostream> #include <vector> #include <algorithm> using namespace std; #define endl \nint main() {ios::sync_wit…

ChatGPT调教指南 | 咒语指南 | Prompts提示词教程(二)

在我们开始探索人工智能的世界时&#xff0c;了解如何与之有效沉浸交流是至关重要的。想象一下&#xff0c;你手中有一把钥匙&#xff0c;可以解锁与OpenAI的GPT模型沟通的无限可能。这把钥匙就是——正确的提示词&#xff08;prompts&#xff09;。无论你是AI领域的新手&#…

SaaS智慧校园管理平台全套源码,支持二次开发,项目使用

什么是电子班牌系统&#xff1f; 电子班牌用来显示班级信息&#xff0c;班级活动信息以及学校的通知信息。信息内容为文字、图片、视频、FLASH等&#xff0c;为学生和老师提供新颖的师生交流及校园服务平台。融合了多媒体信息发布、家校互通、物联控制、教务管理、日常办公等一…

求人脸底库匹配用时统计记录

1、 注意事项 1、预热 2、torch 异步 import torch import time torch.cuda.synchronize()device torch.device(cuda:2) data_type torch.float32t1 time.time() a torch.rand((40000000,512),dtypedata_type,devicedevice) b torch.rand((512,1),dtypedata_type,device…

Linux:Jenkins用户权限和管理

1.下载插件 由于Jenkins的默认权限管理并不是很精细所以我们安装一个插件进行权限的一个管理 插件名称为&#xff1a;Role-based Authorization Strategy 安装完插件我们再去配置一下 进入全局安全配置 选择这个Role-Based Strategy策略然后保存 2.创建角色 我们这里主要使…

Stable Diffusion 模型分享:Dark Sushi Mix 大颗寿司Mix

本文收录于《AI绘画从入门到精通》专栏,专栏总目录:点这里。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八案例九案例十

学习鸿蒙基础(4)

1.条件渲染 ArkTS提供了渲染控制的能力。条件渲染可根据应用的不同状态&#xff0c;使用if、else和else if渲染对应状态下的UI内容。 当if、else if后跟随的状态判断中使用的状态变量值变化时&#xff0c;条件渲染语句会进行更新。。 Entry Component struct PageIfElse {Stat…