Estou usando DragGesture().onChanged()
no SwiftUI para obter a velocidade de arrasto (um CGSize
valor), que é um vetor.
Existe uma maneira fácil de obter a magnitude do vetor CGSize sem fazer as contas manualmente?
Código simplificado que estou usando, para contexto:
Circle()
.simultaneousGesture(
DragGesture(minimumDistance: 0)
.onChanged({ tap in
print(tap.velocity) // the vector I want the magnitude of
})
)
Editar: sei que a matemática pode ser feita de maneira semelhante à abaixo, mas suspeito que essa não seja a solução ideal/com melhor desempenho:
let velocityMagnitude: Double = sqrt(pow(tap.velocity.width, 2) + pow(tap.velocity.height, 2))
A ferramenta que você deseja é
hypot
:Você está certo de que sua abordagem não tem bom desempenho, mas apenas por causa do uso de
pow
, que não é uma boa ferramenta para quadratura. Tem muita sobrecarga em comparação com uma simples multiplicação.O melhor código (se
hypot
não estivesse disponível) seria:A vantagem
hypot
além da conveniência é que ele também lida melhor com valores muito grandes e muito pequenos sem transbordar ou transbordar. Para este tipo de trabalho, isso não é grande coisa e, na verdade, fazê-lo manualmente pode ser um pouco mais rápido, pois não realizará o trabalho extra necessário para lidar com valores extremos. Mas eu recomendo usar,hypot
a menos que você tenha um forte motivo para não fazê-lo.