K-d tree: Difference between revisions
Content added Content deleted
(→{{header|jq}}: simplify) |
|||
Line 3,487: | Line 3,487: | ||
# Input: a KdTree |
# Input: a KdTree |
||
def nearest($p): |
def nearest($p): |
||
# Input: a KdTree |
|||
def nn_( |
def nn_($target; $hr; $maxDistSqd): |
||
if |
if not then NearestNeighbor(null; infinite; 0) |
||
else |
else .split as $s |
||
| .domElt as $pivot |
|||
| .left as $left |
|||
| |
| .right as $right |
||
| $ |
| ($target[$s] <= $pivot[$s]) as $targetInLeft |
||
| { nodesVisited: 1, |
|||
leftHr: $hr, |
|||
rightHr: $hr } |
|||
| .leftHr.max[$s] = $pivot[$s] |
| .leftHr.max[$s] = $pivot[$s] |
||
| .rightHr.min[$s] = $pivot[$s] |
| .rightHr.min[$s] = $pivot[$s] |
||
| ($ |
| (if $targetInLeft then $left else $right end) as $nearerKd |
||
| (if $targetInLeft then $kd.left else $kd.right end) as $nearerKd |
|||
| (if $targetInLeft then .leftHr else .rightHr end) as $nearerHr |
| (if $targetInLeft then .leftHr else .rightHr end) as $nearerHr |
||
| (if $targetInLeft then $ |
| (if $targetInLeft then $right else $left end) as $furtherKd |
||
| (if $targetInLeft then .rightHr else .leftHr end) as $furtherHr |
| (if $targetInLeft then .rightHr else .leftHr end) as $furtherHr |
||
| |
| ($nearerKd | nn_($target; $nearerHr; $maxDistSqd)) as $res |
||
| .nearest = $res.nearest |
| .nearest = $res.nearest |
||
| .distSqd = $res.distSqd |
| .distSqd = $res.distSqd |
||
Line 3,516: | Line 3,518: | ||
else . |
else . |
||
end |
end |
||
| |
| ($furtherKd | nn_($target; $furtherHr; .maxDistSqd2)) as $temp |
||
| .nodesVisited += $temp.nodesVisited |
| .nodesVisited += $temp.nodesVisited |
||
| if $temp.distSqd < .distSqd |
| if $temp.distSqd < .distSqd |
||
Line 3,527: | Line 3,529: | ||
end ; |
end ; |
||
.n | nn_($p; .bounds; infinite); |
|||
def |
def example($heading; $hr; $points; $p): |
||
⚫ | |||
| nearest($p) |
|||
| "\(heading):", |
| "\(heading):", |
||
"Point : \($p)", |
"Point : \($p)", |
||
"Nearest neighbor : \( |
"Nearest neighbor : \(.nearest)", |
||
"Distance : \( |
"Distance : \(.distSqd | sqrt)", |
||
"Nodes visited : \( |
"Nodes visited : \(.nodesVisited)", |
||
""; |
""; |
||
def example($title; $hr; $points; $point): |
|||
⚫ | |||
| showNearest($title; $kd; $point); |
|||
### Examples |
### Examples |