Files
StarPilot/frogpilot/third_party/h3/_cy/edges.pyx
T
2026-02-13 00:21:29 -07:00

115 lines
2.4 KiB
Cython

cimport h3lib
from .h3lib cimport bool, H3int
from .error_system cimport check_for_error
from .memory cimport H3MemoryManager
# todo: make bint
cpdef bool are_neighbor_cells(H3int h1, H3int h2):
cdef:
int out
err = h3lib.areNeighborCells(h1, h2, &out)
# note: we are intentionally not raising an error here, and just
# returning false.
# todo: is this choice consistent across the Python and C libs?
if err:
return False
return out == 1
cpdef H3int cells_to_directed_edge(H3int origin, H3int destination) except *:
cdef:
int neighbor_out
H3int out
check_for_error(
h3lib.cellsToDirectedEdge(origin, destination, &out)
)
return out
cpdef bool is_valid_directed_edge(H3int e):
return h3lib.isValidDirectedEdge(e) == 1
cpdef H3int get_directed_edge_origin(H3int e) except 1:
cdef:
H3int out
check_for_error(
h3lib.getDirectedEdgeOrigin(e, &out)
)
return out
cpdef H3int get_directed_edge_destination(H3int e) except 1:
cdef:
H3int out
check_for_error(
h3lib.getDirectedEdgeDestination(e, &out)
)
return out
cpdef (H3int, H3int) directed_edge_to_cells(H3int e) except *:
# todo: use directed_edge_to_cells in h3lib
return get_directed_edge_origin(e), get_directed_edge_destination(e)
cpdef H3int[:] origin_to_directed_edges(H3int origin):
""" Returns the 6 (or 5 for pentagons) directed edges
for the given origin cell
"""
hmm = H3MemoryManager(6)
check_for_error(
h3lib.originToDirectedEdges(origin, hmm.ptr)
)
mv = hmm.to_mv()
return mv
cpdef double average_hexagon_edge_length(int resolution, unit='km') except -1:
cdef:
double length
check_for_error(
h3lib.getHexagonEdgeLengthAvgKm(resolution, &length)
)
# todo: multiple units
convert = {
'km': 1.0,
'm': 1000.0
}
try:
length *= convert[unit]
except:
raise ValueError('Unknown unit: {}'.format(unit))
return length
cpdef double edge_length(H3int e, unit='km') except -1:
cdef:
double length
if unit == 'rads':
err = h3lib.edgeLengthRads(e, &length)
elif unit == 'km':
err = h3lib.edgeLengthKm(e, &length)
elif unit == 'm':
err = h3lib.edgeLengthM(e, &length)
else:
raise ValueError('Unknown unit: {}'.format(unit))
check_for_error(err)
return length