3

所以我有一个 UIView fallingBall,它目前与我的 UIView 很好地碰撞theBlockView。我CGRectIntersectsRect(theBlockView.frame, fallingBall.frame)用来检测这种碰撞。

这一切都很好,所以现在我希望我 fallingBall的实际上是圆的,我也希望我的顶角theBlockView是圆的。为此,我使用了以下代码:

//round top right-hand corner of theBlockView
UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:theBlockView.bounds 
                                           byRoundingCorners:UIRectCornerTopRight
                                           cornerRadii:CGSizeMake(10.0, 10.0)];
CAShapeLayer *maskLayer = [CAShapeLayer layer];
maskLayer.frame = theBlockView.bounds;
maskLayer.path = maskPath.CGPath;
theBlockView.layer.mask = maskLayer;

//round the fallingBall view
[[fallingBall layer] setCornerRadius:30];

但是,有趣的是,尽管它们看起来又漂亮又圆润,但视图仍然是矩形。所以我的问题是:我怎样才能CGRectIntersectsRect将它们视为它们看起来的形状?是否有一个功能相同但使用视图的 alpha 来检测碰撞的功能?

谢谢你的时间!

4

2 回答 2

3

其实,让我回答我自己的问题!

好的,所以我在过去 10 个小时的大部分时间里都在环顾四周,发现了这篇文章:圆形-矩形碰撞检测(交叉点) ——看看 e.James 怎么说!

我写了一个函数来帮助解决这个问题:首先,声明以下structs:

typedef struct
{
    CGFloat x; //center.x
    CGFloat y; //center.y
    CGFloat r; //radius
} Circle;
typedef struct
{
    CGFloat x; //center.x
    CGFloat y; //center.y
    CGFloat width;
    CGFloat height;
} MCRect;

然后添加以下函数:

-(BOOL)circle:(Circle)circle intersectsRect:(MCRect)rect
{

    CGPoint circleDistance = CGPointMake(abs(circle.x - rect.x), abs(circle.y - rect.y) );

    if (circleDistance.x > (rect.width/2 + circle.r)) { return false; }
    if (circleDistance.y > (rect.height/2 + circle.r)) { return false; }

    if (circleDistance.x <= (rect.width/2)) { return true; } 
    if (circleDistance.y <= (rect.height/2)) { return true; }

    CGFloat cornerDistance_sq = pow((circleDistance.x - rect.width/2), 2) + pow((circleDistance.y - rect.height/2), 2);

    return (cornerDistance_sq <= (pow(circle.r, 2)));
}

我希望这可以帮助别人!

于 2012-07-01T11:50:08.983 回答
2

CGRectIntersectsRect 将始终使用矩形,视图的框架也将始终是矩形。您将不得不编写自己的函数。您可以使用视图的中心来使用角半径计算圆,并测试矩形和圆是否以某种方式相交。

于 2012-07-01T01:34:12.533 回答