# API Reference ## Functions ### `qiblaAngle(lat, lng)` Computes the initial bearing from the given coordinates to the Ka'bah. Uses the forward azimuth formula from spherical trigonometry: ``` θ = atan2(sin(Δλ)·cos(φ₂), cos(φ₁)·sin(φ₂) − sin(φ₁)·cos(φ₂)·cos(Δλ)) ``` where φ₁, λ₁ is the observer and φ₂, λ₂ is the Ka'bah. **Parameters:** | Name | Type | Description | | ----- | -------- | ---------------------------------------------------------------- | | `lat` | `number` | Observer latitude in decimal degrees. Valid range: −90 to 90. | | `lng` | `number` | Observer longitude in decimal degrees. Valid range: −180 to 180. | **Returns:** `number`: Bearing in degrees clockwise from true north. Range: [0, 360). **Throws:** `RangeError` if either coordinate is out of bounds. ```typescript import { qiblaAngle } from "@acamarata/qibla"; qiblaAngle(40.7128, -74.006); // ~58.48 (New York → Mecca) qiblaAngle(51.5074, -0.1278); // ~119.0 (London → Mecca) qiblaAngle(35.6762, 139.6503); // ~293.3 (Tokyo → Mecca) ``` --- ### `compassDir(bearing)` Returns the eight-point compass abbreviation for a bearing. Maps the bearing to one of eight 45° sectors, selecting the nearest cardinal or intercardinal direction. **Parameters:** | Name | Type | Description | | --------- | -------- | --------------------------- | | `bearing` | `number` | Bearing in degrees (0–360). | **Returns:** `CompassAbbr`: One of: `N`, `NE`, `E`, `SE`, `S`, `SW`, `W`, `NW`. ```typescript import { compassDir } from "@acamarata/qibla"; compassDir(0); // "N" compassDir(45); // "NE" compassDir(58.5); // "NE" compassDir(270); // "W" ``` --- ### `compassName(bearing)` Returns the full compass direction name for a bearing. **Parameters:** | Name | Type | Description | | --------- | -------- | --------------------------- | | `bearing` | `number` | Bearing in degrees (0–360). | **Returns:** `CompassName`: One of: `North`, `Northeast`, `East`, `Southeast`, `South`, `Southwest`, `West`, `Northwest`. ```typescript import { compassName } from "@acamarata/qibla"; compassName(58.5); // "Northeast" ``` --- ### `qiblaGreatCircle(lat, lng, steps?)` Generates waypoints along the great-circle geodesic from the observer to the Ka'bah, using the Slerp (spherical linear interpolation) formula. Useful for drawing the Qibla direction line on a map. Returns `steps + 1` points uniformly spaced along the geodesic. **Parameters:** | Name | Type | Default | Description | | ------- | -------- | ------- | ---------------------------------------------------- | | `lat` | `number` | : | Observer latitude in decimal degrees (−90 to 90). | | `lng` | `number` | : | Observer longitude in decimal degrees (−180 to 180). | | `steps` | `number` | `120` | Number of segments. Result has `steps + 1` points. | **Returns:** `[number, number][]`: Array of `[latitude, longitude]` pairs in degrees. **Throws:** `RangeError` if coordinates are out of bounds. Special case: if the observer is at the Ka'bah (distance = 0), returns `[[lat, lng]]`. ```typescript import { qiblaGreatCircle } from "@acamarata/qibla"; const path = qiblaGreatCircle(40.7128, -74.006); // 121 points // path[0] ≈ [40.7128, -74.006] (New York) // path[120] ≈ [21.42, 39.83] (Ka'bah) ``` --- ### `distanceKm(lat1, lng1, lat2, lng2)` Haversine distance between two points in kilometers. Uses the haversine formula with a spherical Earth (R = 6,371 km, WGS-84 volumetric mean). Accurate to within 0.5% globally. **Parameters:** | Name | Type | Description | | ------ | -------- | ------------------------------------------ | | `lat1` | `number` | First point latitude in decimal degrees. | | `lng1` | `number` | First point longitude in decimal degrees. | | `lat2` | `number` | Second point latitude in decimal degrees. | | `lng2` | `number` | Second point longitude in decimal degrees. | **Returns:** `number`: Distance in kilometers. ```typescript import { distanceKm, KAABA_LAT, KAABA_LNG } from "@acamarata/qibla"; distanceKm(40.7128, -74.006, KAABA_LAT, KAABA_LNG); // ~9,634 km ``` --- ## Constants | Constant | Value | Description | | ----------------- | ----------- | ------------------------------------------------ | | `KAABA_LAT` | `21.422511` | Ka'bah center latitude in decimal degrees north. | | `KAABA_LNG` | `39.82615` | Ka'bah center longitude in decimal degrees east. | | `EARTH_RADIUS_KM` | `6371` | WGS-84 volumetric mean radius in kilometers. | ```typescript import { KAABA_LAT, KAABA_LNG, EARTH_RADIUS_KM } from "@acamarata/qibla"; ``` --- ## Types ### `CompassAbbr` ```typescript type CompassAbbr = "N" | "NE" | "E" | "SE" | "S" | "SW" | "W" | "NW"; ``` ### `CompassName` ```typescript type CompassName = | "North" | "Northeast" | "East" | "Southeast" | "South" | "Southwest" | "West" | "Northwest"; ``` --- [Home](Home) | [Architecture](Architecture)