这个数学不是特定于平台的,我会 Select 任何语言作为答案.这很难解释我为什么要这么做,但我会try 包括图片.
我有一个视图(视图a),它将 map 作为容器覆盖.这样做的目的是在用户拖动 map 时,包含我们的内容,同时保持固定在 map 上.该视图有一个坐标系,其原点位于屏幕左上角.这将是我们的绝对坐标系,我们试图在这里转换位置.
接下来,我们将在视图a和屏幕上可见内容的交点处形成一个矩形.在我看来,我通过以下特性实现了这一点:
var visibleRect: CGRect {
guard let superview = self.superview?.superview else {
return CGRect(x: 0, y: 0, width: 0, height: 0)
}
// Convert the superview's coordinate system to the current view's coordinate system and find the intersecting rectangle. This is so we don't have to render excessive particles.
let val = self.bounds.intersection(
self.convert(superview.frame, from: superview)
)
return val
}
这将返回一个相对于视图A原点的矩形.这个矩形的目的是金属视图不能太大,因此我将金属视图限制为仅在可见范围内绘制,同时保持金属视图相对于视图A绘制位置的精确坐标.
100
下面是我一直想说的:金属顶点函数有一个中心坐标系,在整个宽度和高度范围内从-1
到1
,如下图所示(除了我只在二维空间中使用它,所以忽略z位置):
现在我的问题是:
如果我在金属视图的左上象限找到一个点(-0.002,0.5),我将如何利用给定的信息找到它在视图a中的位置?我如何将点在视图中的位置返回到金属视图,以说明相对定位的矩形?
视力的
下面是一个希望澄清的视觉效果:
编辑
如果金属视图占据了视图A的整个范围,我可以通过以下文本代码将视图A转换为金属视图:
def normalizedToViewA(x, y):
x *= 1.0
y *= -1.0
x += 1.0
y += 1.0
return ((x / 2.0) * width, (y / 2.0) * height)
def viewAToNormalized(x, y):
normalizedX = x / (width / 2.0)
normalizedY = y / (height / 2.0)
normalizedX -= 1.0
normalizedY -= 1.0
normalizedX *= 1.0
normalizedY *= -1.0
return (normalizedX, normalizedY)
但现在我需要计算,就好像金属视图填充了矩形,而矩形只是视图a的一部分.