我将如何从接触点获取最低和最高坐标数?
Posted
技术标签:
【中文标题】我将如何从接触点获取最低和最高坐标数?【英文标题】:How would I go about getting the lowest and highest coordinate numbers from touchpoints? 【发布时间】:2021-04-26 20:36:38 【问题描述】:无论绘制的形状是什么,我都想从 touchesmoved 事件中获取最低和最高的 x 和 y 坐标。基本上我想创建一个包含形状的 cgrect 。我不知道该怎么做。
【问题讨论】:
【参考方案1】:有多种方法可以做到这一点。
UIBezierPath
有一个 bounds 方法,它会给你一个包含路径中所有点的边界矩形。如果您正在将您的形状构建为 UIBezierPath
,那么您应该只需要。
如果您需要自己跟踪边界,请设置一些变量并根据需要进行调整:
var minY = CGFloat.greatestFiniteMagnitude
var maxY = -CGFloat.greatestFiniteMagnitude
var minX = CGFloat.greatestFiniteMagnitude
var maxX = -CGFloat.greatestFiniteMagnitude
当您从用户那里收集积分时,如果x
坐标是< minX
,则更新minX
。如果是> maxX
,请更新maxX
。对minY
和maxY
执行相同操作。
一旦有了x
和y
的最大值和最小值,就可以轻松地将这些值转换为边界矩形。一些示例代码:
extension CGRect
init(minX: CGFloat,
minY: CGFloat,
maxX: CGFloat,
maxY: CGFloat)
self.init()
origin = CGPoint(x: minX, y: minY)
size = CGSize(width: maxX - minX, height: maxY - minY)
let aMinX: CGFloat = CGFloat(Int.random(in: 0...50))
let aMinY: CGFloat = CGFloat(Int.random(in: 0...50))
let aMaxX: CGFloat = CGFloat(Int.random(in: 60...200))
let aMaxY: CGFloat = CGFloat(Int.random(in: 60...200))
let aRect: CGRect = CGRect(minX: aMinX,
minY: aMinY,
maxX: aMaxX,
maxY: aMaxY)
print(aRect)
【讨论】:
感谢您的回答,但有些地方不对劲。在 touchesmoved 事件中使用此代码,每次我跟踪相同的路径时都会得到很大的不同。我意识到使用鼠标我不会精确,但跟踪图像 5 次会得到明显不同的矩形大小。(15,43,56,76)(28,9,32,55)(41,42,125,134)(5 ,4,10,71)(38,48,128,73) 想法? 我在大约 5 分钟内完成了该代码。它未经测试,仅用作您的方法的指南。 (而且我没有提供检测超过最大值/最小值的触摸的代码。)您需要对其进行测试和调试。我建议让您的测试版本在它提供的边界框周围画一个半透明的矩形,这样您就可以看到它在做什么。 看起来我使用了错误的常量作为起始值。您应该改用greatestFiniteMagnitude
和-greatestFiniteMagnitude
。我将编辑我的答案。
好的,我找到了我需要的东西,感谢您的帮助。我最终只使用了 path.bounds.size(width and height)
是的,使用路径的边界是我的第一个建议。以上是关于我将如何从接触点获取最低和最高坐标数?的主要内容,如果未能解决你的问题,请参考以下文章
matlab 如何从wind中获取股票数据 收盘 开盘 最高 最低 交易量