【问题标题】:iOS: derive angle of tap point given a circleiOS:在给定圆的情况下推导点的角度
【发布时间】:2017-01-30 20:02:19
【问题描述】:

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

  • 0-60 度之间的区域 1
  • area2 在>60-120 度之间
  • area3 在>120-180 度之间
  • area4 在>180-240 度之间
  • area5 在>240-300 度之间
  • area6 在>300-360 度之间

圆圈类似于以下(请原谅我画的不好):

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

我得到的输入数据是:

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

关于如何根据上述输入数据推断分接点落在哪个区域有什么建议吗?

【问题讨论】:

  • 我建议修改这个解决方案 -- stackoverflow.com/a/17039105/2274694 -- 以获取点击点和框架中心之间的角度。
  • 它可能涉及使用(喘气)数学吗?
  • @mm24 你实现了上述逆时针效果,我试过了,但我无法实现顺时针效果。你能帮我吗?

标签: ios objective-c computational-geometry


【解决方案1】:

我刚刚注意到我在 cmets 中提到的 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;
    }
}

【讨论】:

  • 非常感谢。它完美地工作。感谢您花时间编辑评论和解决方案。
  • @mm24 没问题。 :) 是的,问题实际上比我链接到的答案更复杂,因为正如我通过测试了解到的那样,atan2 可以返回正弧度或负弧度,所以我必须在我的angleToPoint: 返回中说明这一点价值。
  • @LyndseyScott 你实现了逆时针的上述效果,我试过了,但我无法实现顺时针的效果。你能帮我吗?
【解决方案2】:
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
         let touch = touches.first
         let tapPoint = touch?.location(in: self)
         let distance = distanceWithCenter(center: circleCenter,SCCenter: tapPoint!)
                if distance <= radius {
                 let angle  = angleToPoint(tapPoint: tapPoint!)
                 print(angle)
        }


func angleToPoint(tapPoint:CGPoint) -> CGFloat{
            let dx =  circleCenter.x - tapPoint.x
            let dy =  circleCenter.y - tapPoint.y
            let radians = atan2(dy, dx) + π // Angel in radian

            let degree = radians * (180 / π)  // Angel in degree
            print("angle is off = \(degree)")
            return degree
        }

你知道了角度,现在检查它属于哪个部分。你可以通过比较来弄清楚。如果你遇到任何问题,请告诉我。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多