- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在编写一些图形代码,可以实时绘制平滑、连续的曲线。我想添加对羽毛笔刷的支持。为此,我需要能够计算“法线”或垂直于构成曲线的线段的线。
纯粹的数学方法是使用反正切来找到线段的角度,旋转 90 度,然后使用正弦和余弦来找到法线的 x 和 y 偏移量。一旦我有了我的角度,就可以很容易地使用查找表来替换正弦和余弦,但要编写高性能、低精度版本的 atan2()
看起来很棘手。
我的法线(垂直线)的长度和角度不需要精确。如果它下降了十分之一,那就无所谓了。
你们中有人为这种图形工作开发了高速、粗糙的 atan2() 版本吗?为性能优化这类事情既繁琐又耗时。
我在 Swift 3 中工作,但我是“多语言”。我也很擅长集成用 C/Objective-C 编写的代码。 (或者可能将其转换为 Swift。)
编辑:
更多细节:
该项目涉及徒手绘画,如果用户快速拖动手指,它会提供一系列有时相距很远的点,并使用 Catmull-Rom splines添加中间点以创建一系列足够小的线段,它们看起来像一条平滑的曲线。
(Catmull-Rom 样条曲线是类似于更为人所知的 Bezier 曲线的曲线,但曲线的所有控制点都位于曲线上,因此可以直接平滑用户使用输入顶点“徒手”输入的曲线做平滑。)
(从现在开始我将提到“曲线”,但我真正的意思是由线段组成的折线很短,以至于它们看起来是平滑的曲线)
我已经分解了我的代码,以便我只为曲线发生变化的部分生成样条。它现在已经足够快了,并且以您可以绘制的速度创建精美平滑的曲线。主观上,似乎我正在绘制一条曲线,它会一点一点地跟随您的手指轨迹,点之间没有跳跃。
下一个目标是能够使用软边画笔进行绘画。为此,我想在用户手指轨迹的左侧和右侧找到与曲线平行的曲线。然后,我将使用 OpenGL 创建定义左右线之间粗曲线的三角形条,并使用多边形着色将曲线从不透明沿用户的手指轨迹曲线羽化为沿左右平行曲线透明。
假设我想绘制一条 6 磅厚的软边曲线。在左侧和右侧跟随用户手指轨迹的曲线都需要从用户的曲线延伸 3 个点。
我打算通过找到垂直于用户手指轨迹线段的线段来找到左右曲线端点的顶点,这些线段穿过手指轨迹的顶点,并延伸 1/用户手指轨迹左侧和右侧的 2 个所需线条粗细。
下面是当前版本程序绘制的曲线的屏幕截图,输入顶点绘制为蓝色菱形,我添加的平滑点绘制为空心方 block 。 (我减少了添加的平滑点的数量,以便您可以更好地了解发生了什么。)
想象一下通过每个顶点绘制一系列“哈希标记”,每个点长 6 个点,以这些顶点之一为中心,并垂直于以该顶点结束的平滑曲线的第一条线段。
正如 Peter O. 在他的回答中指出的那样,找到垂直于任何特定线段的线段很容易 - 您只需反转斜率即可。但是,我想要特定长度的线段。 (在我的示例中,顶点两侧各有 6 个点和 3 个点。)我正在寻找方法来做到这一点 快速 .我可以使用三角函数或平方根找出法线的端点,这两种方法都非常慢。
最佳答案
对于您的问题,如果您只想找到一条与另一条垂直的线,您甚至不需要使用 atan2
;您可以改用以下方法。设 (x1, y1) 和 (x2, y2) 为输入线段。
// Find deltas
dx=x2-x1
dy=y2-y1
// Find perpendicular vector to (dx, dy)
pdx=-dy
pdy=dx
// Normalize the vector to a unit vector
length=sqrt(pdx*pdx+pdy*pdy)
if(length!=0){
invlength=1.0/length
// Scale the vector as desired
invlength*=scale
pdx*=invlength
pdy*=invlength
}
// Now, find a line segment parallel to the vector
x2=x1+pdx
y2=y1+pdy
atan2
,我知道在
http://www.dspguru.com/dsp/tricks/fixed-point-atan2-with-self-normalization 处有一个公共(public)领域的实现.尝试这两种方法,看看哪种更适合您的目的。
atan2(dy,dx)
只是为了获得合适的角度
cos
和
sin
,您通常可以只使用归一化
(dx, dy)
的 x 和 y 分量。向量来分别获得余弦和正弦。
关于ios - 用于 C/Objective-C/Swift 的快速、粗略的 atan2() 版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41550530/
IO 设备如何知道属于它的内存中的值在memory mapped IO 中发生了变化? ? 例如,假设内存地址 0 专用于保存 VGA 设备的背景颜色。当我们更改 memory[0] 中的值时,VGA
我目前正在开发一个使用Facebook sdk登录(通过FBLoginView)的iOS应用。 一切正常,除了那些拥有较旧版本的facebook的人。 当他们按下“使用Facebook登录”按钮时,他
假设我有: this - is an - example - with some - dashesNSRange将使用`rangeOfString:@“-”拾取“-”的第一个实例,但是如果我只想要最后
Card.io SDK提供以下详细信息: 卡号,有效期,月份,年份,CVV和邮政编码。 如何从此SDK获取国家名称。 - (void)userDidProvideCreditCardInfo:(Car
iOS 应用程序如何从网络服务下载图片并在安装过程中将它们安装到用户的 iOS 设备上?可能吗? 最佳答案 您无法控制应用在用户设备上的安装,因此无法在安装过程中下载其他数据。 只需在安装后首次启动应
我曾经开发过一款企业版 iOS 产品,我们公司曾将其出售给大型企业,供他们的员工使用。 该应用程序通过 AppStore 提供,企业用户获得了公司特定的配置文件(包含应用程序配置文件)以启用他们有权使
我正在尝试将 Card.io SDK 集成到我的 iOS 应用程序中。我想为 CardIO ui 做一个简单的本地化,如更改取消按钮标题或“在此保留信用卡”提示文本。 我在 github 上找到了这个
我正在使用 CardIOView 和 CardIOViewDelegate 类,没有可以设置为 YES 的 BOOL 来扫描 collectCardholderName。我可以看到它在 CardIOP
我有一个集成了通话工具包的 voip 应用程序。每次我从我的 voip 应用程序调用时,都会在 native 电话应用程序中创建一个新的最近通话记录。我在 voip 应用程序中也有自定义联系人(电话应
iOS 应用程序如何知道应用程序打开时屏幕上是否已经有键盘?应用程序运行后,它可以接收键盘显示/隐藏通知。但是,如果应用程序在分屏模式下作为辅助应用程序打开,而主应用程序已经显示键盘,则辅助应用程序不
我在模拟器中收到以下错误: ImageIO: CGImageReadSessionGetCachedImageBlockData *** CGImageReadSessionGetCachedIm
如 Apple 文档所示,可以通过 EAAccessory Framework 与经过认证的配件(由 Apple 认证)进行通信。但是我有点困惑,因为一些帖子告诉我它也可以通过 CoreBluetoo
尽管现在的调试器已经很不错了,但有时找出应用程序中正在发生的事情的最好方法仍然是古老的 NSLog。当您连接到计算机时,这样做很容易; Xcode 会帮助弹出日志查看器面板,然后就可以了。当您不在办公
在我的 iOS 应用程序中,我定义了一些兴趣点。其中一些有一个 Kontakt.io 信标的名称,它绑定(bind)到一个特定的 PoI(我的意思是通常贴在信标标签上的名称)。现在我想在附近发现信标,
我正在为警报提示创建一个 trigger.io 插件。尝试从警报提示返回数据。这是我的代码: // Prompt + (void)show_prompt:(ForgeTask*)task{
您好,我是 Apple iOS 的新手。我阅读并搜索了很多关于推送通知的文章,但我没有发现任何关于 APNS 从 io4 到 ios 6 的新更新的信息。任何人都可以向我提供 APNS 如何在 ios
UITabBar 的高度似乎在 iOS 7 和 8/9/10/11 之间发生了变化。我发布这个问题是为了让其他人轻松找到答案。 那么:在 iPhone 和 iPad 上的 iOS 8/9/10/11
我想我可以针对不同的 iOS 版本使用不同的 Storyboard。 由于 UI 的差异,我将创建下一个 Storyboard: Main_iPhone.storyboard Main_iPad.st
我正在写一些东西,我将使用设备的 iTunes 库中的一部分音轨来覆盖 2 个视频的组合,例如: AVMutableComposition* mixComposition = [[AVMutableC
我创建了一个简单的 iOS 程序,可以顺利编译并在 iPad 模拟器上运行良好。当我告诉 XCode 4 使用我连接的 iPad 设备时,无法编译相同的程序。问题似乎是当我尝试使用附加的 iPad 时
我是一名优秀的程序员,十分优秀!