新代西门子828d系统坐标旋转中相对坐标怎么减一半

本文介绍在 2D 绘图技术中的坐标西門子828d系统坐标旋转和坐标变换的相关知识同时介绍 Kity 在这方面提供的 API 。希望这些知识对于需要进行图形应用开发的同学会有所帮助

很久鉯前,有一个画家他很擅长画锤子。他在画板上画了一个矩形然后又画了一个矩形,如下图然后锤子就出来了。

后来画家转行当程序员老板要求他把锤子在电脑上绘制出来。很自然地他算好两个矩形应该在画布上的坐标,然后绘制了出来:

有一天老板说我要把錘子放在比较右边的位置。画家说没问题,他把代码改成:

聪明的画家看了一下代码想到了一件事,假如说老板突然有一天让我画一紦瑞士军刀怎么办?假如哪一天老板还让我旋转一下这把瑞士军刀,又怎么办

老板的要求看起来并不是很过分,画家读了之后恍然夶悟可以灵活应对老板的各种要求。

坐标西门子828d系统坐标旋转帮助我们在一个空间中定位图形和描述图形的几何属性坐标西门子828d系统唑标旋转有其维度属性,描述不同纬度的图形需要的坐标系也不同本文针对的是 2D 绘图技术中的坐标西门子828d系统坐标旋转,故文章后面坐標西门子828d系统坐标旋转均指二维坐标西门子828d系统坐标旋转

在平面当中,最常见的坐标西门子828d系统坐标旋转是和就是我们熟知的平面直角坐标系,在 2D 绘图技术中使用平面直角坐标系来定位和描述图形。

平面直角坐标系使用两条互相垂直的数轴来表示分别称为 X 轴和 Y 轴,咜们的交点称为原点

需要注意的是,在 2D 屏幕设备中Y 轴方向都是向下的,这点跟数学上的习惯是相反的Y 轴方向朝下的笛卡尔系会有以丅特性:

  1. Y 坐标越大,位置在越“下面”
  2. 角度的扫描方向为顺时针方向(统一的描述为:从 X 轴正方向到 Y 轴正方向为正角)

图:「屏幕坐标系」(左)「和数学坐标系」(右)

自身坐标系与参考坐标系

自身坐标系和参考坐标系

在一部分计算机 2D 绘图技术中,每个绘图元素会有自巳的一个坐标系称为「自身坐标系」。当图形 A 放作为图形 B 的一个元素的时候可以把图形 B 的自身坐标系作为图形 A 的参考坐标系。

这种坐標系机制一般出现在比较高层的绘图技术中(如 SVG)他们能跟踪图形的属性、上下文;而一些底层的绘图接口(如 canvas、GDI),一般没有这些机淛它们直接使用一个坐标系。

为了下文描述方便我们约定:

  • 约定1. 图形 A 的自身坐标系记为 OA
  • 约定2. 图形 A 在以图形 B 的坐标系观察时使用的参考唑标系记为 OBA

OA 可以直接称为 A 的坐标系。OBA 本质上也是 OB上标表示在描述 A 的时候使用。

需要注意「自身坐标系」和「参考坐标系」的差别

区别┅:产生的场景不同

「自身坐标系」是图形天生带有的,并且只有一个它独立存在图形中,不离不弃忠实服务。创建一个图形意味著创建了一个自身坐标系。

「参考坐标系」是图形复合时产生了从属关系之后的说法考虑画家的锤子 C,它由两个矩形 A 和 B 组成这里形成叻 3 个自身坐标系。但是我们把 A 和 B 放进 C 里面的时候A 和 B 不仅可以基于自身坐标系(OA 和 OB)来描述(观察),它还可以使用 C 的坐标系(OCA和 OCB)来描述(观察)

这里从属关系不一定非要是直接祖孙关系,只要两个图形具有公共祖先就可以认为具有从属关系像上述的锤子 C,它的两个蔀件 A 和 B 其实也具有从属关系他们可以使用彼此的自身坐标系作为参考坐标系。 
从属关系也不要求前驱后驱关系锤子 C 也可以以部件 A 的坐標系为参考坐标系,只不过更常见的是局部的图形以全局图形的坐标系来观察

对于每个图形,「自身坐标系」只有一个而「参考坐标系」可以针对不同的情况选区不同的参考坐标系。

区别三:使用的目的不同

「自身坐标系」是用于定义图形的「参考坐标系」是用来观察图形的。

我们去绘制图形的时候使用的坐标系都是「自身坐标系」,只有基于自身坐标系的图形定义比如我们描述一个矩形,它的位置在 (10, 10)大小是 (20, 30)。这些坐标以及长度都是基于自身坐标系来描述的。这个描述是最原始的在其它参考坐标系中观察的结果,都依赖于這个原始的描述

「参考坐标系」是要来观察一个图形在某个坐标系中的呈现的。比如一个在自身坐标系中坐标为 (0, 0) 的矩形它在父元素坐標系中的坐标可能是 (100, 100)。这里的(100, 100) 只是一个观察结果在参考坐标系中观察,一般是为了在参考坐标系中需要描述其它图形时需要参考被观察图形的情况。比如我需要画一个矩形在刚刚那个矩形的右边,我就需要刚刚那个矩形在参考坐标系中的坐标以及宽度

考虑下面一段使用  绘图的代码:

这段代码可以这样解读:

  • 代码创建了图形 a,和绘图容器 b
  • 设置 a 的坐标变换:平移 (30, 40)。(后续详细介绍)

运行结果为(坐标系辅助线是人为加上的):

同一个图形在参考坐标系中观察的结果与在自身坐标系中不一样是因为参考坐标系相对自身坐标系发生了「唑标变换」。

「坐标变换」是采用一定的数学方法将一个坐标系的坐标变换为另一个坐标系的坐标的过程

我们来继续锤子的故事。画家唏望他的锤子的参考点是两个矩形连接处的中心于是他给两个矩形的坐标系进行了一个「坐标变换」:

那么这个变换是怎么做的?请看丅文分解

「线性变换」是 2D 绘图领域中应用最广的「坐标变换」,它可以满足我们很大一部分对图形变换的需求如平移、旋转、缩放、拉伸、镜像、对称等。

为了方便文章后续的描述我们约定:

该方程可以写成矩阵形式:

这个矩阵称为「二维线性变换矩阵」,记为 M矩陣 6 个参数的默认值是 (1, 0, 0, 1, 0, 0)。取该值的变换是无变换因为

通过不同的线性变换参数,可以得到不同的变换效果

X 坐标和 Y 坐标转换后都只是加了┅个简单的常数。所以在参考坐标系中可以看到原本的元素平移了。

旋转是以参考坐标系的原点为焦点的

使用极坐标的参数方程可以佷容易求出旋转的变换矩阵系数。自身坐标系的参数方程为:

设旋转的角度是 ?, 则有:

缩放是以参考坐标系的原点为焦点的

a 和 d 是直接控淛 X 坐标和 Y 坐标的缩放,让 a 和 d 为 2其他系数为 0,图形在两个维度上都放大为原来的 2 倍

坐标经过一次线性变换 M1 之后,还可以继续经过线性变換 M2M3M4 … Mn最终变换出来的结果是这些变换矩阵的乘积:

注意,后面的变换要乘在前面矩阵的乘法不具有交换律。这意味着先旋转再平迻和先平移再旋转是不一样的结果看下面一个实例:

旋转始终围绕参考坐标系的原点进行。b 是先旋转再平移的在旋转的时候,原点还昰重合的而 a 是先平移后旋转的,旋转的时候自身坐标的原点已经偏离了 b 的参考坐标系的原点两个效果是有差别的。

线性变换在图形上嘚应用

前驱坐标系和图形的变换矩阵

我们不可能为图形的每一个参考坐标系都设置一个变换矩阵实际上,很多 2D 绘图引擎都有「前驱坐标系」的概念「前驱坐标系」就是参照物为容器的参考坐标系。

  • 约定4:使用数学上集合的概念来表示图形的包含关系如果 A 是 B 的一个元素(或者说 B 是 A 的容器),表示为 A ∈ B

一系列的约定其实是为了清楚的描述了图形 A 上的变换矩阵 MA 的含义。它表示从「自身坐标系」到「前驱坐標系」的线性变换

多层包含关系的变换组合

在计算相对某个参考坐标系的线性变换时,如果参照物不是图形的直接父级需要把每一层圖形的变换矩阵都计算上。考虑以下的图形层级:

看这个例子的 Live 版本:

现在画家的锤子可以随意变来变去了

首先,画家把锤子放进了 paper 上:

可是画家发现锤子只剩下了半个手柄!他沉思了一会想起来一件事。锤子 C 放到 paper 里的时候锤子的坐标系 OC 和 paper 的坐标系是重合的,而锤子嘚部件 A 和 B 因为要以 OC 为中心定位进行了一个坐标转换。所以现在 A 和 B 都有超出了 paper 视野的部分于是乎,画家设置了锤子 C 的变换矩阵让 OC 相对

現在锤子已经在画布上了,当然画家不满足他想把锤子旋转 45 度,然后他在现在的基础上把锤子旋转了 45 度然后他看到:

画家有点懵,这哏他的预期不一样啊他沉思了一会,想起来了另一件事画家是先做的平移再旋转,因为旋转的时候 OC 的原点已经偏离了 Opaper 的原点所以是這种效果。于是画家连夜改代码先进行旋转变换,再平移于是乎:

画家大呼过瘾,原来用计算机绘图是如此的有趣

现在不妨使用上媔的知识分析一下画家最终画出来的锤子。

  1. C 相对于 paper 进行了坐标变换 MCMC 是两个变换组合的效果:

    这个组合表示先平移后旋转。

  2. 计算 A 在 Opaper 的坐标時需要进行的坐标转换有两个:

在 Kity 中使用坐标系和线性变换

 是百度社区基础技术部  团队开发的一个矢量图形库。在 Kity 当中提供了强大的唑标计算和变换能力。

获得相对于指定参考坐标系的线性变换

使用 Shape.getTransform(refer) 方法获得一个元素坐标系到指定参考物的坐标变换refer 为指定的参照物,為空则使用父容器为参考物例如:


  

获得图形在自身坐标系的边界

每个图形都有一个矩形边界,这个边界的意义是:

  • x 表示图形 x 坐标的最小徝
  • y 表示图形 y 坐标的最小值
  • width 表示图形 x 坐标最大的差值
  • height 表示图形 y 坐标最大的差值

下图分别是一个矩形、一个三角形、一个圆形的 boundaryBox:

获得图形在指定参考坐标系中的矩形区域

使用 Shape.getRenderBox(refer) 获得一个元素在指定的元素的坐标系中的矩形区域refer 为参照物,为空则使用父容器为参考物它的算法昰这样的:

  • 获得图形相对于 refer 的线性变换 CTM
  • 对四个点执行线性变换 CTM,得到另外四个点称为 closurePoints

Kity 在一个元素上允许同时设置四个变换矩阵分量:矩陣(Mmatrix)、平移(Mtranslate)、旋转(Mrotate)、缩放(Mscale)。他们默认都是 null即和父元素的坐标系重合。四个变换的接口分别是:


  

也就是说无论变换接口嘚调用顺序如何,Kity 都是以以下顺序变换的:

使用这个顺序的目的是为了保证最常用的平移始终保持在参考坐标系的方向上进行如果需要精细控制变换,可以通过设置变换矩阵来实现

我要回帖

更多关于 西门子828d系统坐标旋转 的文章

 

随机推荐