This commit is contained in:
GcsSloop
2016-08-30 03:21:34 +08:00
parent e3238a2284
commit 81f66e9e37

View File

@@ -410,14 +410,14 @@ boolean setPolyToPoly (
int srcIndex, // 原始数组开始位置 int srcIndex, // 原始数组开始位置
float[] dst, // 目标数组 dst [x,y],存储内容为一组点 float[] dst, // 目标数组 dst [x,y],存储内容为一组点
int dstIndex, // 目标数组开始位置 int dstIndex, // 目标数组开始位置
int pointCount) // 要使用点的数量 取值范围是: 0到4 int pointCount) // 测控点的数量 取值范围是: 0到4
``` ```
Poly全称是Polygon多边形的意思了解了意思大致就能知道这个方法是做什么用的了应该与PS中自由变换中的扭曲有点类似。 Poly全称是Polygon多边形的意思了解了意思大致就能知道这个方法是做什么用的了应该与PS中自由变换中的扭曲有点类似。
![](http://ww1.sinaimg.cn/large/005Xtdi2jw1f71ppx7q0lg30go0b44ga.gif) ![](http://ww1.sinaimg.cn/large/005Xtdi2jw1f71ppx7q0lg30go0b44ga.gif)
> 从参数我们可以了解到setPolyToPoly最多可以支持4个点也就是图形的四个角,可以通过这四个角将视图从矩形变换成其他形状。 > 从参数我们可以了解到setPolyToPoly最多可以支持4个点这四个点通常为图形的四个角,可以通过这四个角将视图从矩形变换成其他形状。
简单示例: 简单示例:
@@ -480,13 +480,13 @@ public class MatrixSetPolyToPolyTest extends View {
| pointCount | 摘要 | | pointCount | 摘要 |
| :--------: | --------------------- | | :--------: | ---------------------- |
| 0 | 相当于`reset` | | 0 | 相当于`reset` |
| 1 | 相当于`translate` | | 1 | 相当于`translate` |
| 2 | 可以 缩放、旋转、平移 变换 | | 2 | 可以进行 缩放、旋转、平移 变换 |
| 3 | 可以 缩放、旋转、平移、错切 变换 | | 3 | 可以进行 缩放、旋转、平移、错切 变换 |
| 4 | 可以 缩放、旋转、平移、错切以及任何形变 | | 4 | 可以进行 缩放、旋转、平移、错切以及任何形变 |
> 从上表我们可以观察出一个规律, 随着`pointCount`数值增大setPolyToPoly的可以操作性也越来越强这不是废话么可调整点数多了能干的事情自然也多了。 > 从上表我们可以观察出一个规律, 随着`pointCount`数值增大setPolyToPoly的可以操作性也越来越强这不是废话么可调整点数多了能干的事情自然也多了。
> >
@@ -498,17 +498,17 @@ public class MatrixSetPolyToPolyTest extends View {
作为开发人员,写出来的代码出了要让机器"看懂",没有歧义之外,最重要的还是让人看懂,以方便后期的维护修改,从上边的表格中可以看出,前面的几种种情况都可以有更直观的替代方法,只有四个参数的情况下的特殊形变是没有替代方法的。 作为开发人员,写出来的代码出了要让机器"看懂",没有歧义之外,最重要的还是让人看懂,以方便后期的维护修改,从上边的表格中可以看出,前面的几种种情况都可以有更直观的替代方法,只有四个参数的情况下的特殊形变是没有替代方法的。
**测控点选取位置?**
测控点可以选择任何你认为方便的位置只要src与dst一一对应即可。不过为了方便通常会选择一些特殊的点 图形的四个角,边线的中心点以及图形的中心点等。**不过有一点需要注意,测控点选取都应当是不重复的(src与dst均是如此),如果选取了重复的点会直接导致测量失效,这也意味着,你不允许将一个方形(四个点)映射为三角形(四个点,但其中两个位置重叠),但可以接近于三角形。**。
**控制点的选取和作用范围** **作用范围?**
控制点你可以选择任何位置,不过为了便于理解和使用,一般会选择特殊点,例如:图形的四个角,边线的中心点以及图形的中心点,当然了,只要是你觉得方便的点都可以选取。不过有一点需要注意,**选取点和映射点都应当是不重复的,如果选取了重复的点会直接导致测量失效,这也意味着,你不允许将一个方形映射为三角形(可以接近于三角形)** 作用范围当然是设置了Matrix的全部区域如果你将这个Matrix赋值给了Canvas它的作用范围就是整个画布如果你赋值给了Bitmap它的作用范围就是整张图片
关于作用范围当然是设置了Matrix的全部范围如果你将这个Matrix赋值给了Canvas它的作用范围就是整个Canvas如果你赋值给了Bitmap它的作用范围就是整张图片。但是如果你仅仅测量并改变了图片的一部分那么剩余的部分也会改变不过并不推荐这么做因为这样做你可能会得到一些异常的结果这是底层逻辑导致的由于其是根据你选取的映射区域来反向推导构建出来的Matrix所以在你选取的区域直接结果是没有问题的但在区域之外的结果可能与你想要的会存在差别。
***** *****
**以下示例的src均为图片大小dst根据手势变化。** **一下用示例演示一下,所有示例的src均为图片大小dst根据手势变化。**
**pointCount为0** **pointCount为0**
@@ -521,7 +521,7 @@ if (0 == count) {
} }
``` ```
![](http://ww4.sinaimg.cn/large/005Xtdi2jw1f7b7v5z6k3g308c0cxdg6.gif)
**pointCount为1** **pointCount为1**
@@ -536,17 +536,29 @@ if (1 == count) {
> 平移的距离是dst - src. > 平移的距离是dst - src.
当测控点为1的时候由于你只有一个点可以控制所以你只能拖拽着它在2D平面上滑动。
![](http://ww3.sinaimg.cn/large/005Xtdi2jw1f7b7vp3id5g308c0cxdyx.gif)
**pointCount为2** **pointCount为2**
当pointCount为2的时候可以做缩放、平移和旋转,对于这两个控制点 当pointCount为2的时候可以做缩放、平移和旋转
![](http://ww2.sinaimg.cn/large/005Xtdi2jw1f7b7w51e52g308c0cxx2k.gif)
**pointCount为3**
魔力不足,正在蓄力中... 当pointCount为3的时候可以做缩放、平移、旋转和错切。
![](http://ww4.sinaimg.cn/large/005Xtdi2jw1f7b7x5mxnug308c0cxwnz.gif)
**pointCount为4**
当pointCount为4的时候你可以将图像拉伸为任意四边形。
![](http://ww1.sinaimg.cn/large/005Xtdi2jw1f7b7ygigbrg308c0cxaks.gif)
上面已经用图例比较详细的展示了不同操控点个数的情况,如果你依旧存在疑问,可以获取代码自己试一下。
#### 2.setRectToRect #### 2.setRectToRect