图形系统开发实战课程:进阶篇(上)——4.图形基本形状

2024-02-16 08:04

本文主要是介绍图形系统开发实战课程:进阶篇(上)——4.图形基本形状,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


[

图形开发学院|GraphAnyWhere

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

第四章:图形基本形状

\quad 在图形系统中,基本形状是指一些简单的二维形状,例如点、线、矩形、圆形等。这些基本形状是构建复杂形状和图像的基础元素。

\quad 基本形状可以通过各种方式进行组合、变换和修改,以创建更为复杂的形状和图像。例如将一个矩形旋转一定角度来得到一个新形状。

\quad 基本形状也具有一些属性,例如位置、大小、颜色等,这些属性可以通过编程进行修改和操作,以实现各种视觉效果和图形设计。

\quad 在计算机图形学中,基本形状通常是用数学公式来表示的,例如圆形是由一个中心点和半径组成的,矩形是在由一个点和矩形的宽高组成的。这些数学公式可以方便地对基本形状进行操作和变换,从而实现各种复杂的图形效果。

1 GIS系统和SVG中的基本形状

\quad GIS系统和SVG是图形系统中的两个分支,目前已存在大量的应用,也已经由国际权威机构制定了相应规范,我们先看一下GIS和SVG中的一些基本形状:

(1) GIS中的基本形状

\quad 在GIS(地理信息系统)中,基本形状通常包括点、线、面等几种类型。

\quad 点实体在GIS中可以表示为具有坐标和属性信息的实体,如建筑物、交通枢纽、自然物体等。

\quad 对于线实体,在GIS中可以用一系列坐标对表示,这些坐标对代表了线的位置点。线实体可以用来表示各种线性特征,如道路、河流、山脉等。

\quad 多边形是GIS中的另一种基本形状,它是由一条或若干条闭合的线段组成的图形,用于表示边界完全闭合的空间区域。多边形可以用来表示重视大小和形状这两个特征的地理对象,如城市边界、公园、建筑或水体等。

下面列出了OpenGIS中的几种基本形状:

类型名称示例
PointPoint (10 10)
LineString折线LineString (10 10, 20 20, 30 40)
Polygon多边形Polygon ((10 10, 10 20, 20 20, 20 15, 10 10))
MultiPoint多点MultiPoint ((10 10),(20 20))
MultiLineString多线MultiLineString ((10 10, 20 20),(15 15, 30 15))
MultiPolygon多面MultiPolygon (((10 10, 10 20, 20 20, 20 15, 10 10)),((60 60, 70 70, 80 60, 60 60 )))

(2) SVG中的基本形状

\quad SVG(Scalable Vector Graphics)是一种基于XML的二维矢量图形标准,它支持多种基本形状,如下表所示:

类型名称示例
rect矩形<rect x="100" y="100" width="400" height="200" fill="yellow" stroke="green" stroke-width="10"/>
line线<line x1="100" y1="300" x2="300" y2="100" stroke-width="5"/>
polyline折线<polyline fill="none" stroke="blue" stroke-width="10" points="50,375 150,375 150,325 250"/>
polygon多边形<polygon points="100,100 150,25 150,75 200,0" fill="none" stroke="black" />
circle<circle cx="200" cy="200" r="100" fill="red" stroke="blue" stroke-width="10"/>
ellipse椭圆<ellipse cx="30" cy="5" rx="8" ry="4" fill="url('#linear2')"/>
path路径<path fill="none" stroke="red" d="M 10,30 A 20,20 0,0,1 50,30 A 20,20 0,0,1 90,30 Q 90,60 50,90 Q 10,60 10,30 z "/>
text文本<text x="250" y="180" font-family="Verdana" font-size="64" fill="blue">Hello world!</text>
image图像<image xlink:href="http://168.9.202.125/graph/data/bird.png" width="199" height="224"/>
use符号引用<use xlink:href="#eye" stroke="silver" fill="gray" width="80" height="80" x="300" y="20"/>

2 anyGraph 基本几何对象

\quad anyGraph 的目标是成为一个通用的WEB前端图形开发引擎,因此其包含的基本几何形状与SVG比较相似,包含常见的点、线、面几方面基本几何形状。

\quad 基本几何对象源码位于 src\geom 目录。

Geometry
String uid
Enum type
float rotation
Object style
Object properties
Point
float x
float y
float size
int pointType
Rect
float x
float y
float width
float height
float rx
float ry
toPixel()
getBBox()
draw()
container()
Polyline
floatArray coords
toPixel()
getBBox()
draw()
container()
Polygon
floatArray coords
toPixel()
getBBox()
draw()
container()
Circle
float x
float y
float radius
toPixel()
getBBox()
draw()
container()
Ellipse
float x
float y
float rx
float ry
toPixel()
getBBox()
draw()
container()
Image
float x
float y
float width
float height
toPixel()
getBBox()
draw()
container()
Text
float x
float y
float width
float height
toPixel()
getBBox()
draw()
container()

(1) Geomertry

\quad Geomertry 是基本形状的根类,是一个抽象的(不可实例化的)类。包含了基本几何形状通用的属性和方法。

\quad Geomertry 类非常重要,掌握了该类,就能更容易理解 anyGraph 的几何对象类型,以及理解 anyGraph 的图形渲染过程。

\quad 其重要属性包括:

名称类型说明
uidString唯一ID
typeString类型
rotationfloat旋转角度
styleObject样式
propertiesObject属性

\quad 其基本的方法包括:

名称说明
getUid()获取对象ID
getType()获取对象类型
getStyle()获取对象样式
setStyle(style)设置对象样式
draw(ctx, style, frameState)绘制对象图形(需各个子类实现)
toPixel()转换为屏幕坐标
getBBox()获取对象边界
contain(point)判断某点是否在当前对象的边框内
clone()克隆对象
toData()获取当前对象属性

\quad 下面讲解几个常用的方法:

draw()
draw(ctx, style, frameState)

\quad 该方法由各子类来实现,负责将图形绘制在Canvas中,包含了3个参数:

名称说明
ctxCanvas渲染上下文对象
style图形样式,该样式为渲染时的样式
frameState当前图形信息
toPixel()
toPixel(tool)

\quad 该方法由各子类来实现,负责将图形坐标转换为Canvas像素坐标,其参数为 “变换矩阵” 。

setStyle()
setStyle(style)

\quad 该方法可修改对象的样式,其参数为 样式对象,虽然该对象的样式存储在其内部变量 style 中,但该方法仅修改参数中的指定的属性,而不是该对象样式的所有属性。例如该对象当前样式为 {"color":"red", "fillColor":"blue"},如果参数为 {"color":"gree"},则结果仅改变样式中的color属性,而不改变fillColor属性。

getBBox()

\quad 该方法返回该对象的 Bounding Box, 即矩形边界框,它是一个矩形框,用于包围当前形状。通常采用 [minX, minY, maxX, maxY] 格式记录Bounding Box。对于三维图形又叫包围盒,对于二维图形又叫包围矩形;

\quad 如下图所示的红色框即为该对象的 Bounding Box。

在这里插入图片描述

contain()
contain(point, useCoord = true)

\quad 该方法判断一个点是否包含在当前对象内。在 Geomertry 类中已实现了一个基本版本,即通过 getBBox() 得到当前对象的矩形边框框,通过判断点是否在 Bounding Box 中而进行判断。

\quad 子类可重新该方法,进行更为精确的判断。例如对于 Circle 对象,可通过判断 point 与 圆心 radius 之间的距离是否超过圆的半径,从而得到比判断 point是否在该圆的 Bounding Box 内更为精确的结果。

clone()

\quad 该方法实现对象克隆,返回一个新的对象,建议子类重写该方法,实现对象的深度复制。

toData()

\quad 该方法以JSON格式返回对象信息,详见下面各类对象中的‘数据格式’章节。

其他

\quad 除了上述这些基本方法之外,下面这几个方法也很常用,这些方法将在进阶篇其他章节讲述。

名称说明
setContextStyle(ctx, style)设置画板样式
getColor(param, ctx)获取填充/描边的颜色值或特殊效果
strokeAndFill(ctx)描边和填充
translate(dx, dy)对象平移
scale(sx, sy, opt_anchor)对象缩放
rotate(angle, opt_anchor)对象旋转
moveTo(dx, dy)将对象移动至某点
transform(matrix)坐标变换

(2) 点(Point)

\quad 点是一种最简单的几何形状,其信息包括:x坐标、y坐标、大小size和旋转角度rotation等。 anyGraph 中点的属性如下表所示:

名称类型说明
uidString唯一ID
typeString类型
xfloatX坐标值
yfloatY坐标值
sizefloat大小
rotationfloat旋转角度
pointTypeint点类型
centerAsOriginBoolean坐标点是否位于图标的中心,默认:true
styleObject样式
propertiesObject属性
初始化
constructor(options)

\quad 该类的构造函数接受一个 Object 类型的参数,其值包含了上述所有属性 (type除外) 。

空间信息

\quad 点是0维的几何体,其空间属性通过坐标 xy 确定位置,通过 size 确定大小,这几个属性均为浮点类型,其格式如下:

{ "x":50, "y":20, "size":5 }
示例

\quad 下面这个示例在图形增加了一个点对象,通过图层数据源的 add()方法增加至图层中,源代码如下:

<script type="module">import { Graph, Point } from "../../src/index.js";// graph对象let graph = new Graph({"target": "graphWrapper"});// 新建绘图图层let layer = graph.addLayer();// 在画布中绘制图像layer.getSource().add(new Point({ "x": x, "y": y, "size": 20, "style": { "fillColor": "red"} }));// rendergraph.render();
</script>
图形

\quad ,在渲染点时 anyGraph 提供了内置类型图标两种渲染方式。

内置点类型

\quad 根据点类型(pointType)的值渲染为不同的形状。 anyGraph 提供了20种不同形状,如下图所示:

在这里插入图片描述

\quad 在构造Point对象时指定pointType属性,其取值范围为 0~19,即可将点渲染为内置形状。其数据格式定义如下:

[{"type":"Point","x":50,"y":60,"pointType":2,"size":20,"style":{"fillColor":"red","color":"none"}},{"type":"Point","x":164,"y":60,"pointType":3,"size":20,"style":{"fillColor":"red","color":"none"}},{"type":"Point","x":278,"y":60,"pointType":4,"size":20,"style":{"fillColor":"red","color":"none"}},{"type":"Point","x":392,"y":60,"pointType":5,"size":20,"style":{"fillColor":"red","color":"none"}}
]
图标

在这里插入图片描述

\quad 在构造Point对象时指定src属性,将其指向一个图标文件路径,即可将点渲染为图标。其数据格式定义如下:

[{"type":"Point","x":50,"y":60,"size":32,"src":"./images/marker/marker_1.png","centerAsOrigin":true},{"type":"Point","x":164,"y":60,"size":32,"src":"./images/marker/marker_2.png","centerAsOrigin":true},{"type":"Point","x":278,"y":60,"size":32,"src":"./images/marker/marker_3.png","centerAsOrigin":true},{"type":"Point","x":392,"y":60,"size":32,"src":"./images/marker/marker_4.png","centerAsOrigin":true}
]

\quad 默认情况下点坐标(x,y)位于图标的中心,可通过centerAsOrigin=false将点坐标指向图标的底部中央位置。

\quad 如果没有指定src属性,也没有指定pointType属性,则按照 pointType 等于0,输出一个 “填充圆” 。

样式

\quad 通过从 Geometry 类继承的 style 属性指定渲染样式,可通过 getStyle() 获取样式,或通过 setStyle() 设置样式,该类样式包括了以下属性:

名称类型说明
colorStringColor描边颜色
fillColorStringColor填充颜色
lineWidthfloat线宽

(3) 折线(Polyline)

\quad 折线由若干点连接而成,其中每两个点之间称之为线段(lineSegment)。在GIS中折线对应类型为 LineString,在SVG中对应类型为 polylinelineanyGraph 中折线的属性如下表所示:

名称类型说明
uidString唯一ID
typeString类型
rotationfloat旋转角度
coordsArray坐标数组
styleObject样式
propertiesObject属性
初始化
constructor(options)

\quad 该类的构造函数接受一个 Object 类型的参数,其值包含了上述所有属性 (type除外) 。

空间信息

\quad 折线类的空间属性 通过坐标 coords 属性确定,其格式为坐标点数组类型,而各个点也是一个浮点类型数组,其格式如下:

[[50,50], [150,80], [250,50], [350,80], [450,50]]
示例

\quad 下面这个示例在图形增加了几个折线对象,通过图层数据源的 add()方法增加至图层中,源代码如下:

<script type="module">import { Graph, Polyline } from "../../src/index.js";// graph对象let graph = new Graph({"target": "graphWrapper"});// 新建绘图图层let layer = graph.addLayer();// 在画布中绘制图像layer.getSource().add(new Polyline({ "coords" : [[50, 50], [150, 80], [250, 50], [350, 80], [450, 50], [550, 80], [650, 50], [750, 80]], "style":{"lineWidth": 2, "color":"red"}}));layer.getSource().add(new Polyline({ "coords" : [[50, 110], [150, 140], [250, 110], [350, 140], [450, 110], [550, 140], [650, 110], [750, 140]], "style":{"lineWidth": 8, "color":"gold"}}));layer.getSource().add(new Polyline({ "coords" : [[50, 170], [150, 200], [250, 170], [350, 200], [450, 170], [550, 200], [650, 170], [750, 200]], "style":{"lineWidth": 4, "color":"green", "dash": [8, 8, 8, 8] }}));layer.getSource().add(new Polyline({ "coords" : [[50, 230], [150, 270], [250, 230], [350, 270], [450, 230], [550, 270], [650, 230], [750, 270]], "style":{"lineWidth": 4, "color": "blue", "dash": [20, 8, 8, 8]}}));// rendergraph.render();
</script>

\quad 这段代码运行的结果如下图所示:

在这里插入图片描述

数据格式

\quad anyGraph 中折线类的数据格式如下:

[{"type":"Polyline","coords":[[50,50],[150,80],[250,50],[350,80],[450,50],[550,80],[650,50],[750,80]],"style":{"lineWidth":2,"color":"red"}},{"type":"Polyline","coords":[[50,110],[150,140],[250,110],[350,140],[450,110],[550,140],[650,110],[750,140]],"style":{"lineWidth":8,"color":"gold"}},{"type":"Polyline","coords":[[50,170],[150,200],[250,170],[350,200],[450,170],[550,200],[650,170],[750,200]],"style":{"lineWidth":4,"color":"green","lineType":"dash","dash":[8,8,8,8]}},{"type":"Polyline","coords":[[50,230],[150,270],[250,230],[350,270],[450,230],[550,270],[650,230],[750,270]],"style":{"lineWidth":4,"color":"blue","lineType":"dash","dash":[20,8,8,8]}}
]
样式

\quad 通过从 Geometry 类继承的 style 属性指定渲染样式,可通过 getStyle() 获取样式,或通过 setStyle() 设置样式,该类样式包括了以下属性:

名称类型说明
colorStringColor颜色
lineWidthfloat线宽
dashArray虚线样式
dashOffsetint虚线偏移量
lineCapString描边属性,边框终点的形状
lineJoinString连接属性,控制两条描边线段之间连接属性
miterLimitint斜接长度

linecap 属性的值有三种可能值:

  • butt用直边结束线段,它是常规做法,线段边界 90 度垂直于描边的方向、贯穿它的终点。(default)
  • square的效果差不多,但是会稍微超出实际路径的范围,超出的大小由stroke-width控制
  • round表示边框的终点是圆角,圆角的半径也是由stroke-width控制的。

lineJoin 连接属性,控制两条描边线段之间,它有三个可用的值:

  • miter: 默认值,表示用方形画笔在连接处形成尖角(default)
  • round: 表示用圆角连接,实现平滑效果
  • bevel: 连接处会形成一个斜接

(4) 矩形(Rect)

\quad 矩形是一种常见的几何形状。 anyGraph 中矩形的属性如下表所示:

名称类型说明
uidString唯一ID
typeString类型
xfloatX坐标值
yfloatY坐标值
widthfloat
heightfloat
rxfloat水平轴向的圆角半径尺寸
ryfloat垂直轴向的圆角半径尺寸
rotationfloat旋转角度
styleObject样式
propertiesObject属性
初始化
constructor(options)

\quad 该类的构造函数接受一个 Object 类型的参数,其值包含了上述所有属性 (type除外) 。

空间信息

\quad 矩形的空间属性通过坐标 xy 确定位置,通过 widthheight 确定大小,这几个属性均为浮点类型,其格式如下:

{ "x":50, "y":20, "width": 200, "height": 100 }
示例

\quad 下面这个示例在图形增加了一个矩形对象,通过图层数据源的 add()方法增加至图层中,源代码如下:

<script type="module">import { Graph, Rect } from "../../src/index.js";// graph对象let graph = new Graph({"target": "graphWrapper"});// 新建绘图图层let layer = graph.addLayer();// 绘制矩形layer.getSource().add(new Rect({ "x": 50, "y": 50, "width": 200, "height": 100, "style":{"lineWidth":4 , "color":"blue"} }));layer.getSource().add(new Rect({ "x": 350, "y": 50, "width": 200, "height": 100, "rx":10, "ry":10, "style":{ "fillColor" : "#9FFFFF", "fillStyle":1, "lineWidth":4 , "color":"red" } }));// rendergraph.render();
</script>

\quad 这段代码运行的结果如下图所示:

在这里插入图片描述

数据格式

\quad anyGraph 中矩形类的数据格式如下:

[{"type":"Rect","x":50,"y":50,"width":200,"height":100,"style":{"lineWidth":4,"color":"blue"}},{"type":"Rect","x":350,"y":50,"width":200,"height":100,"rx":10,"ry":10,"style":{"fillColor":"#9FFFFF","fillStyle":1,"lineWidth":4,"color":"red"}}
]
样式

\quad 通过从 Geometry 类继承的 style 属性指定渲染样式,可通过 getStyle() 获取样式,或通过 setStyle() 设置样式,该类样式包括了以下属性:

名称类型说明
colorStringColor描边颜色, 当值等于 “none” 时表示不用描边
lineWidthfloat描边线宽
fillColorStringColor填充颜色
fillStyleint填充风格,1为填充,2为不填充
dashArray虚线样式
dashOffsetint虚线偏移量
lineCapString描边属性,边框终点的形状
lineJoinString连接属性,控制两条描边线段之间连接属性
miterLimitint斜接长度

(5) 多边形(Polygon)

\quad 多边形是一种基本的几何图形,由三个或三个以上的顶点坐标连线所围成的封闭图形。 anyGraph 中矩形的属性如下表所示:

名称类型说明
uidString唯一ID
typeString类型
rotationfloat旋转角度
coordsArray坐标数组
styleObject样式
propertiesObject属性
初始化
constructor(options)

\quad 该类的构造函数接受一个 Object 类型的参数,其值包含了上述所有属性 (type除外) 。

空间信息

\quad 多边形的空间属性是通过多个 LineRing 组成, 第一个环是多边形的外边界,所有后续环都是内孔。LineRing(线环)是一种闭合的 LineString(折线)。其格式如下:

[[[620,250],[510,441],[290,441],[180,250],[290,59],[510,59],[620,250]],[[550,250],[475,120],[325,120],[250,250],[325,380],[475,380],[550,250]]
]
示例1

\quad 下面这个示例在图形增加了7个多边形对象(七巧板),通过图层数据源的 loadData()方法增加至图层中,源代码如下:

<script type="module">import { Graph } from "../../src/index.js";// graph对象let graph = new Graph({"target": "graphWrapper"});// 数据let data = [{ "type": "Polygon", "coords": [[[380, 220], [267, 333], [267, 220]]], "style": { "fillStyle": 1, "fillColor": "#caff67" }, "uid": "G000003T" },{ "type": "Polygon", "coords": [[[345, 257], [425, 177], [505, 257]]], "style": { "fillStyle": 1, "fillColor": "#67becf" }, "uid": "G000003U" },{ "type": "Polygon", "coords": [[[509, 177], [453, 121], [453, 64], [509, 121]]], "style": { "fillStyle": 1, "fillColor": "#ef3d61" }, "uid": "G000003V" },{ "type": "Polygon", "coords": [[[265, 171], [265, 251], [225, 211]]], "style": { "fillStyle": 1, "fillColor": "#f9f51a" }, "uid": "G0000040" },{ "type": "Polygon", "coords": [[[466, 136], [506, 176], [466, 216], [426, 176]]], "style": { "fillStyle": 1, "fillColor": "#a54c09" }, "uid": "G0000041" },{ "type": "Polygon", "coords": [[[551, 162], [511, 202], [511, 122]]], "style": { "fillStyle": 1, "fillColor": "#fa8ccc" }, "uid": "G0000042" },{ "type": "Polygon", "coords": [[[425, 259], [505, 259], [505, 339]]], "style": { "fillStyle": 1, "fillColor": "#f6ca29" }, "uid": "G0000043" }]// 新建绘图图层let layer = graph.addLayer();layer.getSource().loadData(data);// 图形渲染graph.render();
</script>

\quad 这段代码运行的结果如下图所示:

在这里插入图片描述

示例2

\quad 下面这个示例在图形增加了一个带洞的多边形对象,通过图层数据源的 add()方法增加至图层中,源代码如下:

<script type="module">import { Graph, Coordinate, Polygon, circle2LineRing, debug } from "../../src/index.js";// graph对象let graph = new Graph({"target": "graphWrapper"});// 增加数据层let layer = graph.addLayer({"name":"数据层"});// 多边形坐标let coord1 = circle2LineRing([300, 200], 180, 6);let coord2 = Coordinate.reverse(circle2LineRing([300, 200], 120, 6));// 增加多边形layer.getSource().add(new Polygon({ "coords": [coord1, coord2], "style":{"fillStyle":1, "fillColor": "blue", "color":"none"} }));// 图形渲染graph.render();
</script>

\quad 这段代码运行的结果如下图所示:

在这里插入图片描述

注意:要绘制这种带孔的多边形,需注意坐标的顺序,该图中的外框多边形坐标是顺时针的,内孔多边形坐标是逆时针的。

数据格式

\quad anyGraph 中多边形类的数据格式如下:

[{"type":"Polygon","coords":[[[480,200],[390,356],[210,356],[120,200],[210,44],[390,44],[480,200]],[[420,200],[360,96],[240,96],[180,200],[240,304],[360,304],[420,200]]],"style":{"fillStyle":1,"fillColor":"blue","color":"none"}}
]
样式

\quad 多边形样式属性与矩形样式属性相同。

(6) 图像(Image)

\quad 图像(位图)是指由像素(图片元素)组成的矩形。这些像素可以进行不同的排列和染色以构成图像,每个像素都有固定的位置和特定的颜色值,它们共同决定了图像的形状、颜色和细节。 anyGraph 中图像的属性如下表所示:

名称类型说明
uidString唯一ID
typeString类型
rotationfloat旋转角度
xfloatX坐标值
yfloatY坐标值
widthfloat
heightfloat
styleObject样式
propertiesObject属性
初始化
constructor(options)

\quad 该类的构造函数接受一个 Object 类型的参数,其值包含了上述所有属性 (type除外) 。

空间信息

\quad 图像的空间属性通过坐标 xy 确定位置,通过 widthheight 确定大小,这几个属性均为浮点类型,其格式如下:

{ "x":50, "y":20, "width": 200, "height": 100 }
示例

\quad 下面这个示例在图形中增加了几个图像对象,通过图层数据源的 add()方法增加至图层中,源代码如下:

<script type="module">import { Graph, Image } from "../../src/index.js";// graph对象let graph = new Graph({"target": "graphWrapper"});// 新建绘图图层let layer = graph.addLayer();// 绘制图像layer.getSource().add(new Image({ "x": 50, "y": 50, "src": "./images/square2.png" }));// 缩小的图像layer.getSource().add(new Image({ "x": 50, "y": 250, "src": "./images/square2.png", "width": 100, "height": 100 }));// 拉伸变形的图像layer.getSource().add(new Image({ "x": 200, "y": 250, "src": "./images/square2.png", "width": 100, "height": 50 }));// 放大的图像layer.getSource().add(new Image({ "x": 350, "y": 50, "src": "./images/square2.png", "width": 300, "height": 300 }));// rendergraph.render();
</script>

\quad 这段代码运行的结果如下图所示:

在这里插入图片描述

数据格式

\quad anyGraph 中图像类的数据格式如下:

[{"type":"Image","src":"./images/square2.png","x":50,"y":50},{"type":"Image","src":"./images/square2.png","x":50,"y":250,"width":100,"height":100},{"type":"Image","src":"./images/square2.png","x":200,"y":250,"width":100,"height":50},{"type":"Image","src":"./images/square2.png","x":350,"y":50,"width":300,"height":300}
]
样式

\quad 通过从 Geometry 类继承的 style 属性指定渲染样式,可通过 getStyle() 获取样式,或通过 setStyle() 设置样式,该类样式包括了以下属性:

名称类型说明
borderColorStringColor颜色
borderfloat线宽
imageSmoothingEnabledBoolean是否平滑
imageSmoothingQualityString平滑度

imageSmoothingQuality 的可选值包括:

  • “low” : 低;
  • “medium” :中
  • “high” : 高

(7) 文本(Text)

\quad 在图形系统中,文本对象通常指的是在图形界面中呈现的文字元素。用于标注、说明、展示信息等目的。因此图形基本形状中还应包括文本类型,从而方便的在图形中绘制文字。 anyGraph 中文本的属性如下表所示:

名称类型说明
uidString唯一ID
typeString类型
rotationfloat旋转角度
xfloatX坐标值
yfloatY坐标值
vectorSizeBoolean是否为矢量字体
widthfloat文字宽度
heightfloat文字高度
maxWidthfloat文字可显示的最大宽度
verticalBoolean是否垂直排列
styleObject样式
propertiesObject属性

说明:

  1. 文字大小优先由 style.fontSize 指定;
  2. vectorSize的缺省属性是true,即文字大小跟随着图形的缩放而缩放;
  3. 如果没有指定fontSize,也可由 width 和 height 属性确定文字大小;
初始化
constructor(options)

\quad 该类的构造函数接受一个 Object 类型的参数,其值包含了上述所有属性 (type除外) 。

空间信息

\quad 文本的空间属性通过坐标 xy 确定位置,通过样式中的 fontSize 确定大小,这几个属性均为浮点类型。此外样式中的水平对齐 textAlign和垂直对齐 textBaseline 也会影响文本的位置,其格式如下:

{ "x":50, "y":20, "style": {"fontSize": 100 }}
示例

\quad 下面这个示例在图形增加了几个文本对象,通过图层数据源的 add()方法增加至图层中,源代码如下:

<script type="module">import { Graph, Text } from "../../src/index.js";// graph对象let graph = new Graph({"target": "graphWrapper"});// 新建绘图图层let layer = graph.addLayer();// 绘制填充的文字layer.getSource().add(new Text({ "x": 65, "y": 60, "text": "40px中文", style: { "fillColor": "red", "fontSize": 40, "fontName": "黑体" } }));layer.getSource().add(new Text({ "x": 260, "y": 60, "text": "30px中文", style: { "fillColor": "red", "fontSize": 30, "fontName": "黑体" } }));layer.getSource().add(new Text({ "x": 420, "y": 60, "text": "20px中文", style: { "fillColor": "red", "fontSize": 20, "fontName": "黑体" } }));layer.getSource().add(new Text({ "x": 540, "y": 60, "text": "14px绘制基本图形", style: { "fillColor": "red", "fontSize": 14, "fontName": "黑体" } }));// rendergraph.render();
</script>

\quad 这段代码运行的结果如下图所示:

在这里插入图片描述

数据格式

\quad anyGraph 中文本类的数据格式如下:

[{"type":"Text","x":65,"y":60,"text":"40px中文","vectorSize":true, "style":{"fillColor":"red","fontSize":40,"fontName":"黑体"}},{"type":"Text","x":260,"y":60,"text":"30px中文","vectorSize":true, "style":{"fillColor":"red","fontSize":30,"fontName":"黑体"}},{"type":"Text","x":420,"y":60,"text":"20px中文","vectorSize":true, "style":{"fillColor":"red","fontSize":20,"fontName":"黑体"}},{"type":"Text","x":540,"y":60,"text":"14px绘制基本图形","vectorSize":true, "style":{"fillColor":"red","fontSize":14,"fontName":"黑体"}},
]
样式

\quad 通过从 Geometry 类继承的 style 属性指定渲染样式,可通过 getStyle() 获取样式,或通过 setStyle() 设置样式,文本样式包括了以下属性:

名称类型说明
colorStringColor颜色
lineWidthfloat线宽
fontNameString字体名称
fontSizeint字体大小
fontItalicBoolean是否斜体
fontBoldBoolean是否粗体
fontWeightString粗细程度
textAlignString水平对齐方式
textBaselineString垂直对齐方式
minFontSizeint最小显示的字号大小
fillPriorBoolean是否强制填充文本
letterSpacingint字间距
wordSpacingint字母间距
fontBorderBoolean是否带有边框
borderColorStringColor边框颜色
borderOpacityfloat边框透明度

注意:当图形缩放导致字体大小小于minFontSize时,不显示该文本。

(8) 圆(Circle)

\quad 圆是一种基本的几何图形,它是由所有到固定点(即圆心)距离相等的点组成的集合。 anyGraph 中矩形的属性如下表所示:

名称类型说明
uidString唯一ID
typeString类型
xfloatX坐标值
yfloatY坐标值
radiusfloat半径
startAnglefloat圆弧的起始点,x 轴方向开始计算,单位以弧度表示
endAnglefloat圆弧的终点,单位以弧度表示
anticlockwiseBoolean是否逆时针方向绘制圆(默认值为: false)
styleObject样式
propertiesObject属性
初始化
constructor(options)

\quad 该类的构造函数接受一个 Object 类型的参数,其值包含了上述所有属性 (type除外) 。

空间信息

\quad 圆的空间属性是由圆心(x,y)和半径(radius)确定,此外圆弧的起始点 startAngle 属性和圆弧的终点 endAngle 属性也会影响圆的形状。其格式如下:

{ "x":300, "y":220, "radius": 200 }
示例

\quad 下面这个示例在图形增加了两个圆对象,其中一个是描边圆(空心),另一个是填充的圆(实心),通过图层数据源的 add()方法增加至图层中,源代码如下:

<script type="module">import { Graph, Circle, debug } from "../../src/index.js";// graph对象let graph = new Graph({"target": "graphWrapper"});// 增加数据层let layer = graph.addLayer({"name":"数据层"});// 绘制圆layer.getSource().add(new Circle({ "x": 150, "y": 150, "radius": 100, "style": { "lineWidth": 8, "color": "green" } }));layer.getSource().add(new Circle({ "x": 420, "y": 150, "radius": 100, "style": { "color": "none", "fillStyle":1, "fillColor":"gold" } }));// 图形渲染graph.render();
</script>

\quad 这段代码运行的结果如下图所示:

在这里插入图片描述

数据格式

\quad anyGraph 中圆的数据格式如下:

[{"type":"Circle","x":150,"y":150,"radius":100,"style":{"lineWidth":8,"color":"green"}},{"type":"Circle","x":420,"y":150,"radius":100,"style":{"color":"none","fillStyle":1,"fillColor":"gold"}}
]
样式

\quad 圆的样式属性与矩形样式属性相同。

(9) 椭圆(Ellipse)

\quad 椭圆是由所有满足到两个定点(即焦点)距离之和等于常数的点组成的平面图形。 anyGraph 中矩形的属性如下表所示:

名称类型说明
uidString唯一ID
typeString类型
xfloatX坐标值
yfloatY坐标值
radiusXfloat椭圆长轴的半径
radiusYfloat椭圆短轴的半径
startAnglefloat圆弧的起始点,x 轴方向开始计算,单位以弧度表示
endAnglefloat圆弧的终点,单位以弧度表示
anticlockwiseBoolean是否逆时针方向绘制圆(默认值为: false)
rotationfloat旋转角度
styleObject样式
propertiesObject属性
初始化
constructor(options)

\quad 该类的构造函数接受一个 Object 类型的参数,其值包含了上述所有属性 (type除外) 。

空间信息

\quad 椭圆的空间属性是由圆心(x,y)和半径(radius)确定。其格式如下:

{ "x":300, "y":220, "radiusX": 200, "radiusY": 120 }
示例

\quad 下面这个示例在图形增加了两个椭圆对象,通过图层数据源的 add()方法增加至图层中,源代码如下:

<script type="module">import { Graph, Circle, debug } from "../../src/index.js";// graph对象let graph = new Graph({"target": "graphWrapper"});// 增加数据层let layer = graph.addLayer({"name":"数据层"});// 绘制椭圆layer.getSource().add(new Ellipse({ "x": 150, "y": 150, "radiusX": 100, "radiusY": 120, "style": { "lineWidth": 8, "color": "green" } }));layer.getSource().add(new Ellipse({ "x": 450, "y": 150, "radiusX": 160, "radiusY": 100, "style": { "color": "none", "fillStyle":1, "fillColor":"gold" } }));// 图形渲染graph.render();
</script>

\quad 这段代码运行的结果如下图所示:

在这里插入图片描述

数据格式

\quad anyGraph 中椭圆的数据格式如下:

[{"type":"Ellipse","x":150,"y":150,"radiusX":100,"radiusY":120,"style":{"lineWidth":8,"color":"green"}},{"type":"Ellipse","x":450,"y":150,"radiusX":160,"radiusY":100,"style":{"color":"none","fillStyle":1,"fillColor":"gold"}}
]
样式

\quad 椭圆的样式属性与矩形样式属性相同。


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

相关资料

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


作者信息

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

这篇关于图形系统开发实战课程:进阶篇(上)——4.图形基本形状的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/713970

相关文章

网页解析 lxml 库--实战

lxml库使用流程 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 XPath表达式提供了良好的支 持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 pip install lxml lxm| 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面来介绍一下 lxml 库

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

基本知识点

1、c++的输入加上ios::sync_with_stdio(false);  等价于 c的输入,读取速度会加快(但是在字符串的题里面和容易出现问题) 2、lower_bound()和upper_bound() iterator lower_bound( const key_type &key ): 返回一个迭代器,指向键值>= key的第一个元素。 iterator upper_bou

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount