2015-01-03 2 views
2

У меня есть UIImageView, отображающее круг, разделенный на шесть равных треугольников, соответствующий:Иос: вывести угол водопроводной точки данного круга

  • area1 между 0-60 градусов
  • Area2 между> 60-120 град
  • районе3 между> 120-180 градусов
  • area4 между> 180-240 градусов
  • МАСКА5 между> 240-300 градусов
  • area6 между> 300-36 0 градусов

круг похож на следующий (простите за плохой чертеж):

enter image description here

Я хотел бы получить от точки касания, в котором площадь кран. Например, если пользователь нажимает в верхнем правом углу круга, тогда область должна быть площадью 2: «> 60-120».

Входные данные я получил это:

  • ширина и высота рамы, содержащей круг (например, 200 пикселей в ширину, 200 пикселей по высоте)
  • точки крана координаты

Любое предложение о том, как определить, в какой области падает точка отвода, учитывая входные данные, описанные выше?

+1

Я бы рекомендовал изменить это решение - http://stackoverflow.com/a/17039105/2274694 - получить угол между точкой перехода и центром кадра. –

+2

Может ли это включать использование (gasp) математики? – matt

+0

@ mm24 вы достигли вышеупомянутого эффекта против часовой стрелки, и он работает, как я пробовал, но я не могу добиться этого для эффекта по часовой стрелке. Вы можете помочь мне? –

ответ

8

Я просто заметил, что некоторые ошибки в 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; 
    } 
} 
+0

большое спасибо. Он работает отлично. Спасибо, что нашли время для редактирования комментария и решения. – mm24

+0

@ mm24 Нет проблем. :) Да, проблема на самом деле оказалась сложнее, потому что ответ, который я связывал с подразумеваемым, потому что, как я узнал через тестирование, 'atan2' может возвращать положительный или отрицательный радиан, поэтому мне пришлось учитывать это в моем' angleToPoint: ' возвращаемое значение. –

+0

@ LyndseyScott вы достигли вышеупомянутого эффекта для против часовой стрелки, и он работает, как я пробовал, но я не могу добиться этого для эффекта по часовой стрелке. Вы можете помочь мне? –

0
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 
     } 

вы получили угол в настоящее время проверить, в каком разделе он belong.You может понять это по comparision.If вы сталкиваетесь с любой проблемой, пожалуйста, сообщите я знаю.

Смежные вопросы