Улучшите свой код с помощью этой простой функции для Swift!

Никто не любит математику, и это факт. Итак, что мы можем сделать, чтобы полностью исключить его из нашей жизни? Нет, это не роботы. Может быть, когда-нибудь и я напишу о них. Кто знает! Но пока вам придется довольствоваться функциями и формулами.

Готовы оставить калькуляторы в прошлом? Давайте посмотрим, как сделать тригонометрию простой для наших проектов.

Принцип

Для тех из вас, кто не слишком знаком с тригонометрией, позвольте мне процитировать самого себя из этого другого учебника как абсолютного эгоцентричного ботаника (хотя на самом деле это просто лень):

В принципе, в прямоугольном треугольнике вы можете вычислить длину сторон вашего треугольника при условии, что у вас есть хотя бы:
- градусы одного угла (в нашем случае того, который я выделил желтым),
- и размер одной из трех сторон (в нашем случае синий пунктир).
Как видно из рисунка, эту логику можно применить к невидимому кругу вокруг средней кнопки, чтобы определить положение трех кнопок (зеленых) путем вычисления значений x и y по формулам на рисунке.

Эта теория может быть полезна для любой архитектуры, включающей круги. В этом уроке, например, я объяснял, как определить положение зеленых точек на изображении, используя центр круга в качестве отправной точки, чтобы я мог использовать их в качестве центра положения трех UIButton.

Тригонометрия учит, что:

  • sin θ = противоположность / гипотенуза
  • cos θ = Смежный / Гипотенуза
  • tan θ = Противоположная/прилегающая сторона

Если вы посмотрите на рисунок выше, «θ» будет желтым углом, «x» будет смежной стороной, а «y» будет противоположной, что делает оставшуюся сторону, радиус, если хотите, гипотенузой.

Предполагая, что мы уже знаем градусы нашего угла и хотя бы одну из трех сторон, обычно гипотенузу, мы можем инвертировать формулы, чтобы найти стороны остальных сторон, обычно x и y.

Все, что нам нужно сделать, это инвертировать наши формулы:

у = грех θ * ч

у = тангенс θ * х

х = потому что θ * ч

х = у / тангенс θ

ч = х / потому что θ

ч = у / грех θ

И замените θ на наши градусы в радианах, используя следующую формулу:

θ * π / 180

Запутались в радианах? Я кое-что объяснил об этом здесь… и это все с саморекламой (но действительно энергосберегающей), которую я обещаю.

Не беспокойтесь, если вы запутались. Мне просто нужно было объяснить это, чтобы доказать, что я немного знаю, что делаю, но вы не обязаны понимать все это. Эта функция сделает все расчеты за вас, так что вам не придется мучиться, изучая все это, как это сделал я. Отблагодаришь позже.

Формула

Возможно, я недостаточно внимательно искал, но я так и не нашел функцию, которая автоматически вычисляет тригонометрию, и подумал, что это позор. Мне нравятся вещи, которые экономят мне немного энергии (например, цитирование самого себя…), поэтому я решил написать об этом!

Перейдите к последней части для полного кода, но вот мой мыслительный процесс:

Я начал с создания перечисления, называемого сегментом, взяв h за гипотенузу, y за противоположное и x за смежное в качестве значений:

enum segment {
case x
case y
case h
}

Затем я перевел упомянутые выше формулы на язык Swift:

y = tan(angle * .pi/180) * x
y = sin(angle * .pi/180) * h
x = cos(angle * .pi/180) * h
x = y / tan(angle * .pi/180)
h = x / cos(angle * .pi/180)
h = y / sin(angle * .pi/180)

Параметры, которые я бы отправил в функцию:

  • segment, где я определяю, есть ли у меня сегмент x, y или h;
  • size, где я объявляю длину данного сегмента;
  • angle, что является градусами моего угла.

Функция вернет [segment : CGFloat].

Используя оператор switch, я могу определить, какие формулы использовать:

switch segment {
   case .x: (...)
   case .y: (...)
   case .h: (...)
}

Это полный код:

Довольно аккуратно, правда? Посмотрим, работает ли это.

Тестирование

Все требует тестирования, поэтому давайте удостоверимся, что эта функция действительно выполняет свою работу, экономя время, а не просто портит наш код.

Предположим, что у нас есть треугольник со следующими размерами:

  • x: 10
  • y: 10
  • h: 14.14
  • угол: 45°

Мы должны проверить это:

  • если мы запустим calcTrig(segment: .x, size: 10, angle: 45) или
  • если мы запустим calcTrig(segment: .y, size: 10, angle: 45) или
  • если мы запустим calcTrig(segment: .h, size: 14.14, angle: 45)

результат должен быть [.x: 10, .y: 10, .h: 14.14...].

Поскольку вычисления могут давать результаты, подобные 9.99 вместо 10, или 14.14 будет длиннее, чем два десятичных знака, мы должны использовать round(CGFloat), чтобы проверить, что наш результат, по крайней мере, очень похож на ожидаемое число.

Создайте модульное тестирование, похожее на это, и запустите все тесты:

Если тестирование прошло успешно, поздравляем! Вы успешно избавили свое будущее от многих головных болей. Слава!

Вам понравилось это руководство? Хорошо ли это сработало с вашим проектом?

Want to Connect? 
Follow me on…
❤️ YouTube
💖 Dribbble
💜 Instagram
💙 Ko-Fi
🖤 GitHub