Swift实时画箭头的实现
iOS上实现画箭头,如果是指定了坐标点,那是很简单的,但如果需要做到实时绘制,就需要计算一下了
需求:
在白板上,根据手势落下点和移动点,实时绘制一条箭头直线(如下图)

实现代码:
/// 获取箭头的点位置
///
/// - Parameters:
/// - fPoint: <#fPoint description#>
/// - tPoint: <#tPoint description#>
/// - Returns: <#return value description#>
func getArrowPoint(fPoint:CGPoint,tPoint:CGPoint) -> (CGPoint,CGPoint,CGPoint) {
var p1 = CGPoint.zero //箭头点1
var p2 = CGPoint.zero //箭头点2
var p3 = CGPoint.zero //箭头最前面点
//假设箭头边长20,箭头是一个等腰三角形
let line = sqrt(pow(fabs(tPoint.x-fPoint.x), )+pow(fabs(tPoint.y-fPoint.y), ))
let arrowH:CGFloat = line> ? : line/
//线与水平方向的夹角
let angle = getAnglesWithThreePoints(p1: fPoint, p2: tPoint, p3: CGPoint(x: fPoint.x, y: tPoint.y))
let _x = CGFloat(fabs(sin(angle)))*arrowH/
let _y = CGFloat(fabs(cos(angle)))*arrowH/
//向右上角、水平向右
if tPoint.x >= fPoint.x && tPoint.y <= fPoint.y{
p1.x = tPoint.x-_x
p1.y = tPoint.y-_y p2.x = tPoint.x+_x
p2.y = tPoint.y+_y p3.x = tPoint.x+_y*
p3.y = tPoint.y-_x* }else if tPoint.x > fPoint.x && tPoint.y > fPoint.y{
//向右下角
p1.x = tPoint.x+_x
p1.y = tPoint.y-_y p2.x = tPoint.x-_x
p2.y = tPoint.y+_y p3.x = tPoint.x+_y*
p3.y = tPoint.y+_x*
}else if tPoint.x < fPoint.x && tPoint.y < fPoint.y{
//向左上角
p1.x = tPoint.x-_x
p1.y = tPoint.y+_y p2.x = tPoint.x+_x
p2.y = tPoint.y-_y p3.x = tPoint.x-_y*
p3.y = tPoint.y-_x* }else if tPoint.x < fPoint.x && tPoint.y >= fPoint.y{
//向左下角,水平向左
p1.x = tPoint.x-_x
p1.y = tPoint.y-_y p2.x = tPoint.x+_x
p2.y = tPoint.y+_y p3.x = tPoint.x-_y*
p3.y = tPoint.y+_x*
}else if fPoint.x==tPoint.x {
//竖直方向
p1.x=tPoint.x-arrowH/
p1.y=tPoint.y
p2.x=tPoint.x+arrowH/
p2.y=tPoint.y
p3.x=tPoint.x
p3.y = tPoint.y>fPoint.y ? tPoint.y+arrowH : tPoint.y-arrowH
} return (p1,p2,p3)
}
其中,获取夹角方法:getAnglesWithThreePoints
/// 计算三点之间的角度
///
/// - Parameters:
/// - p1: 点1
/// - p2: 点2(也是角度所在点)
/// - p3: 点3
/// - Returns: 角度(180度制)
func getAnglesWithThreePoints(p1:CGPoint,p2:CGPoint,p3:CGPoint) -> Double {
//排除特殊情况,三个点一条线
if (p1.x == p2.x && p2.x == p3.x) || ( p1.y == p2.x && p2.x == p3.x){
return
} let a = fabs(p1.x - p2.x)
let b = fabs(p1.y - p2.y)
let c = fabs(p3.x - p2.x)
let d = fabs(p3.y - p2.y) if (a < 1.0 && b < 1.0) || (c < 1.0 && d < 1.0){
return
}
let e = a*c+b*d
let f = sqrt(a*a+b*b)
let g = sqrt(c*c+d*d)
let r = Double(acos(e/(f*g)))
return r //弧度值 // return (180*r/Double.pi) //角度值 }
最后得到三个点,即箭头的三个点坐标

Swift实时画箭头的实现的更多相关文章
- 菱形实现气泡Bubble,菱形画箭头,菱形画三角形
菱形实现气泡Bubble,菱形画箭头,菱形画三角形 >>>>>>>>>>>>>>>>>>&g ...
- android 使用Canvas画箭头
public class MyCanvas extends View{ private Canvas myCanvas; private Paint myPaint=new Pai ...
- SVG 使用marker画箭头(一)
一.使用Marker画箭头 1.定义一个箭头的marker引用 <defs> <marker id='markerArrow' markerWidth='13' markerHeig ...
- WPF画箭头
简介 参考Using WPF to Visualize a Graph with Circular Dependencies的基础上写了一个WPF画箭头的库. 效果图如下: 使用的XAML代码如下: ...
- 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 ...
- 在matlab 画箭头
[转载]在matlab 画箭头 原文地址:在matlab 画箭头作者:纯情小郎君 完整见链接http://www.mathworks.com/matlabcentral/fx_files/14056/ ...
- Workflow:采用坐标变换(移动和旋转)画箭头
背景 流程设计器的连线部分需要画一个箭头代表连接的方向,下图是期望的效果: 刚开始我准备采用三角函数(sin和cos)来计算三角的坐标,实现的过程真不爽(有兴趣的朋友可以试试),就在完工的时候,突然想 ...
随机推荐
- codeforces 1058B - Vasya and Cornfield
<题目链接> 题目大意: 给出一个矩形,该矩形的四个顶点分别为:(0,d),(d,0),(n,n−d) and (n−d,n).然后给出一些点的坐标,分别判断这些点是否在该矩形内. 解题分 ...
- JavaScript中值类型与引用类型
JavaScript中的变量类型有哪些? 值类型:字符串(string).数值(number).布尔值(boolean).null.undefined 引用类型:对象(Object).数组(Array ...
- 一: WCF的服务端与客户端在通信时有三种模式:请求响应模式、数据报模式和双工通讯模式。
说一下基本知识, 1.如果想要将当前接口作为wcf服务器,则一定要加上[ServiceContract] 契约 2.要想将方法作为wcf服务方法发布给外部调用,则一定要加上 [Operatio ...
- C# SQLiteHelper
using System; using System.Data; using System.Data.Common; using System.Data.SQLite; using System.IO ...
- 彻底理解this 的值到底是什么?
作者:方应杭 来源:知乎 你可能遇到过这样的 JS 面试题: var obj = { foo: function(){ console.log(this) } } var bar = obj.foo ...
- [转]jQuery 选择器和dom操作
居然是12年的总结.... 文章地址: http://www.cnblogs.com/happyPawpaw/articles/2595092.html JQuery选择器 1.基本选择器 基本选择器 ...
- SPOJ COT3.Combat on a tree(博弈论 Trie合并)
题目链接 \(Description\) 给定一棵\(n\)个点的树,每个点是黑色或白色.两个人轮流操作,每次可以选一个白色的点,将它到根节点路径上的所有点染黑.不能操作的人输,求先手是否能赢.如果能 ...
- MySql基础笔记(一)Mysql快速入门
Mysql快速入门 一)基本概念 1)表 行被称为记录,是组织数据的单位.列被称为字段,每一列表示记录的一个属性. 2)主键 主键用于唯一的标识表中的每一条记录.可以定义表中的一列或者多列为主键, 但 ...
- Centos 安装lnmp完整版
1.使用putty或类似的SSH工具登录服务器: 登录后运行 screen -S lnmp 2.下载并安装LNMP一键安装包: 我是CentOS系统,所以运行: wget -c http://soft ...
- 潭州课堂25班:Ph201805201 django 项目 第三十课 linux 系统迁移 (课堂笔记)
进入虚拟环境, 冷冻 把安装环境放到这个文档中 pip freeze >> requirements.txt 在另一台机器中 pip install -r requirements.txt ...