图形系统开发实战课程:进阶篇(上)——2.图形管理类(Graph)

news2024/11/15 13:02:41


[

图形开发学院|GraphAnyWhere

  • 课程名称:图形系统开发实战课程:进阶篇(上)
  • 课程章节:“图形管理类(Graph)”
  • 原文地址:https://graphanywhere.com/graph/advanced/2-2.html

第二章:图形管理类(Graph)

\quad 本章以 anyGraph 中图形管理类的设计为例讲述图形管理类的作用。

1 Graph类概述

\quad 图形管理类是 anyGraph 图形开发引擎核心组件之一,是一个创建和管理图形的容器类。提供了以下几部分功能:

  • 图层管理
  • 图形渲染
  • 图形操作
  • 图形对象管理
  • 控件和事件管理

2 Graph类的设计

(1) 类的关系

\quad 图形管理相关的类包括:Graph类、Layer类、View类、GraphRenderer类,其中Graph类是这几个类的核心,负责构建另外几个类,并提供外部访问api接口;GraphRenderer类是负责图形的渲染、Layer类负责图层属性、图层数据和图层的渲染、View类负责图形的视点控制。这几个类的关系如下:

Graph
name:String
layers:Array
addLayer(layer)
removeLayer(layer)
render()
setView(view)
getCoordinateFromPixel(pixel)
getPixelFromCoordinate(coordinate)
GraphRenderer
mainCanvas:Canvas
getSize()
prepareFrame()
composeBuffer(frameState)
renderFrame()
filter()
View
center: [float,float]
resolutions:float
zoom: int
fill()
calculateCenterZoom()
getState()
Layer
source: Source
renderer: LayerRenderer
setStyle(style)
getVisible()
visibleAtResolution()
setOffset(x, y)

(2) 图层管理

\quad 在图形系统中,图层(Layers)是一种用于组织和管理图像内容的办法。图层可以将不同的图像元素分开,使得它们可以独立地进行绘制、编辑和操作。每个图层都可以包含一个或多个图像对象,这些对象可以是几何对象、文本、图像等。图层可以互相叠加,并且可以通过控制透明度、颜色和大小等属性来创建各种视觉效果。

\quad 你可以在同一个画板上绘制所有你需要的内容,也可以有选择性地将不同类别的元素分散于不同的画板上;例如在下图的场景中,将静态的地理背景与动态的人或动物分离,以及将地理背景中的草地、湖泊、树木置于不同的图层中,便能够在需要时实现精准修改与控制。

在这里插入图片描述

\quad 通过对图层的分层管理,继而控制图层的可见性,在绘图时快速隐藏暂时用不到的图层,在画布上仅显示需要的图层,更有利于排除绘图过程中的重叠元素与干扰项,让制图工作更简单和便捷。

(3) 图形渲染思路

\quad anyGraph 中图形渲染的核心思路是各个图层分别对应独立的Canvas画布,在画布中渲染各自图层中的数据,最后按图层顺序将各图层合并为完整的图形。

在这里插入图片描述

\quad 在各图层渲染后,将其合并到图形的时候可采用 ctx.drawImage()ctx.putImageData() 两种方式。第一种方式渲染效率会更高,第二种方式可对像素进行处理,实现更为灵活的渲染效果。

1. ctx.drawImage()
2. ctx.putImageData()

(4) 图形渲染过程

\quad anyGraph 的图形渲染过程如下:

API:异步刷新
渲染主程序
API:立即刷新
API:重绘图形
API:重绘图层
事件:RenderBefore
计算矩阵
合成图形
渲染图形
事件:RenderAfter
逐个图层合成

\quad 上图可以清晰看出图形渲染过程中,最重要的是三个步骤:

  1. 计算矩阵:在该过程中根据图形的视点范围和当前显示的viewPort计算矩阵变换参数,为图形合成时的坐标转换做好准备。

  2. 合成图形:逐个图层的将图层中的几何对象渲染至图层Canvas中。

  3. 渲染图形:将各个图层Canvas合并至图形的Canvas中,并呈现出来。

Graph 类提供了四个发起图形渲染的API,分别为立即刷新、异步刷新、刷新图层。

立即刷新

\quad 顾名思义,立即刷新就是通知主线程立即开始图形渲染,立即刷新主要应用在当前视点范围内的数据发生变化后执行。

异步刷新

\quad 异步刷新是利用HTML中Window对象的RequestAnimalFrame特性,在窗口下一次刷新的时候执行图形渲染。异步刷新应用场景非常广泛,在图形窗口属性发生了改变后,在图层属性发生了变换后,在图形对象属性发生了变换后,都可以调用该方法,通知浏览器在下一次刷新的时候重新渲染图形,这么做的好处是,不论调用了多少次异步刷新命令,浏览器仅会在下一次窗口刷新时调用一次图形渲染命令。

重绘图层

\quad 重绘图层指仅仅重新绘制某一层,其他层仍使用上一次渲染后留下的缓存图像,从而在大数据量的场景中提高图像渲染效率,例如在图形的浮动层绘制橡皮线或拉框的场景中,仅仅只是重新绘制橡皮线或拉框,而不用重新绘制图形内容本身,从而提供了渲染效率。

重绘图形

\quad 重绘图形是指根据新的参数重新绘制整个图形,发出这个命令后,anyGraph 将会重新获取各个图层中指定视点的数据,重新计算矩阵,重新进行坐标转换,重新将这些数据绘制至各个图层中,最后由GraphRenderer将图形合成为图形并显示出来。

(5) 图形事件

\quad 图形事件分为两种情况,一种情况是指图形在渲染过程中触发的事件,既有图形相关事件,也有图形相关事件, anyGraph 1.0触发的事件类型包括以下事件:

  • EventType.RenderBefore: 图形渲染之前
  • EventType.RenderAfter: 图形渲染之后
  • EventType.ComposeBefore: 图层渲染之前
  • EventType.ComposeAfter: 图层渲染之后
  • EventType.LayerModified: 图层属性发生变化之后
  • EventType.Loader: 图层数据装载之后

\quad 另一种事件类型是指对Canvas操作的键盘、鼠标、触摸、系统等类型事件,目前可支持的事件包括:

  • wheel
  • click
  • dblclick
  • mouseUp
  • mouseDown
  • mouseMove
  • mouseout
  • mouseenter
  • mouseover
  • keydown
  • touchstart
  • touchmove
  • touchend

3 Graph类的使用

类名为:Graph,位于src根目录。

\quad Graph类是 anyGraph 最核心的类,是图形处理的唯一入口,所有的图形渲染均通过该类产生。

(1) 初始化

constructor(options)

\quad 该类的构造函数接受一个 Object 类型的参数,其值包括:

名称类型说明
targetStringHTML页面容器ID
layersArray图层集合
mouseBoolean是否允许鼠标交互操作,缺省值为true
defaultFullViewBoolean初始化后是否显示全图,缺省值为false
enabledGeomEventBoolean是否允许对象事件,缺省值为false
originAtLeftTopBoolean图形坐标系是否为卡迪尔坐标系,缺省值为true
viewView图形显示选项
bgColorColorString背景颜色

说明:

  • target: 该参数为必填值,指的是 HTML页面中的容器对象, anyGraph 将在此容器对象中创建Canvas对象和其他辅助对象。在初始化前需先建立该容器对象,并指定容器宽和高属性;
  • layers: 图层列表,该属性为可选,在初始化之后可通过 addLayer() 增加图层;
  • mouse: 缺省值为true,图形对象构建后将具有通过鼠标进行缩放和漫游的功能;
  • defaultFullView: 缺省值为false,图形数据加载之后优先根据 view 属性显示图形指定位置,如果没有指定view 属性,则判断该属性的值,如果该属性的值为 true则显示全图,否则显示Canvas画布坐标内的图形;
  • originAtLeftTop:缺省值为true,图形坐标系是否为卡迪尔坐标系;
  • view: 图形显示选项, 图形数据加载之后优先根据该属性显示指定的位置;
  • bgColor:图形背景颜色,默认为透明色;
  • enabledGeomEvent:是否允许对象事件,缺省值为false;当该值为true时,图形中的每个 Geometry 对象均可提供各类鼠标事件,当数据量较大时可能会影响系统性能,因此建议在大数据量的情况下将该值设置为false;
HTML

\quad 在初始化时需在HTML中建立一个<div>容器,并指定该容器的大小,HTML如下所示:

<body style="overflow: hidden; margin:0px;">
    <div id="graphWrapper" style="width:1200px; height:800px;"></div>
</body>
创建图形实例

\quad HTML中的<script>中通过以下js程序初始化图形对象,如下所示:

let graph = new Graph({
    "target": "graphWrapper",
});

\quad 创建图形实例后 anyGraph 将会在上述HTML页面的graphWrapper容器内生成Canvas对象,该对象用于显示图形结果,如下图所示:

在这里插入图片描述

\quad 该容器中不仅仅包含生成的Canvas对象,还会包含一系列控件,这个可将根据需要通过graph提供的API添加和移除。

\quad 下面这段代码在初始化图形时,建立一个图层,并设置了图层的属性和数据文字的Url,还指定显示图形的视点范围。

let graph = new Graph({
    "target": "graphWrapper",
    "layers": [
        new Layer({
            source: new VectorSource({ 
                "fileUrl": "../data/mydata.json", 
            }),
            name: "数据层",
            visible: true,
            style: { "color": "#515151", "fillColor": "#CCCCCC", "fillStyle":1 }
        })
    ],
     "view": new View({
        center: [1268.46, 2576.57],
        resolutions: [11.20, 5.60, 2.80, 1.40, 0.70, 0.35, 0.175, 0.0875],
        zoom: 5
    }),
});

该代码执行后的效果如下图所示:

在这里插入图片描述

(2) 图层管理

\quad 在Graph类中提供了以下几个与图层管理相关的API:

名称说明
addLayer(layer)增加图层
removeLayer(layer)移除图层
removeLayers()移除所有图层
getLayer(id)获取指定图层
getLayers()获取所有图层
queryGeomList(coord)查询图形中“包含”该坐标位置的点
removeGeom(geom)移除某个图层中的Geometry对象
新建图层

新建图层可采用下面两种方式:

  • 方式一:
let layer = graph.addLayer({"name":"背景层"});
  • 方式二:
let layer = new Layer({"name":"背景层"});
graph.addLayer(layer);
获取图层
  • 获取指定图层
let layer = graph.getLayer(layerId)
  • 获取所有图层
let layerArray = graph.getLayers()
删除图层
  • 删除指定图层
graph.removeLayer(layer);
  • 删除所有图层
graph.removeLayers();

(3) 图形渲染

Graph类中通过GraphRenderer调用Canvas类的API进行图形绘制。

Graph类提供了以下几个与图形渲染相关的API:

名称说明
render()异步图形渲染
renderSync()同步图形渲染
renderLayer(layer)重绘指定图层
showExtent(extent)设置图形的视点范围,并重绘图形
setView(view)设置中心点和密度,并重绘图形
图形刷新

\quad 图形刷新是指不改变图形显示的范围而重新渲染图形, anyGraph 提供了三种方式刷新图形:

  • 同步刷新当前图形

\quad 例如在绘制图形后,继续执行某些代码时可使用该方式。

graph.renderSync()
  • 异步刷新当前图形

\quad 该方法通过 requestAnimationFrame() 调用刚刚介绍的renderSync()方法绘制图形,因此仅会在下次屏幕刷新时绘制图形。使用该方法不用担心多次调用 render() 会造成重复绘制图形的问题。

graph.render()
  • 立即刷新指定图层。

\quad 该方法仅会刷新指定图层,如果存在其他图层,则其他图层会使用上一次绘制的结果。适合于当数据量非常大的时候,可以减少其他图层的绘制时间,从而提高图形的渲染效率。

graph.renderLayer(layer)
显示图形指定位置

\quad anyGraph 还提供了两个根据指定位置显示图形的api。

  • 按范围显示图形
graph.showExtent(extent)
  • 按中心点和分辨率进行图形显示
let view = graph.getView();
view.setCenter([10000, 6000]);
view.setZoom(3);
graph.setView(view);

(4) 图形信息

名称说明
getFrameState()获取图形信息
getExtent()获取当前图形显示范围
getSize()获取图形的宽度和高度
getRenderObject()渲染画板对象
setBgColor(color)设置图形的背景颜色
getBgColor()获取背景颜色
getRenderer()获取渲染器
getView()返回当前视图

(5) 坐标转换

名称说明
getCoordinateFromPixel(pixel)像素坐标转图形坐标
getPixelFromCoordinate(coordinate)图形坐标转像素坐标

使用这两个方法可以将屏幕坐标转换为图形坐标,或者将图形坐标转换为屏幕坐标,示例如下:

// 将屏幕坐标转换为图形坐标
graph.getCoordinateFromPixel([100,50]);
// 将图形坐标转换为屏幕坐标
graph.getPixelFromCoordinate([18806.23, 335358.47]);

需注意的是这里的图形坐标指的是当前打开图形的坐标。


\quad “图形系统实战开发-进阶篇 第二章 图形管理类” 的内容讲解到这里就结束了,如果觉得对你有帮助有收获,可以关注我们的官方账号,持续关注更多精彩内容。

相关资料

▶ 系列教程及代码资料:https://GraphAnyWhere.com
▶ 图形系统开发实战课程:进阶篇(上)——前言
▶ 图形系统开发实战课程:进阶篇(上)——1.基础知识


作者信息

作者 : 图形开发学院
CSDN: https://blog.csdn.net/2301_81340430?type=blog
官网:https://graphanywhere.com

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

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

相关文章

蓝桥杯训练-Huffman树(哈夫曼树)(day14)

一、题目 Huffman树在编码中有着广泛的应用&#xff0c;在这里&#xff0c;只关心Huffman树的构造过程。 给出一列数{pi}{p0,p1,...pn-1},用这列数构造Huffman树的过程如下&#xff1a; 1.找出{pi}中最小的两个数&#xff0c;设为pa和pb,将pa和pb从{pi}中删除&#xff0c;然…

【错误收录】ohpm ERROR: Install failed FetchPackageInfo: @ohos/hypium failed

创建APP的时候出现这样一个错误&#xff0c;是代理没有配置的原因 ohpm.bat install --registry https://repo.harmonyos.com/ohpm/ ohpm WARN: ETIMEDOUT Failed to search for package "ohos/hypium" from "https://repo.harmonyos.com/ohpm/", request…

Elasticsearch: 非结构化的数据搜索

很多大数据组件在快速原型时期都是Java实现&#xff0c;后来因为GC不可控、内存或者向量化等等各种各样的问题换到了C&#xff0c;比如zookeeper->nuraft(https://www.yuque.com/treblez/qksu6c/hu1fuu71hgwanq8o?singleDoc# 《olap/clickhouse keeper 一致性协调服务》)&a…

【Linux】线程池线程安全的单例模式和STL读者写者问题

需要云服务器等云产品来学习Linux的同学可以移步/–>腾讯云<–/官网&#xff0c;轻量型云服务器低至112元/年&#xff0c;优惠多多。&#xff08;联系我有折扣哦&#xff09; 文章目录 1. 线程池1.1 线程池是什么1.2 为什么要有线程池1.3 线程池的应用场景1.4 线程池的任…

异步编程(JS)

前言 想要学习Promise&#xff0c;我们首先要了解异步编程、回调函数、回调地狱三方面知识&#xff1a; 异步编程 异步编程技术使你的程序可以在执行一个可能长期运行的任务的同时继续对其他事件做出反应而不必等待任务完成。 与此同时&#xff0c;你的程序也将在任务完成后显示…

SpringBoot:日志框架

使用日志框架demo&#xff1a;点击查看LearnSpringBoot04logging 点击查看更多的SpringBoot教程 一、springboot日志框架简介 SpringBoot&#xff1a;底层是Spring框架&#xff0c;Spring框架默认是用ICL&#xff1b; SpringBoot选用SLF4j和logback&#xff1b; 统一使用slf4…

Modern C++ 内存篇1 - std::allocator VS pmr

大年三十所写&#xff0c;看到就点个赞吧&#xff01;祝读者们龙年大吉&#xff01;当然有问题欢迎评论指正。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1. 前言 从今天起我们开始内存相关的话题&#xff0c;内存是个很大的话题&#xff0c;一时不…

Mac 版 Excel 和 Windows 版 Excel的区别

Excel是一款由微软公司开发的电子表格程序&#xff0c;广泛应用于数据处理、分析和可视化等领域。它提供了丰富的功能和工具&#xff0c;包括公式、函数、图表和数据透视表等&#xff0c;帮助用户高效地处理和管理大量数据。同时&#xff0c;Excel还支持与其他Office应用程序的…

传输层协议 ——— TCP协议

TCP协议 TCP协议谈谈可靠性为什么网络中会存在不可靠&#xff1f;TCP协议格式TCP如何将报头与有效载荷进行分离&#xff1f;序号与确认序号 确认应答机制&#xff08;ACK&#xff09;超时重传机制连接管理机制三次握手四次挥手 流量控制滑动窗口拥塞控制延迟应答捎带应答面向字…

架构整洁之道-软件架构-测试边界、整洁的嵌入式架构、实现细节

6 软件架构 6.14 测试边界 和程序代码一样&#xff0c;测试代码也是系统的一部分。甚至&#xff0c;测试代码有时在系统架构中的地位还要比其他部分更独特一些。 测试也是一种系统组件。 从架构的角度来讲&#xff0c;所有的测试都是一样的。不论它们是小型的TDD测试&#xff…

【Java】eclipse连接MySQL数据库使用笔记(自用)

注意事项 相关教程&#xff1a;java连接MySQL数据库_哔哩哔哩_bilibilijava连接MySQL数据库, 视频播放量 104662、弹幕量 115、点赞数 1259、投硬币枚数 515、收藏人数 2012、转发人数 886, 视频作者 景苒酱, 作者简介 有时任由其飞翔&#xff0c;有时禁锢其翅膀。粉丝群1&…

IoC原理

Spring框架的IOC是基于Java反射机制实现的&#xff0c;那具体怎么实现的&#xff0c;下面研究一下 反射 Java反射机制是在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够知道这个类的所有属性和方法&#xff1b;对于任意一个对象&#xff0c;都能够调用它的任意方法…

【doghead】uv_loop_t的创建及线程执行

worker测试程序,类似mediasoup对uv的使用,是one loop per thread 。创建一个UVLoop 就可以创建一个uv_loop_t Transport 创建一个: 试验配置创建一个: UvLoop 封装了libuv的uv_loop_t ,作为共享指针提供 对uv_loop_t 创建并初始化

Kafka 下载与启动

目录 一. 前言 二. 版本下载 2.1. 版本说明 三. 快速启动 3.1. 下载解压 3.2. 启动服务 3.3. 创建一个主题&#xff08;Topic&#xff09; 3.4. 发送消息 3.5. 消费消息 3.6. 使用 Kafka Connect 来导入/导出数据 3.7. 使用 Kafka Stream 来处理数据 3.8. 停止 Kaf…

Python中HTTP隧道的基本原理与实现

HTTP隧道是一种允许客户端和服务器之间通过中间代理进行通信的技术。这种隧道技术允许代理服务器转发客户端和服务器之间的所有HTTP请求和响应&#xff0c;而不需要对请求或响应内容进行任何处理或解析。Python提供了强大的网络编程能力&#xff0c;可以使用标准库中的socket和…

疑似针对安全研究人员的窃密与勒索

前言 笔者在某国外开源样本沙箱平台闲逛的时候&#xff0c;发现了一个有趣的样本&#xff0c;该样本伪装成安全研究人员经常使用的某个渗透测试工具的破解版压缩包&#xff0c;对安全研究人员进行窃密与勒索双重攻击&#xff0c;这种双重攻击的方式也是勒索病毒黑客组织常用的…

攻防世界 CTF Web方向 引导模式-难度1 —— 1-10题 wp精讲

目录 view_source robots backup cookie disabled_button get_post weak_auth simple_php Training-WWW-Robots view_source 题目描述: X老师让小宁同学查看一个网页的源代码&#xff0c;但小宁同学发现鼠标右键好像不管用了。 不能按右键&#xff0c;按F12 robots …

springboot+vue居民小区设备报修系统

小区报修系统可以提高设施维护的效率&#xff0c;减少机构的人力物力成本&#xff0c;并使得维修人员可以更好地了解维护设备的情况&#xff0c;及时解决问题。 对于用户来说&#xff0c;报修系统也方便用户的维修请求和沟通&#xff0c;提高了用户的满意度和信任。其次小区报修…

CTFshow web(命令执行 41-44)

web41 <?php /* # -*- coding: utf-8 -*- # Author: 羽 # Date: 2020-09-05 20:31:22 # Last Modified by: h1xa # Last Modified time: 2020-09-05 22:40:07 # email: 1341963450qq.com # link: https://ctf.show */ if(isset($_POST[c])){ $c $_POST[c]; if(!p…

ubuntu原始套接字多线程负载均衡

原始套接字多线程负载均衡是一种在网络编程中常见的技术&#xff0c;特别是在高性能网络应用或网络安全工具中。这种技术允许应用程序在多个线程之间有效地分配和处理网络流量&#xff0c;提高系统的并发性能。以下是关于原始套接字多线程负载均衡技术的一些介绍&#xff1a; …