【问题标题】:In field of view with SpriteKit rotational coordinate system在 SpriteKit 旋转坐标系的视野中
【发布时间】:2014-11-24 04:54:56
【问题描述】:
SpriteKit 的旋转坐标系很难使用,不用说。
从数学上讲,这完全是一场灾难。
我有一个视野,x,最左边的视野是 θ+x,最右边的视野是 θ-x , θ 是精灵的 zRotation。
我如何检查一个角度是否在另一个人的视野中?
let λ be atan2(test.y - char.y, test.x - char.x)
let θ be char.zRotation
if λ in θ - x, θ + x
return true
【问题讨论】:
标签:
ios
objective-c
math
sprite-kit
trigonometry
【解决方案1】:
如果您将角度限制在 PI 和 -PI 之间,那么数学会更简单一些:
let PI=CGFloat(M_PI)
var spriteAngle:CGFloat=0
let fieldOfView:CGFloat=0.5
var targetAngle:CGFloat=0
while spriteAngle>PI {
spriteAngle=spriteAngle-2*PI
}
while spriteAngle < -PI {
spriteAngle=spriteAngle+2*PI
}
while targetAngle>PI {
targetAngle=targetAngle-2*PI
}
while targetAngle < -PI {
targetAngle=targetAngle+2*PI
}
let lowerBound=spriteAngle-fieldOfView
let upperBound=spriteAngle+fieldOfView
if lowerBound <= targetAngle && targetAngle <= upperBound {
//angle in range
}
【解决方案2】:
这是一个如何确定一个节点是否在另一个节点的视野内的示例。如果将角度转换为 [0, 2*pi),则相当简单。
// 1/2 of the field of view
#define kFieldOfViewDiv2 (M_PI/8)
// Calculate differences in x and y between the sprites
CGFloat dx = sprite2.position.x - sprite.position.x;
CGFloat dy = sprite2.position.y - sprite.position.y;
// Determine angle of sprite2 relative to sprite
CGFloat theta = atan2(dy, dx);
// Theta in [0, 2*pi)
if (theta < 0) {
theta = theta + M_PI*2;
}
// Alpha in (-2*pi, 2*pi)
CGFloat alpha = fmod(sprite.zRotation,2*M_PI);
// Alpha in [0, 2*pi)
if (alpha < 0) {
alpha = alpha + M_PI * 2;
}
// Calculate |theta-alpha|
CGFloat diff = fabs(theta-alpha);
// Handle wrap near 0 degrees
if (diff > M_PI) {
diff = 2*M_PI - diff;
}
// Field of view test
if (diff <= kFieldOfViewDiv2) {
NSLog(@"In field of view");
}