Мне нужно создать функцию, которая с учетом a
, b
и c
возвращает логическое значение, указывающее, находится ли c
в пределах a
и b
.
Все переменные имеютследующий тип:
type Coordinate = {
lat: number;
lon: number;
};
Я нашел решение, которое изначально было правильным, но после тестирования с помощью Google Maps я обнаружил, что это неправильно.
Функция:
function inBoundingBox(
bottomLeft: Coordinate,
topRight: Coordinate,
point: Coordinate
) {
let isLongInRange: boolean;
if (topRight.lon < bottomLeft.lon) {
isLongInRange = point.lon >= bottomLeft.lon || point.lon <= topRight.lon;
} else {
isLongInRange = point.lon >= bottomLeft.lon && point.lon <= topRight.lon;
}
return (
point.lat >= bottomLeft.lat && point.lat <= topRight.lat && isLongInRange
);
}
Один пример, который должен работать:
const topRight: Coordinate = {
lat: -23.5273,
lon: -46.833881
};
const bottomLeft: Coordinate = {
lat: -23.537519,
lon: -46.840019
};
const point = {
lat: -23.52785,
lon: -46.840545
};
const result = inBoundingBox(bottomLeft, topRight, point);
console.log(result) // false, where should be true.
И визуальное представление здесь .
Мне нужна помощь, чтобы узнать, гдеточно код неправильный, и как это исправить.
Я также пытался использовать Leaflet, чтобы увидеть, работает ли он, но результат тот же:
function leafletContains(bottomLeft, topRight, pos) {
var bounds = new L.LatLngBounds(
new L.LatLng(bottomLeft.lat, bottomLeft.lon),
new L.LatLng(topRight.lat, topRight.lon)
);
return bounds.contains(new L.LatLng(pos.lat, pos.lon));
}
leafLetContains({ lat: -23.537519, lon: -46.840019 }, { lat: -23.5273, lon: -46.833881 }, { lat: -23.527811, lon: -46.840201 }) // false, where should be true.