Jon*_*ton 20 cocos2d-iphone ios
我有2个物体,当我移动一个物体时,我想从另一个物体获得角度.
例如:
Object1X = 211.000000, Object1Y = 429.000000
Object2X = 246.500000, Object2Y = 441.500000
Run Code Online (Sandbox Code Playgroud)
我在阳光下尝试过以下各种变化:
double radians = ccpAngle(Object1,Object2);
double degrees = ((radians * 180) / Pi);
Run Code Online (Sandbox Code Playgroud)
但我只是得到2.949023返回我想要45度等的东西.
Tom*_*ess 45
这个其他答案有帮助吗?
我写得像这样:
- (CGFloat) pointPairToBearingDegrees:(CGPoint)startingPoint secondPoint:(CGPoint) endingPoint
{
CGPoint originPoint = CGPointMake(endingPoint.x - startingPoint.x, endingPoint.y - startingPoint.y); // get origin point to origin by subtracting end from start
float bearingRadians = atan2f(originPoint.y, originPoint.x); // get bearing in radians
float bearingDegrees = bearingRadians * (180.0 / M_PI); // convert to degrees
bearingDegrees = (bearingDegrees > 0.0 ? bearingDegrees : (360.0 + bearingDegrees)); // correct discontinuity
return bearingDegrees;
}
Run Code Online (Sandbox Code Playgroud)
运行代码:
CGPoint p1 = CGPointMake(10, 10);
CGPoint p2 = CGPointMake(20,20);
CGFloat f = [self pointPairToBearingDegrees:p1 secondPoint:p2];
Run Code Online (Sandbox Code Playgroud)
这将返回45.
希望这可以帮助.
bsh*_*ley 12
我修改了@tomas的解决方案以简化.很可能(这对我来说)这个数学将被频繁调用.
在我的化身中,你必须自己执行两点之间的差异(或者如果你很幸运,(0,0)已经是你的一个点).计算的值是从(0,0)开始的点的方向.是的,这很简单,如果你真的想要,你可以内联它.我更喜欢更易读的代码.
我还将它转换为函数调用:
CGFloat CGPointToDegree(CGPoint point) {
// Provides a directional bearing from (0,0) to the given point.
// standard cartesian plain coords: X goes up, Y goes right
// result returns degrees, -180 to 180 ish: 0 degrees = up, -90 = left, 90 = right
CGFloat bearingRadians = atan2f(point.y, point.x);
CGFloat bearingDegrees = bearingRadians * (180. / M_PI);
return bearingDegrees;
}
Run Code Online (Sandbox Code Playgroud)
如果您不想要负值,则需要自行转换.负值对我来说没问题 - 不需要进行不必要的计算.
我在cocos2d环境中使用它,这就是我所说的:(在数学上,我们正在平移平面以产生p0原点.因此p0从p1(p0- p0= {0,0})中减去.当平面是角度时,角度不变翻译.)
CGPoint p0 = self.position;
CGPoint p1 = other.position;
CGPoint pnormal = ccpSub(p1, p0);
CGFloat angle = CGPointToDegree(pnormal);
Run Code Online (Sandbox Code Playgroud)
ccpSub 由cocos2d提供,它是一个元组的减法 - 你可以自己做,如果你没有那个
除此之外:使用CG___命名方案将上述方法命名为通常不礼貌的方式,该方案将函数标识为部分CoreGraphics- 因此,如果要将其重命名为MyConvertCGPointToBearing()或者FredLovesWilma()您应该这样做.
Log*_*gan 10
以下是我在Swift中为感兴趣的人做的事情,它是基于@bshirley上面的回答w /一些修改来帮助匹配calayer旋转系统:
extension CGPoint {
func angle(to comparisonPoint: CGPoint) -> CGFloat {
let originX = comparisonPoint.x - self.x
let originY = comparisonPoint.y - self.y
let bearingRadians = atan2f(Float(originY), Float(originX))
var bearingDegrees = CGFloat(bearingRadians).degrees
while bearingDegrees < 0 {
bearingDegrees += 360
}
return bearingDegrees
}
}
extension CGFloat {
var degrees: CGFloat {
return self * CGFloat(180.0 / M_PI)
}
}
Run Code Online (Sandbox Code Playgroud)
这提供了这样的坐标系:
270
180 0
90
Run Code Online (Sandbox Code Playgroud)
用法:
point.angle(to: point2)
CGPoint.zero.angle(to: CGPoint(x: 0, y: 1)) // 90
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
27321 次 |
| 最近记录: |