IOS之笑脸app

ios笑脸app实现

import UIKit@IBDesignable
class FaceView: UIView {@IBInspectablevar lineWidth:CGFloat=3{didSet{setNeedsLayout()}}@IBInspectablevar color:UIColor = UIColor.blueColor(){didSet{setNeedsLayout()}}@IBInspectablevar scale:CGFloat=0.9{didSet{setNeedsLayout()}}var faceCenter:CGPoint{return convertPoint(center, fromView: superview)}var faceRadius:CGFloat{return min(bounds.size.width, bounds.size.height)/2*scale}private struct Scaling {static let FaceRadiusToEyeRadiusRatio: CGFloat = 10//大圆半径(face半径)与小圆半径(eye半径)的比率,次数越小,小圆越大.因为 下面bezierPathForEye的方法中定义 eyeRadius = faceRadius / Scaling.FaceRadiusToEyeRadiusRatiostatic let FaceRadiusToEyeOffsetRatio: CGFloat = 3//大圆与小圆的偏移率,此数越大,小圆的圆心距大圆越近static let FaceRadiusToEyeSeparationRatio: CGFloat = 1.5//两个小圆之间在大圆内的分离比率static let FaceRadiusToEyeMounthWidthRatio: CGFloat = 1static let FaceRadiusToEyeMounthHeightRatio: CGFloat = 3static let FaceRadiusToEyeMounthOffsetRatio: CGFloat = 3}private enum Eye {case Left , Right}private func bezierPathForEye(whichEye: Eye) -> UIBezierPath {//此处定义的方法为设置一只眼睛的位置,上面定义了左右眼的枚举,可通过调用.Left.Right来实现两个位置的设定let eyeRadius = faceRadius / Scaling.FaceRadiusToEyeRadiusRatio//定义小圆半径是大圆半径的几分之几,此处因为FaceRadiusToEyeRadiusRatio: CGFloat = 10 故为十分之一let eyeVerticalOffset = faceRadius / Scaling.FaceRadiusToEyeOffsetRatio//小圆的垂直偏距let eyeHorizontalSeparation = faceRadius / Scaling.FaceRadiusToEyeSeparationRatio//小圆的水平距离var eyeCenter = faceCentereyeCenter.y -= eyeVerticalOffset//此处相当于是用大圆圆心的y坐标减去小圆圆心的y坐标,故小圆圆心在大圆圆心之上.若为加,则在下switch whichEye {case .Left: eyeCenter.x -= eyeHorizontalSeparation / 2//相当于大圆圆心的x坐标减去(小圆圆心的x坐标除以2),即在大圆圆心的左侧case .Right: eyeCenter.x += eyeHorizontalSeparation / 2//此处加,即在右侧}let path = UIBezierPath(arcCenter: eyeCenter, radius: eyeRadius, startAngle: 0, endAngle: CGFloat(2*M_PI), clockwise: true) //画圆path.lineWidth = lineWidth //设定线宽return path}private func bezierPathForSmile(fractionOfMaxSmile: Double) -> UIBezierPath {let mouthWidth = faceRadius / Scaling.FaceRadiusToEyeMounthWidthRatio//大圆半径与线宽的比率,此处线宽=大圆半径let mouthHeight = faceRadius / Scaling.FaceRadiusToEyeMounthHeightRatio//mouthHeight即线的中点到圆心的距离let mouthVerticalOffset = faceRadius / Scaling.FaceRadiusToEyeMounthOffsetRatiolet smileHeight = CGFloat(max(min(fractionOfMaxSmile, 1), -1)) * mouthHeight//此处max(min(fractionOfMaxSmile, 1), -1)限定了笑脸指数只能在-1到1之间,fractionOfMaxSmile这个参数可以自行设定,如果设定的大于1,则只取1,设定小于-1,则只取-1let start = CGPoint(x: faceCenter.x - mouthWidth / 2, y: faceCenter.y + mouthVerticalOffset)  //设置起点let end = CGPoint(x: start.x + mouthWidth, y: start.y)  //设置终点let cp1 = CGPoint(x: start.x + mouthWidth / 3 , y: start.y + smileHeight) //设置曲线点1,此处mouthWidth / 3用于调节曲线的弧度let cp2 = CGPoint(x: end.x - mouthWidth / 3, y: cp1.y)  //设置曲线点2let path = UIBezierPath()path.moveToPoint(start)path.addCurveToPoint(end, controlPoint1: cp1, controlPoint2: cp2)path.lineWidth = lineWidthreturn path}override func drawRect(rect: CGRect) {let facePath=UIBezierPath(arcCenter: faceCenter, radius: faceRadius, startAngle: 0, endAngle: CGFloat(2*M_PI), clockwise: true)facePath.lineWidth=lineWidthcolor.set()facePath.stroke()bezierPathForEye(.Left).stroke()bezierPathForEye(.Right).stroke()let smiliness = 0.8let smilePath = bezierPathForSmile(smiliness)smilePath.stroke()}
}
  • IBDesignable可以在storyboard中看到自定义的uiview
  • IBInspectable使属性可以改变

利用协议与代理联结数据源

protocol FaceViewDataSource:class {func smilnessForFaceView(sender:FaceView)->Double?
}

手势识别实现缩放与改变笑脸弧度

 @IBOutlet weak var faceView: FaceView!{didSet{faceView.dataSource=selffaceView.addGestureRecognizer(UIPinchGestureRecognizer(target: faceView, action: "scale:"))//faceView.addGestureRecognizer(UIPanGestureRecognizer(target: self, action: "changeHappiness:"))}}private struct Constants{static let HappinessGestureScale:CGFloat=4}@IBAction func changeHappiness(sender: UIPanGestureRecognizer) {switch sender.state {case .Ended:fallthroughcase .Changed:let translation=sender.translationInView(faceView)let happinessChange = -Int(translation.y/Constants.HappinessGestureScale)if happinessChange != 0{happiness+=happinessChangesender.setTranslation(CGPoint.zero, inView: faceView)}default:break}}func scale(gesture:UIPinchGestureRecognizer){if gesture.state == .Changed{scale*=gesture.scalegesture.scale=1}}

源代码:Happiness

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/493883.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

15年来,自然语言处理发展史上的8大里程碑

来源:Deep Tech深科技自然语言是人类独有的智慧结晶。自然语言处理(Natural Language Processing,NLP)是计算机科学领域与人工智能领域中的一个重要方向,旨在研究能实现人与计算机之间用自然语言进行有效通信的各种理…

最短路径实现

主要工具 QGIS建立拓扑关系 Postgres存储数据表 Geoserver发布相关服务 QGIS建立拓扑关系 使用v.clean运行,并用DBManager即可以建立拓扑关系并导入数据库。 注意 QGIS2.16有数据溢出问题,使用QGIS2.14可以解决这个问题 Postgres存储数据表 导…

2019将成机器学习关键年:中美AI或有一战

作者 | Hussain Fakhruddin译者 | 大小非编辑 | Vincent 来源 | AI前线(ID:ai-front)导读:2019 年将是机器学习关键的一年。ML 已经成为全球数字转型的关键要素之一——到 2021 年底,累计投资预计将达到 580 亿美元。在企业应用领域&#xff…

深度 | IBM长文解读人工智能、机器学习和认知计算

来源:人工智能产业链联盟人工智能的发展曾经经历过几次起起伏伏,近来在深度学习技术的推动下又迎来了一波新的前所未有的高潮。近日,IBM 官网发表了一篇概述文章,对人工智能技术的发展过程进行了简单梳理,同时还图文并…

多变量线性回归

目前为止,我们探讨了单变量/特征的回归模型,现在我们对房价模型增加更多的特征, 例如房间数楼层等,构成一个含有多个变量的模型,模型中的特征为(x1,x2,…,xn) 增添更多特征后,我们引入一系列新的注释: n 代表特征的数量 x(i)代表第 i 个训练实例,是特征矩阵中的第 i 行,是一…

人工智能乌托邦 迪拜认为2071年人类应该这样生活!

来源:网易智能不同于硅谷老牌的科技力量,迪拜一直是独特的存在。他们日益崛起的科技实力正在被验证,无论是全面AI化的基础建设和城市治安力量,还是频频登上全球科技头条的机器人警察和空中出租车,迪拜试图摆脱很多人眼…

逻辑回归与正则化

在分类问题中,你要预测的变量 y 是离散的值,我们将学习一种叫做逻辑回归 (Logistic Regression) 的算法,这是目前最流行使用最广泛的一种学习算法。 在分类问题中,我们尝试预测的是结果是否属于某一个类(例如正确或错误)。分类问 题的例子有:判断一封电子邮件是否是垃圾邮件;判…

万字报告!一文看懂全球车厂的技术家底模块化平台

来源:智东西摘要:介绍模块化平台以及该平台对车企的重要意义,详解车企模块化平台布局。汽车的研发制造方式经历了手工作坊式到标准化流水线再到平台化,目前主流车企纷纷采取模块化平台方式。汽车模块化平台研发制造是指车企基于通…

西湖大学全披露:68位顶级科学家加盟,已获捐资35亿,最小捐赠者12岁

来源:量子位最终,2018年10月20日,成为了西湖大学的成立日。在刚结束的成立大会上,5名诺贝尔奖得主、70余位国内外校长及代表、近百位捐赠人齐聚。可谓少长咸集,高朋满座,生而备受期待。而且就在创立大会上&…

字体大宝库:设计师必备的专业免费英文字体

字体绝对是每一个设计非常重要的部分,设计者总是希望有最好的免费字体,以保持他们字体库的更新。所以今天我要向设计师们分享一个专业的免费英文字体集合。这些免费的字体是适用于任何类型的图形设计:Web,打印,动态图形…

神经网络学习

代价函数 首先引入一些便于稍后讨论的新标记方法: 假设神经网络的训练样本有 m 个,每个包含一组输入 x 和一组输出信号 y,L 表示神经 网络层数,Sl表示每层的 neuron 个数(SL表示输出层神经元个数),SL代表最后一层中处理 单元的个数。 将神经网络的分类定义为两种情况:二类分…

干货|深度!“人工智能+制造”产业发展研究报告

来源::腾讯研究院工业革命以后的“自动化”概念追求的是机器自动生产,本质是“机器替人”,强调在完全不需要人的情况下进行不间断的大规模机器生产;而“智能化”追求的是机器的柔性生产,本质是“人机协同”…

机器学习系统设计与建议

当我们在运用训练好了的模型来预测未知数据的时候发现有较大的误差,我们下一步可以 做什么? 1. 获得更多的训练实例——通常是有效的,但代价较大,下面的方法也可能有效,可 考虑先采用下面的几种方法。 2. 尝试减少特征的数量 3. 尝试获得更多的特征 4. 尝试增加多项式特征…

李飞飞重返斯坦福后的大动作:开启「以人为中心的AI计划」

来源:网络大数据刚刚,李飞飞宣布斯坦福开启「以人为中心的 AI 计划」(Human-Centered AI Initiative,HAI),该项目由李飞飞和斯坦福大学前教务长 John Etchemendy 共同主导,Chris Manning 也参与其中。李飞飞在 twitter…

支持向量机学习

与逻辑回归和神经网络相比,支持向量机,或者简称 SVM,在学习复杂的非线性 方程时 供了一种更为清晰,更加强大的方式 如果我们用一个新的代价函数来代替,即这条从 0 点开始的水平直线,然后是一条斜 线,像上图。那么,现在让我给这两个方程命名,左边的函数,我称之为cost1(z),同时,…

中国安防行业十年报告:产值增涨四倍!双巨头全球称雄

来源:智东西近年来,安防是一个快速增长的行业, 过去十年, 复合 17%的行业增长率证明了行业的持续性,龙头份额提升持续获得超越平均的增速。 根据历史数据, 2008 年至 2017 年, 十年内中国安防行…

聚类算法学习

聚类是一种非监督学习方法 在一个典型的监督学习中,我们有一个有标签的训练集,我们的目标是找到能够区分正 样本和负样本的决策边界,在这里的监督学习中,我们有一系列标签,我们需要据此拟合一 个假设函数。与此不同的是,在非监督学习中,我们的数据没有附带任何标签,我们拿到…

斯坦福大学:极限工况下的无人驾驶路径跟踪|厚势汽车

来源: 同济智能汽车研究所责任编辑:啜小雪文章译自 2017 年美国控制年会的会议论文原标题:Path-Tracking for Autonomous Vehicles at the Limit of Friction原作者:Vincent A. Laurense, Jonathan Y. Gohand J. Christian Gerdes…

SQLite DBHelp

c#连接SQLite SQLite这个精巧的小数据库,无需安装软件,只需要一个System.Data.SQLite.DLL文件即可操作SQLite数据库。SQLite是一个开源数据库,现在已变得越来越流行,它的体积很小,被广泛应用于各种不同类型的应用中。S…

手写数字识别实现

本文主要实现手写数字识别,利用多类逻辑回归与神经网络两种方法实现 Multi-class Classification 数据源 There are 5000 training examples in ex3data1.mat, where each training example is a 20 pixel by 20 pixel grayscale image of the digit. Each pixe…