iOS:在给定圆的情况下推导出轻敲点的角度

标签 ios objective-c computational-geometry

我有一个 UIImageView 显示一个分成六个相等三角形的圆,对应于:

  • area1 在 0-60 度之间
  • area2 在>60-120 度之间
  • area3 在>120-180 度之间
  • area4 在>180-240 度之间
  • area5 between>240-300度
  • area6 between>300-360度

圆形类似于下图(画的不好请见谅):

enter image description here

我想从触摸点得出水龙头所在的区域。例如,如果用户点击圆圈的右上角,则该区域应为区域 2:“>60-120”。

我得到的输入数据是:

  • 包含圆圈的框架的宽度和高度(例如 200 像素宽,200 像素高)
  • 点击点坐标

关于如何根据上述输入数据推断出点击点落在哪个区域的任何建议?

最佳答案

我刚刚注意到 this solution 中的一些错误我在评论中提到过,但这通常是您所需要的...

我建议获取你的点击点和你的圆圈框架中心之间的角度,然后实现一个 getArea 函数来获取你的圆圈内点击的特定区域,例如:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{
    UITouch *touch = [touches anyObject];
    CGPoint tapPoint = [touch locationInView:self.view];
    CGFloat angle = [self angleToPoint:tapPoint];

    int area = [self sectionForAngle:angle];
}

- (float)angleToPoint:(CGPoint)tapPoint
{
    int x = self.circle.center.x;
    int y = self.circle.center.y;
    float dx = tapPoint.x - x;
    float dy = tapPoint.y - y;
    CGFloat radians = atan2(dy,dx); // in radians
    CGFloat degrees = radians * 180 / M_PI; // in degrees

    if (degrees < 0) return fabsf(degrees);
    else return 360 - degrees;
}

- (int)sectionForAngle:(float)angle
{
    if (angle >= 0 && angle < 60) {
        return 1;
    } else if (angle >= 60 && angle < 120) {
        return 2;
    } else if (angle >= 120 && angle < 180) {
        return 3;
    } else if (angle >= 180 && angle < 240) {
        return 4;
    } else if (angle >= 240 && angle < 300) {
        return 5;
    } else {
        return 6;
    }
}

关于iOS:在给定圆的情况下推导出轻敲点的角度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27759116/

相关文章:

objective-c - Cocoa:从文件加载的 AVAsset 有 0 个轨道

c++ - 搜索具有最小矩形长度和的一组点。算法是什么?

algorithm - 给定一组点,找出是否存在从这些点出发的凸四边形,除此之外没有其他点,那么它的角在里面

ios - 在请求中添加用户信息

ios - Swift 中的属性类型转换 : good practice

ios - 如何使用 xib 文件正确创建自定义单元格、注册并加载它?

ios - 如何在 ios 中显示指向应用程序沙箱的文件选择器?

IOS5 iPad 弹出 Controller 委托(delegate)不向父 Controller 发送消息

ios - UIImpactFeedbackGenerator impactOccurred Slight Delay

c# - 顺时针排序点列表