Tag: 编程

图论同步

当然,戏剧总是在终点线。 显然,建立斜边涉及大量的数学和计算机科学技巧,但一个重要功能就是主要的// TODO ,这才是真正使游戏产生的功能,该功能可以检测玩家何时构造规则的多边形,以便我能够正确地保持得分,我保存到最后。 当然,本来不打算在发布前的最后几天将其压缩到应用程序中的,但是……好吧,这是怎么回事: 在被接受2018年AmazeFest和柏林游戏周之后,我决定以实现斜边为目标。 在这里和那里还有很多事情要做,但是我对游戏的状态感觉很好。 因此,我认为是时候清理(使用程序员的术语进行重构 )我的ShapeFinder算法,或者说是PolygonFinder算法。 我有一些工作可以检测绘制的多边形,但是,正如我去年夏天在访问慕尼黑时编写了大多数数学实用程序类,并且毫无疑问地回顾了在Englischer Gartens漫长的炎热天气之后,接着是几个巴伐利亚大小的Hofbräus,我认为我可能应该在柏林游戏节周之前及时发布一次代码。 我的临时技术是在线阵列中向后循环,并检查最后几行的长度和角度是否匹配。 很简单,对吧? 所有多边形具有匹配的边并共享相同的角度。 但是这种方法仅允许玩家通过依次绘制线条来对多边形进行评分。 这不是一个很好的算法,但它是一个占位符,并且在代码中非常孤立,所以我一直在取消其他功能,希望一旦我花了很多时间,就不会花太多时间再次刺中它。 但是现在,随着最后期限的临近,我卷起袖子并开始编码。 因此,我需要解决的问题是最佳地找到遍历我所有绘制的点和线并发现其中所有可能的形状或多边形的最佳方法。 输入图论。 当我快速阅读Minko Gechev最近在JS网络世界中的出色表现时,很明显,我扩展了标题为“ 数学背景”的部分,即图论基础。 哦,对,我记得不久前在Mathigon上看到过,等等,我不是有图论书的pdf版本吗? 我的直觉告诉我我正在做某事。 因此,我开始尽可能多地阅读有关图论的文章,​​突然间,我感到好像走进了衣柜,走进了纳尼亚。 图论中有很多很棒的东西。 欧拉的公式,不,不是那个,不是,不是,也不是那个,哦,是的,那个关于图形中的面孔的那个。 所有这些酷桥梁问题; 网络和搜索算法以及计算机科学的众多应用…但是,等等,让我们不要分心,我们在这里做几何。 那么图论如何解决我的几何问题? 好吧,还记得点和线那些纯真的几何定义吗(请参阅上一篇文章)? 事实证明,它们在图论地下世界中具有秘密的别名。 它们被称为“顶点”和“边缘”,它们共同构成了Graph帮。 而且,随着时间的流逝,每当有人创建一些很酷的几何设计时,他们也在构造一个可以应用图论规则的图。 好吧,总而言之,我花了很多个晚上试图推出自己的准深度-第一本特利-奥特曼-迪克斯特拉的递归-噩梦-多边形搜索算法,希望最终能获得更多的霍夫布鲁斯原来,我一直都坐在解决方案上。 GameplayKit的寻路工具为我们节省了很多时间,这就是为什么此游戏是为iOS制作的。 请参阅下面的文章。 用Swift编写Dijkstra算法的正确方法 剧透警报:您根本不写! medium.com 最后,我可以用由GameplayKit背后的一些了不起的工程师设计的一些漂亮的数学代替我丑陋的,不易受Hofbräu影响的解决方案(“ 如果不是漂亮,那就不是数学 ”,这也适用于编程)。 有时编写自己的解决方案很令人满意,但有时使用别人制造的锤子砸烂那些讨厌的指甲也很令人满意。 而且,一如既往,我在此过程中学到了很多东西。 这是我偶然发现的众多资源中的一些,这确实让我对数学这个令人惊讶的超酷分支感到兴奋。 图论的温和介绍 如果没有需要解决的问题,那么世界上的许多事情将永远不会存在。 medium.com 揭开深度优先搜索的神秘面纱 一旦您对不同的数据结构有了足够的了解,您就开始对自己进行思考:对,那么……是什么…… 开发到 并使用Bently-Ottmann线相交算法检查Swift算法俱乐部和多边形检测。

使用ARKit在增强现实中显示视频

首先,我要做的是浏览Pinterest来检索此特定打印件。 接下来,我裁剪了将要检测并覆盖实际视频的图像。 最后,我们将在检测到的图像上播放视频。 现在您已经创建了一个项目,让我们在资产文件夹Assets.xcassets创建一个新的AR资源组。 添加裁剪后的图像(我的图像被命名为black )并为其设置尺寸。 尺寸是我们实际的 在我们打印的照片上裁剪图像尺寸。 根据我的测量,我打印的照片约为14x15cm。 键入宽度0.14米后,Xcode会自动生成高度。 接下来,拖放将用于播放检测到的图像的视频文件。 确保在添加视频时,将其添加到我们的项目目标中。 添加代码 删除ViewController.swift所有代码,并将其替换为上面的代码。 我们在这里所做的是设置AR配置以跟踪图像并设置应用程序应跟踪的图像 。 接下来,我们将使用一种委托方法将视频添加到检测到的图像上。 当要向场景中添加节点时,委托方法会通知我们。 该节点将为空,因此我们可以自定义。 但是在我们输入新代码之前,这将是逻辑流程: 首先检测我们的应用何时在锚中添加了新节点 检查我们的锚点是否匹配ARImageAnchor ,如果匹配,则表示检测到我们的图像 创建一个包含我们的视频文件的视频节点,并将其添加到视频场景中。 调整所有必要的位置 创建一个与检测到的图像具有相同方向和大小的新平面 将我们的视频节点添加到飞机上 创建一个包含该平面的新节点 将此新节点添加为子节点 这就是我们最终的结果。 让我们运行该应用程序并查看结果! 真好! 我们的AR应用程序正在按预期运行! 但是,有一个小问题。 原始的《 Daily Prophet新闻具有循环效果,因此让我们将视频循环显示在图像上。 循环播放视频 编辑我们的代码如上。 我们已更改的是: 我们使用AVPlayer播放项目 使用AVPlayer初始化我们的video node 添加观察者,以便当播放器完成其当前项目时,重置视频并再次播放 继续运行该应用程序! 最终输出应该与我们要实现的输出非常相似!

通过Swift Package Manager生成Xcode项目

作为我使用Swift的旅程的一部分,我正在观看WWDC 2016的这段视频—“ 使用Swift开源进入服务器端 ”,并且可能是我的同事Pat提到的视频的31:36,“我经历了并创建了一个Xcode项目”。 Xcode项目的创建是为了调试Bluepic的Bluepic-Server文件夹下的服务器端代码,Bluepic是用于iOS的示例照片共享应用程序。 作为一名Swift新手,我想知道他是怎么做到的? 我开始探索各种选择,例如CMake,QT等,但没有得到我想要的东西。 注意:要快速创建,维护和监视BluePic示例,请参阅IBM Cloud Tools for Swift 在尝试Kitura( 用于 Linux(Ubuntu)上Swif t的Web框架和HTTP服务器 )时,我正在阅读Package Manager的文档,并遇到了此说明。 使用Swift快照,可以使用包管理器的支持来生成Xcode项目。 如果您的Mac上已经安装了Xcode 7.3.1或更高版本,请执行Swift快照安装步骤,最终结果应如下所示 在终端上,运行以下命令(如果尚未完成) 导出PATH = / Library / Developer / Toolchains / swift-latest.xctoolchain / usr / bin:“ $ {PATH}” 导航到终端上的BluePic-Server文件夹,然后运行以下命令以生成.XcodeProj, 迅捷包generate-xcodeproj 如果一切正常,您应该在文件夹中看到Bluepic-Server.xcodeproj文件 Vidyasagars-MacBook-Pro:Bluepic-Server VMac $ swift软件包generate-xcodeproj 克隆https://github.com/IBM-Swift/Kitura.git HEAD现在位于d643c31 IBM-Swift / Kitura#513 Changed BluePic链接 解决的版本:0.15.7 克隆https://github.com/IBM-Swift/Kitura-net.git HEAD现在位于6193ca8,通过执行更少,更长的字符转换操作来避免__CFGetConverter中的锁定瓶颈(#32) […]

为什么仍然称其为“关闭”? 快速的概念外观。

名字叫什么? 如果编程语言带有命名功能,则可以肯定地以某种方式命名了它。 可以肯定的是,语言设计师的命名目的是有目的的,因此,如果您能找到一个至关重要的“他们为什么要这样命名?”的问题,那么您可能就更了解该功能或概念了。 为什么要“关闭”? 现在的挑战是:真正找出“为什么?”问题的答案。 Swift是在公开场合开发的,通常它使人们好奇地洞悉诸如命名决策之类的事物。 但是,Swift中的闭包比Swift开源的时间更长。 既然如此,在关于为何将闭包命名为“闭包”的对话中,我真的找不到很多。 闭包语言还存在其他语言,因此也许Swift只是借用了这个名字。 但这并不能帮助我们回答将闭包命名为“闭包”的底线原因。 打开“封盖”的包装(感谢thesaurus.com!) 所以……我开始冒险一词,以帮助阐明“封闭”一词的含义。 知道“闭包是可以包含并在您的代码中使用的自包含功能块”,这是一回事。(Apple Developer Docs)但要认真地讲-为什么不直接将它们称为“函数”? 如果可以的话,让我们打开这个词。 我将“ closure”放入thesaurus.com,我认为在编程语言中最能阐明“ closure”一词的同义词包括: 从这个意义上说,“封闭”似乎传达了将某物保持在…… 封闭状态的想法。 好吧,封闭的内容是什么? 好问题! 简短的答案? 变量 。 不可避免地,如果仔细研究互联网的含义,就会遇到与上面引用的Apple类似的定义。 在我发现的各种定义中,通常会出现“捕获变量 ”或“结束变量 ”之类的短语。 这些短语似乎总是使水变得浑浊(无论如何对我而言)。 尚不清楚“捕获变量”或“结束变量”是什么意思。 直到我看到同义词,“ plug”,“ seal”,“ cork”。 然后它点击了… 想象力的例子 我希望您在Swift中使用某个功能,并且希望您将其想象为一个空游泳池。 进入您的脑海了吗? 游泳池。 空(暂时)。 在运行时,您的Swift程序会愉快地执行。 然后,在程序中有片刻会调用函数。 它开始执行,突然,水涌入池中。 一打跳水硬币也被扔入水中! 硬币代表函数创建以执行其工作的局部变量和常量。 您的函数一直执行到return关键字,并在函数返回的确切时刻开始排水。在几毫秒内 ,用巨大的力将所有水从池中吸出。 您认为池中的所有硬币会发生什么? 对于此示例,我们只说答案是“他们会费尽心机”。 这将与函数返回时在函数中声明的变量和常量通常发生的情况很好地关联。 每当函数返回时,都会从内存中清除在函数内部创建的所有变量和常量……如果可以的话,请尽一切努力。 Unleeeees… 如果在某个时候池中仍然有水,您能够潜入水中,拿走几枚硬币并将其装瓶怎么办? […]

你好三角,认识斯威夫特! (和宽色)

对于想要开发Metal的iOS开发人员而言,自然的起点是Apple的Hello Triangle演示。 它确实是金属的“ Hello World”。 它所做的只是将一个二维三角形(其角分别为红色,绿色和蓝色) MTKView到MTKView 。 顶点着色器和片段着色器几乎一样简单。 即使这样,这也是开始弄清管道各部分如何组合的好方法。 唯一的是-它是用目标C编写的。 作为Swift开发人员,我发现自己希望看到该语言的Hello Triangle版本。 因此,我决定将其转换为Swift。 (转换本身非常简单:您可以在此仓库中查看代码。) 为了使事情更加有趣,我还更新了该演示以支持宽色彩,这在Apple的生态系统中意味着使用Display P3色彩空间。 (宽色是指显示超出传统色域(称为sRGB)的颜色的能力;这是我在之前的文章中所探讨的。) 在“ Hello Triangle”中支持宽颜色在概念上很简单:不要将顶点设置为sRGB中定义的纯红色,绿色和蓝色,而是将它们设置为“ Display P3”中定义的纯红色,绿色和蓝色。 在支持该功能的设备上,三角形的角将显得更明亮,更生动。 但是作为金属新手,我觉得有些棘手。 在MacOS中, MTKView类具有可设置的colorspace属性,这大概使事情变得很简单-但在iOS中,该属性不可用。 因此,我尚不清楚我在Metal管道中的哪个位置进行调整以支持广泛的色彩。 我在这篇出色的Stack Overflow回复和相关博客文章中找到了答案。 作者解释了如何将Display P3颜色值(范围从0.0到1.0,但实际上是指比正常范围更大的颜色空间)转换为扩展的sRGB值(与标准sRGB相当,但它们可以为负或大于sRGB)。 1.0)借助矩阵变换。 确切的数学运算取决于colorPixelFormat的MTKView ,它确定在哪里应用gamma。 好的,关于伽玛:伽玛校正的要点是,在保存图像之前,色彩强度通常会通过非线性函数传递。 因为大多数图像只有256个亮度级别,并且人眼对暗色的变化非常敏感,所以伽玛功能有助于存储更多的暗度,从而牺牲了明亮的强度。 这些值随后在显示在显示器上时通过反函数传递。 由于伽玛编码不是线性的,因此在编码之前均匀分布的值(也称为压缩)在编码之后不会均匀分布。 (此博客文章对伽马校正有很好的解释。) Metal管道中可能发生很多隐式的伽玛编码和解码,并且如果您在不知道自己处于哪种状态的情况下操纵值,则事情会很快搞砸。 正如我从较早的博客文章中了解到的,当将多种颜色呈现到MTKView时,有两种处理伽玛的选项: 将您的Display P3颜色值转换为sRGB中的线性 (未编码)对应值,并允许MTKView通过选择像素格式.bgra10_xr_srgb为您应用伽玛编码。 将P3值转换为线性sRGB,然后通过选择像素格式.bgra10_xr预先在数学上.bgra10_xr应用伽玛编码。 在此演示中,这是将左角的“扩展”颜色转换为1.2249, -0.04203, -0.0196 (这是P3最红的红色,转换为线性sRGB)与将其转换为1.0930, -0.2267, -0.1501 (P3的1.0930, -0.2267, -0.1501最红的红色,是应用了gamma编码的 […]

学习Swift和iOS开发第6部分:循环

循环是重复的代码块,我们可以用来对Swift中的多个数据执行一项操作。 DRY原则指出“不要自己重复”。这是一种已存在很长时间的编码原则,但是Swift中的循环是重复代码的块。 如何使用循环是一种好习惯? 虽然循环反复重复相同的代码,但这样做是在单个循环的范围内进行的。 例如,我们可以从数组中传入数据,并且可以对该集合的每个项目执行相同的操作。 这是Swift语言非常有用的组件。 在这篇文章中,我们将学习3种流行的Swift循环类型。 让我们变得循环! 🙃 搭建游乐场 首先,如果尚未打开Xcode,请点击Create New Playground 。 给它起一个类似Loops的名称,然后单击Next 。 选择某个位置以保存此.playground文件,然后单击“ Create以保存它。 您应该看到类似以下的屏幕: 删除左侧的所有样板代码,但根据需要保留import UIKit 。 为什么要使用循环 假设我们有4名员工在公司工作。 每个员工的薪水不同: 员工1:$ 45,000 员工2:$ 100,000 员工3:$ 54,000 员工4:$ 20,000(对不起,兄弟)。 创建4个变量(每个雇员一个),并将每个变量的值设置为上面的相关薪水: 导入UIKitvar employee1Salary = 45000.0 var employee2Salary = 100000.0 var employee3Salary = 54000.0 var employee4Salary = 20000.0 我们刚刚完成了2016年第四季度,我们度过了非常成功的一年。 我们希望给每个员工加薪10%。 在您的游乐场中,键入: 导入UIKitvar employee1Salary […]

处理iOS推送通知:不太明显的一面

在Fenrir,我们的许多开发人员都有维护已存在一段时间的应用程序的经验。 由于其中一些应用程序的规模,通常需要支持较旧的iOS版本。 当您还考虑到迁移中的小错误可能会影响成千上万的人这一事实时,就必须了解代码的内容。 推送通知是由于需要设置而难以测试的技术之一。 由于推送通知已经存在了一段时间,因此本文将不讨论如何实现它们。 取而代之的是,它将尝试阐明有关推送通知的各个方面,这些方面对于新来者可能并不那么明显,或者甚至可能被某些资深人士忽略。 其中之一是实际调用每个处理程序方法的时间。 必须先正确配置两件事,然后才能接收推送通知。 设备功能 该应用必须指定其支持的功能。 要接收推送通知,必须打开“推送通知”功能。 也可以打开的另一个功能是“远程通知” 。 可以在“背景模式”组下找到该应用程序,并允许您的应用程序在后台启动,以响应其有效负载包含“内容可用”标志的通知(也称为静默通知)。 设备令牌 获取设备令牌是必要的,以便您的服务器可以使用它来通过Apple的分发系统发送通知。 可以通过调用以下方法来检索设备令牌: 它将在您的AppDelegate方法中返回适当的响应。 但是, 调用此方法的时间取决于当前设置的设备功能。 也就是说,如果您没有启用“远程通知”功能,则必须先征得用户许可才能显示警报,然后才能检索设备令牌。 但是,如果打开,则可以随时检索设备令牌。 使用以下方法可以要求用户授予许可。 在iOS 10之前,使用UIApplication方法: registerUserNotificationSettings(_ 🙂 从iOS 10开始,使用UserNotifications框架方法: requestAuthorization(options:completionHandler 🙂 setNotificationCategories(_ 🙂 经常被忽略的是实际上有两种类型的推送通知。 “警报通知” 这些通知用于警告或通知用户某些事情。 它们可以包括警报,设置徽章甚至播放特定的声音。 仅需要“推送通知”功能。 检索设备令牌之前,需要用户的许可。 它们的有效载荷与此类似(示例摘自Apple文档): { “ aps”:{ “ alert”:“您收到了电子邮件。”, “徽章”:9 “声音”:“ bingbong.aiff” }, “ acme1”:“ bar”, “ acme2”:42 } […]

Swift Ruby Python用JavaScript编写

学习新语言的技巧 有一个鲜为人知的秘密,我们在民间/流行弦乐器世界中很少披露。 我们经常对人们说:“哦,您在寻找低音吉他手吗? 好吧,我只弹吉他,所以很抱歉,我无法为您提供帮助。”,因为这是一种摆脱演出的简便方法,因为演出收费不菲甚至根本没有。 这是一个谎言,但是我们大部分时间都不会这样做,因为询问的人通常对此并不了解,因此我们不必处理任何不必要的反弹。 但事实是,大多数音乐家可以而且确实可以演奏一种以上的乐器。 尽管有时这个模因很荒谬,但这确实是我在学习JavaScript和Ruby之后完成了Swift入门在线课程(在此处找到)时的感受。 老实说,我期望我以前从未见过的东西,并且一开始会相对丢失(通常是我的默认设置)。 男孩,当我发现自己错了时,我很兴奋。 该课程以所有语言课程的入门材料开始。 我在声明变量,编写字符串,学习数据类型以及每种编程语言的所有基础知识。 我没想到这里会有太多差异,因为您可以在此材料上进行的变化非常有限。 然后,我开始编写函数。 我不得不编写一个看起来像这样的问候函数: func sayHello(name:String){ print(“你好,\(名称)!”) } sayHello(名称: 名称) 看着它,我开始注意到一些相似之处。 我仅在这三行代码中就可以看到Ruby和JavaScript的并行性。 他们是: func sayHello(){}-> JavaScript函数语法 sayHello-> 像JavaScript一样的Camel Casing print()-> 也在Ruby中找到 sayHello(name: name)->调用JavaScript或Ruby之类的函数 对我来说,这是一个真正的突破性时刻。 我不再觉得自己是从第一个方格开始,而必须在初学者阶段逐步进行。 相反,我开始觉得自己处在某种加速的轨道上。 当我将该功能的所有内容分解为最小的部分时,我意识到唯一的区别是: func vs function-> 与JavaScript略有不同 (名称:字符串)-> 不同的参数语法 print(“ Hello,\(name)!”)->不同的插值语法 本质上,我只需要学习三件事就可以在Swift中编写基本功能。 谈论能够迅速起步! 我不但不发汗,反而乐于运用我以前的知识。 我感觉: 保持差异有序: 这是我遇到的最大困难,特别是在编写全栈应用程序或执行各种不同的代码挑战时。 尽管相似之处使学习语言更加容易,但有时,微小的差异被证明是主要障碍。 例如,在Ruby和Python中编写if语句之间的区别是: 红宝石: 如果arg […]

快速提示:属性配置

如果您从事iOS开发已有一段时间,那么您会遇到大型的init和viewDidLoad()方法,如下所示: 类MyViewController:UIViewController { var collectionView:UICollectionView? 覆盖func viewDidLoad(){ super.viewDidLoad() 让layout = UICollectionViewFlowLayout() layout.scrollDirection = .horizo​​ntal collectionView = UICollectionView(frame:.zero, collectionViewLayout:布局) collectionView? .translatesAutoresizingMaskIntoConstraints = false collectionView?.isPagingEnabled = true collectionView?.backgroundColor = .clear collectionView?.showsHorizo​​ntalScrollIndicator = false view.addSubview(collectionView!) //自动版式代码… } } 由于Swift能够配置闭包内联的属性,因此我们可以做得更好。 类MyViewController:UIViewController { 让collectionView:UICollectionView = { 让flowLayout = UICollectionViewFlowLayout() flowLayout.scrollDirection = .horizo​​ntal 让collectionView = UICollectionView( 帧:.zero, collectionViewLayout:flowLayout ) collectionView.translatesAutoresizingMaskIntoConstraints = […]

使用Swift的iOS实用Firebase

该课程的原价为199美元,但在有限的时间内,您只需10.99美元即可获得完整的课程。 优惠券数量有限,请不要等待太久🙂使用下面的优惠券链接: https://www.udemy.com/practical-firebase-for-ios-using-swift/?couponCode=ILOVEFIREBASE 大家好, 在过去的几个月中,我一直在努力学习新课程“ 使用Swift的iOS实用Firebase ”。 我很高兴地宣布,该课程现已出版,可以出售。 我一直认为,学习某件事的最好方法就是去做。 适用于iOS的实用Firebase使用Swift反映了我边做边学的经验。 在本课程中,我们将创建多个实际应用程序,这些应用程序将使我们看到Firebase平台的强大功能。 让我们看一下将在本课程中构建的不同应用程序: 高水位 High Waters应用程序离我的心很近,因为它影响了我当地的休斯顿社区。 该应用程序的目的是通知用户水灾地区。 用户可以在地图上放置一个指示被淹区域的图钉。 任何人都可以看到该图钉,而无需刷新应用程序。 销的位置将保留在Firebase数据库中。 杂货应用 Grocery App是一款偶像应用程序,用于了解Firebase中的父子关系。 该应用程序还向用户介绍了Firebase身份验证系统,该系统允许用户使用自己的自定义凭据进行注册和登录。 用户能够创建新的购物清单,然后将项目添加到购物清单。 根据用户的凭据,每个购物清单与杂货一起保留。 WhatsUp聊天 诸如WhatsApp,Facebook Messenger,微信,Viber等聊天应用程序已成为我们社会不可或缺的一部分。 在本节中,我们将构建一个名为“ WhatsUp”的完整聊天应用程序。 WhatsUp聊天应用程序将允许用户向聊天室中的其他用户发送文本消息和照片。 本节将向您介绍JSQMessagesViewController,它使创建类似聊天的界面变得很容易。 学生还将学习如何使用Firebase存储将照片上传到Firebase平台。 我对本课程感到非常兴奋,希望您会喜欢学习并将Firebase与iOS应用程序集成。 该课程的原价为199美元,但在有限的时间内,您只需10.99美元即可获得完整的课程。 优惠券数量有限,请不要等待太久🙂使用下面的优惠券链接: https://www.udemy.com/practical-firebase-for-ios-using-swift/?couponCode=ILOVEFIREBASE 看完课程后,请给它评分并复习。 您的评分非常重要,它有助于添加更多内容并支付账单😉 谢谢, Azam