// // Open Service Platform // Copyright (c) 2012 Samsung Electronics Co., Ltd. // // Licensed under the Apache License, Version 2.0 (the License); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // /** * @file FLoc_MathUtils.cpp * @brief This is the implementation file for _MathUtils class. * * This file contains implementation of _MathUtils class. */ #include #include #include #include #include #include "FLoc_MathUtils.h" #include "FLoc_RegionInfo.h" using namespace Tizen::Base::Utility; using namespace Tizen::Base; namespace Tizen { namespace Locations { const double _MathUtils::PI = M_PI; const double _MathUtils::PI2 = 2.0 * _MathUtils::PI; const double _MathUtils::DEG2RAD = _MathUtils::PI / 180.0; const double _MathUtils::RAD2DEG = 180.0 / _MathUtils::PI; const double _MathUtils::HALFPI = 1.5707963267948966; const double _MathUtils::CENTRE_LATITUDE = 0.0; double _MathUtils::CalculateOverlapRegion(const _RegionInfo& region, const Location& location) { double overlapArea = 0; double distanceBtwCenters = region.GetCoordinate().GetDistanceTo(location.GetCoordinates()); double regionRadius = region.GetRadius(); double locationRadius = location.GetHorizontalAccuracy(); double distanceBtwCentersSqr = distanceBtwCenters * distanceBtwCenters; double regionRadiusSqr = regionRadius * regionRadius; double locationRadiusSqr = locationRadius * locationRadius; // The circles are overlapping if (distanceBtwCenters <= Math::Abs(regionRadius - locationRadius)) { overlapArea = locationRadius > regionRadius ? Math::GetPi() * regionRadiusSqr : Math::GetPi() * locationRadiusSqr; } else { double theta = Math::Acos((regionRadiusSqr + distanceBtwCentersSqr - locationRadiusSqr) / (2 * regionRadius * distanceBtwCenters)); double phi = Math::Acos((locationRadiusSqr + distanceBtwCentersSqr - regionRadiusSqr) / (2 * locationRadius * distanceBtwCenters)); overlapArea = regionRadiusSqr * (theta - Math::Sin(theta) * Math::Cos(theta)) + locationRadiusSqr * (phi - Math::Sin(phi) * Math::Cos(phi)); } return overlapArea; } double _MathUtils::GetShortestDistance(const Location& location, const Tizen::Base::Collection::IList& regionList) { double minDistance = Double::GetMaxValue(); int count = regionList.GetCount(); for (int i = 0; i < count; i++) { const _RegionInfo* pRegionInfo = static_cast< const _RegionInfo* >(regionList.GetAt(i)); if (pRegionInfo) { Coordinates regionCoordinate = pRegionInfo->GetCoordinate(); double distance = abs(regionCoordinate.GetDistanceTo(location.GetCoordinates()) - pRegionInfo->GetRadius()); if (minDistance > distance) { minDistance = distance; } } } SysSecureLog(NID_LOC, "Shortest distance from location (lat: %lf and lon: %lf) to the nearest region boundary is (%lf) meters", location.GetCoordinates().GetLatitude(), location.GetCoordinates().GetLongitude(), minDistance); return minDistance; } } } // Tizen::Locations