gpt4 book ai didi

objective-c - Cocoa iOS 通过碰撞将矩形变成圆形

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:23:44 25 4
gpt4 key购买 nike

所以我有一个名为 fallingBall 的 UIView,它当前与名为 theBlockView 的 UIView 很好地碰撞。我正在使用 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];

但是,有趣的是,虽然它们看起来漂亮且圆润,但 View 仍然是矩形。所以我的问题是:如何让 CGRectIntersectsRect 将它们视为它们看起来像的形状?是否有功能相同但使用 View 的 alpha 来检测碰撞的函数?

感谢您的宝贵时间!

最佳答案

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

好的,所以我花了过去 10 个小时的大部分时间四处看看,然后我看到了这篇文章:Circle-Rectangle collision detection (intersection) - 看看 e.James 怎么说!

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

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)));
}

我希望这对某人有帮助!

关于objective-c - Cocoa iOS 通过碰撞将矩形变成圆形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11278790/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com