129432f843a8cd6ffb2be286104964592e80d77c9Ken Wakasa/* 229432f843a8cd6ffb2be286104964592e80d77c9Ken Wakasa * Copyright (C) 2012 The Android Open Source Project 329432f843a8cd6ffb2be286104964592e80d77c9Ken Wakasa * 429432f843a8cd6ffb2be286104964592e80d77c9Ken Wakasa * Licensed under the Apache License, Version 2.0 (the "License"); 529432f843a8cd6ffb2be286104964592e80d77c9Ken Wakasa * you may not use this file except in compliance with the License. 629432f843a8cd6ffb2be286104964592e80d77c9Ken Wakasa * You may obtain a copy of the License at 729432f843a8cd6ffb2be286104964592e80d77c9Ken Wakasa * 829432f843a8cd6ffb2be286104964592e80d77c9Ken Wakasa * http://www.apache.org/licenses/LICENSE-2.0 929432f843a8cd6ffb2be286104964592e80d77c9Ken Wakasa * 1029432f843a8cd6ffb2be286104964592e80d77c9Ken Wakasa * Unless required by applicable law or agreed to in writing, software 1129432f843a8cd6ffb2be286104964592e80d77c9Ken Wakasa * distributed under the License is distributed on an "AS IS" BASIS, 1229432f843a8cd6ffb2be286104964592e80d77c9Ken Wakasa * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1329432f843a8cd6ffb2be286104964592e80d77c9Ken Wakasa * See the License for the specific language governing permissions and 1429432f843a8cd6ffb2be286104964592e80d77c9Ken Wakasa * limitations under the License. 1529432f843a8cd6ffb2be286104964592e80d77c9Ken Wakasa */ 1629432f843a8cd6ffb2be286104964592e80d77c9Ken Wakasa 1729432f843a8cd6ffb2be286104964592e80d77c9Ken Wakasa#ifndef LATINIME_GEOMETRY_UTILS_H 1829432f843a8cd6ffb2be286104964592e80d77c9Ken Wakasa#define LATINIME_GEOMETRY_UTILS_H 1929432f843a8cd6ffb2be286104964592e80d77c9Ken Wakasa 2029432f843a8cd6ffb2be286104964592e80d77c9Ken Wakasa#include <cmath> 2129432f843a8cd6ffb2be286104964592e80d77c9Ken Wakasa 2229432f843a8cd6ffb2be286104964592e80d77c9Ken Wakasa#include "defines.h" 2329432f843a8cd6ffb2be286104964592e80d77c9Ken Wakasa 2429432f843a8cd6ffb2be286104964592e80d77c9Ken Wakasa#define ROUND_FLOAT_10000(f) ((f) < 1000.0f && (f) > 0.001f) \ 2529432f843a8cd6ffb2be286104964592e80d77c9Ken Wakasa ? (floorf((f) * 10000.0f) / 10000.0f) : (f) 2629432f843a8cd6ffb2be286104964592e80d77c9Ken Wakasa 2729432f843a8cd6ffb2be286104964592e80d77c9Ken Wakasanamespace latinime { 2829432f843a8cd6ffb2be286104964592e80d77c9Ken Wakasa 2929432f843a8cd6ffb2be286104964592e80d77c9Ken Wakasaclass GeometryUtils { 3029432f843a8cd6ffb2be286104964592e80d77c9Ken Wakasa public: 3129432f843a8cd6ffb2be286104964592e80d77c9Ken Wakasa static inline float SQUARE_FLOAT(const float x) { return x * x; } 3229432f843a8cd6ffb2be286104964592e80d77c9Ken Wakasa 3329432f843a8cd6ffb2be286104964592e80d77c9Ken Wakasa static AK_FORCE_INLINE float getAngle(const int x1, const int y1, const int x2, const int y2) { 3429432f843a8cd6ffb2be286104964592e80d77c9Ken Wakasa const int dx = x1 - x2; 3529432f843a8cd6ffb2be286104964592e80d77c9Ken Wakasa const int dy = y1 - y2; 3629432f843a8cd6ffb2be286104964592e80d77c9Ken Wakasa if (dx == 0 && dy == 0) return 0.0f; 3729432f843a8cd6ffb2be286104964592e80d77c9Ken Wakasa return atan2f(static_cast<float>(dy), static_cast<float>(dx)); 3829432f843a8cd6ffb2be286104964592e80d77c9Ken Wakasa } 3929432f843a8cd6ffb2be286104964592e80d77c9Ken Wakasa 4029432f843a8cd6ffb2be286104964592e80d77c9Ken Wakasa static AK_FORCE_INLINE float getAngleDiff(const float a1, const float a2) { 41985b2c2e91485a0cb293bff35a80877b2be71eaeKeisuke Kuroyanagi static const float M_2PI_F = M_PI * 2.0f; 42985b2c2e91485a0cb293bff35a80877b2be71eaeKeisuke Kuroyanagi float delta = fabsf(a1 - a2); 43985b2c2e91485a0cb293bff35a80877b2be71eaeKeisuke Kuroyanagi if (delta > M_2PI_F) { 44985b2c2e91485a0cb293bff35a80877b2be71eaeKeisuke Kuroyanagi delta -= (M_2PI_F * static_cast<int>(delta / M_2PI_F)); 4529432f843a8cd6ffb2be286104964592e80d77c9Ken Wakasa } 46985b2c2e91485a0cb293bff35a80877b2be71eaeKeisuke Kuroyanagi if (delta > M_PI_F) { 47985b2c2e91485a0cb293bff35a80877b2be71eaeKeisuke Kuroyanagi delta = M_2PI_F - delta; 48985b2c2e91485a0cb293bff35a80877b2be71eaeKeisuke Kuroyanagi } 49985b2c2e91485a0cb293bff35a80877b2be71eaeKeisuke Kuroyanagi return ROUND_FLOAT_10000(delta); 5029432f843a8cd6ffb2be286104964592e80d77c9Ken Wakasa } 5129432f843a8cd6ffb2be286104964592e80d77c9Ken Wakasa 5229432f843a8cd6ffb2be286104964592e80d77c9Ken Wakasa static AK_FORCE_INLINE int getDistanceInt(const int x1, const int y1, const int x2, 5329432f843a8cd6ffb2be286104964592e80d77c9Ken Wakasa const int y2) { 5429432f843a8cd6ffb2be286104964592e80d77c9Ken Wakasa return static_cast<int>(hypotf(static_cast<float>(x1 - x2), static_cast<float>(y1 - y2))); 5529432f843a8cd6ffb2be286104964592e80d77c9Ken Wakasa } 5629432f843a8cd6ffb2be286104964592e80d77c9Ken Wakasa 5729432f843a8cd6ffb2be286104964592e80d77c9Ken Wakasa private: 5829432f843a8cd6ffb2be286104964592e80d77c9Ken Wakasa DISALLOW_IMPLICIT_CONSTRUCTORS(GeometryUtils); 5929432f843a8cd6ffb2be286104964592e80d77c9Ken Wakasa}; 6029432f843a8cd6ffb2be286104964592e80d77c9Ken Wakasa} // namespace latinime 6129432f843a8cd6ffb2be286104964592e80d77c9Ken Wakasa#endif // LATINIME_GEOMETRY_UTILS_H 62