Workflow:采用坐标变换(移动和旋转)画箭头
背景
流程设计器的连线部分需要画一个箭头代表连接的方向,下图是期望的效果:

刚开始我准备采用三角函数(sin和cos)来计算三角的坐标,实现的过程真不爽(有兴趣的朋友可以试试),就在完工的时候,突然想到了很早之前看过一本书《flash动画编程》,一下子有所顿悟,当时书中好像讲到了坐标变换,下面贴出采用坐标变换后的实现。
思路
- 先画出下图中的第一个三角。
- 旋转第一个三角的坐标得到第二个三角。
- 移动第二个三角的坐标得到第三个三角。

实现
/**
* 创建箭头坐标数组。
*
* @public
* @param {Object} end 顶点坐标
* @param {Number} angle 箭头角度
* @param {Number} angle 箭头长度
* @return {Array} 箭头坐标数组
*/
createArrawPoints: function (end, angle, length) {
var me = this; var tan = Math.tan(75 * Math.PI / 180);
var size = length / tan; var points = [
{
x: 0,
y: 0
},
{
x: -length,
y: -size
},
{
x: -length,
y: size
}
]; points = this.rotate(points, angle); return this.move(points, end);
}, /**
* 坐标批量移动。
*
* @public
* @param {Array} points 坐标数组
* @param {Object} to 移动后的中心坐标
* @return {Array} 移动后的坐标数组
*/
move: function (points, to) {
var me = this; return Ext.Array.map(points, function (point) {
return {
x: to.x + point.x,
y: to.y + point.y
};
});
}, /**
* 坐标批量旋转。
*
* @public
* @param {Array} points 坐标数组
* @param {Number} angle 角度
* @return {Array} 旋转后的坐标数组
*/
rotate: function (points, angle) {
var me = this; var cos = Math.cos(angle);
var sin = Math.sin(angle); return Ext.Array.map(points, function (point) {
return {
x: cos * point.x - sin * point.y,
y: cos * point.y + sin * point.x
};
});
},
设计器效果

备注
初中数学解决了大问题,有机会想好好再温习一下数学知识。
Workflow:采用坐标变换(移动和旋转)画箭头的更多相关文章
- android 使用Canvas画箭头
		public class MyCanvas extends View{ private Canvas myCanvas; private Paint myPaint=new Pai ... 
- WPF画箭头
		简介 参考Using WPF to Visualize a Graph with Circular Dependencies的基础上写了一个WPF画箭头的库. 效果图如下: 使用的XAML代码如下: ... 
- canvas实现跟随鼠标旋转的箭头
		<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <meta ht ... 
- 菱形实现气泡Bubble,菱形画箭头,菱形画三角形
		菱形实现气泡Bubble,菱形画箭头,菱形画三角形 >>>>>>>>>>>>>>>>>>&g ... 
- Swift实时画箭头的实现
		iOS上实现画箭头,如果是指定了坐标点,那是很简单的,但如果需要做到实时绘制,就需要计算一下了 需求: 在白板上,根据手势落下点和移动点,实时绘制一条箭头直线(如下图) 实现代码: /// 获取箭头的 ... 
- SVG 使用marker画箭头(一)
		一.使用Marker画箭头 1.定义一个箭头的marker引用 <defs> <marker id='markerArrow' markerWidth='13' markerHeig ... 
- canvas画箭头demo
		效果图: 代码: <!DOCTYPE html> <html> <title>canvas画箭头demo</title> <body> &l ... 
- D2D画箭头的例子
		原文:D2D画箭头的例子 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/sunnyloves/article/details/50830102 用处 ... 
- 如何用CorelDRAW画箭头?
		CorelDRAW,简称为cdr,是一款专业的矢量绘图软件,在设计界也是常用的专业设计之一,在日常的设计工作中,我们常常需要绘制一些特殊的图形,比如箭头.很多对cdr不是特别熟练的小伙伴不知道如何用c ... 
随机推荐
- Linux 基础——常用的Linux网络命令
			一.学Linux网络命令有什么好处 网络的出现,我们的生活更方便了,处理事情的效率也越来越高,也可以看到全世界文化的差异.同时我们接受新事物的信息越来越来强,新事物的信息也越来越来多.网络对于我们尔等 ... 
- LoadRunner中InvokeMethod failure: 外部组件发生异常解决办法
			-82801 abnormal termination,caused by mdrv process termination -29996 error:process mmdrv.exe was no ... 
- ubuntu 系统提示升级失败,boot空间不足
			系统提示升级失败,boot空间不足,解决方法: linux 随着系统的升级,会自动攒下好几个内核 执行 uname -a 看下自己当前启动的是哪个内核 dpkg --get-selections |g ... 
- linux 把ls -R格式化成树状结构
			谁能写脚本把linux中的ls -R命令的结果格式化成树状结构? 最好是shell脚本!欢迎讨论! 参与讨论有可能意外获取iPhone6哦~~ 
- functools.wraps     带参数的装饰器     多个装饰器装饰同一个函数
			装饰器开发原则 : 开放封闭原则装饰器的作用 :在不改变原函数的调用方式的情况下,在函数的前后添加功能装饰器的本质 : 闭包函数 def wrapper(func): def inner(*args, ... 
- android 同一个service启动之后 能不能被绑定bind
			韩梦飞沙 韩亚飞 313134555@qq.com yue31313 han_meng_fei_sha 可以 startService 启动了一个服务,这个服务可以再调用 bindServic ... 
- 【BZOJ 4070】【APIO 2015】雅加达的摩天楼
			http://www.lydsy.com/JudgeOnline/problem.php?id=4070 分块建图. 对每个\(P_i\)分类讨论,\(P_i>\sqrt N\)则直接连边,边数 ... 
- 求矩阵中各列数字的和    Exercise08_01
			import java.util.Scanner; /** * @author 冰樱梦 * 时间:2018年12月 * 题目:求矩阵中各列数字的和 * */ public class Exercise ... 
- DP练习 最长上升子序列nlogn解法
			openjudge 百练 2757:最长上升子序列 总时间限制: 2000ms 内存限制: 65536kB 描述 一个数的序列bi,当b1 < b2 < ... < bS的时候, ... 
- JDK源码(1.7) -- java.util.Deque<E>
			java.util.Deque<E> 源码分析(JDK1.7) -------------------------------------------------------------- ... 
