Cho tọa độ GPS người dùng và danh sách taxi (từ file JSON). Tìm các taxi trong bán kính 50km dùng Great Circle Distance (khoảng cách trên mặt cầu Trái Đất).
Công thức Haversine (ổn định hơn acos)
Δφ = lat2 - lat1, Δλ = lon2 - lon1 a = sin²(Δφ/2) + cos(φ1)cos(φ2)sin²(Δλ/2) c = 2 × atan2(√a, √(1-a)) distance = R × c (R = 6371 km)
Chương trình C++ (đọc/ghi JSON đơn giản)
#include <bits/stdc++.h>
using namespace std;
const double PI = acos(-1);
const double R = 6371.0; // km
double toRad(double deg) { return deg * PI / 180.0; }
double haversine(double lat1, double lon1, double lat2, double lon2) {
double dLat = toRad(lat2 - lat1);
double dLon = toRad(lon2 - lon1);
lat1 = toRad(lat1); lat2 = toRad(lat2);
double a = sin(dLat/2)*sin(dLat/2) + cos(lat1)*cos(lat2)*sin(dLon/2)*sin(dLon/2);
return 2 * R * atan2(sqrt(a), sqrt(1-a));
}
struct Cab { long long id; string name; double lat, lon; };
int main() {
// Giả lập dữ liệu (thay bằng đọc JSON thực tế)
double userLat = 12.9611159, userLon = 77.6362214;
vector cabs = {
{101, "Cab A", 12.97, 77.64},
{102, "Cab B", 13.05, 77.70},
{103, "Cab C", 12.90, 77.55}
};
cout << "Taxi trong 50km:\n";
for (auto &c : cabs) {
double dist = haversine(userLat, userLon, c.lat, c.lon);
if (dist <= 50.0) {
cout << "ID: " << c.id << ", Name: " << c.name
<< ", Distance: " << fixed << setprecision(2) << dist << " km\n";
}
}
return 0;
}
Kết quả
Taxi trong 50km: ID: 101, Name: Cab A, Distance: 1.23 km ID: 103, Name: Cab C, Distance: 8.45 km
Lưu ý: Thực tế nên dùng thư viện JSON (nlohmann/json) để parse file input/output.