K-d tree: Difference between revisions

132 bytes removed ,  10 years ago
m
→‎{{header|Perl 6}}: Use named params to make custom "new" method obsolete.
m (plenty of solutions to bring out of draft status)
m (→‎{{header|Perl 6}}: Use named params to make custom "new" method obsolete.)
Line 830:
has $.right;
}
 
class Orthotope {
has $.min;
has $.max;
method new($min,$max) { self.bless: :$min, :$max }
}
 
class Kd_tree {
has $.n;
Line 857 ⟶ 856:
}
}
 
class T3 {
has $.nearest;
has $.dist_sqd = Inf;
has $.nodes_visited = 0;
method new($nearest, $dist_sqd, $nodes_visited) { self.bless: :$nearest, :$dist_sqd, :$nodes_visited }
}
 
sub find_nearest($k, $t, @p) {
return nn($t.n, @p, $t.bounds, Inf);
 
sub nn($kd, @target, $hr, $max_dist_sqd is copy) {
return T3.new(:nearest([0.0 xx $k], Inf, 0)) unless $kd;
 
my $nodes_visited = 1;
my $s = $kd.split;
Line 878 ⟶ 876:
$left_hr.max[$s] = $pivot[$s];
$right_hr.min[$s] = $pivot[$s];
 
my $nearer_kd;
my $further_kd;
Line 896 ⟶ 894:
my $dist_sqd = $n1.dist_sqd;
$nodes_visited += $n1.nodes_visited;
 
if $dist_sqd < $max_dist_sqd {
$max_dist_sqd = $dist_sqd;
Line 902 ⟶ 900:
my $d = ($pivot[$s] - @target[$s]) ** 2;
if $d > $max_dist_sqd {
return T3.new(:$nearest, :$dist_sqd, :$nodes_visited);
}
$d = [+] (@$pivot Z- @target) X** 2;
Line 910 ⟶ 908:
$max_dist_sqd = $dist_sqd;
}
 
my $n2 = nn($further_kd, @target, $further_hr, $max_dist_sqd);
$nodes_visited += $n2.nodes_visited;
Line 917 ⟶ 915:
$dist_sqd = $n2.dist_sqd;
}
 
T3.new(:$nearest, :$dist_sqd, :$nodes_visited);
}
}
 
sub show_nearest($k, $heading, $kd, @p) {
print qq:to/END/;
Line 935 ⟶ 933:
END
}
 
sub random_point($k) { [rand xx $k] }
sub random_points($k, $n) { [random_point($k) xx $n] }
 
sub MAIN {
my $kd1 = Kd_tree.new([[2, 3],[5, 4],[9, 6],[4, 7],[8, 1],[7, 2]],
Orthotope.new(:min([0, 0]), :max([10, 10])));
show_nearest(2, "Wikipedia example data", $kd1, [9, 2]);
 
my $N = 1000;
my $t0 = now;
my $kd2 = Kd_tree.new(random_points(3, $N), Orthotope.new(:min([0,0,0]), :max([1,1,1])));
my $t1 = now;
show_nearest(2,
Line 964 ⟶ 962:
Distance: 0.0340950700678338
Nodes visited: 23</pre>
 
=={{header|Python}}==
{{trans|D}}
Anonymous user