aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdrian Kummerlaender2016-05-08 22:26:18 +0200
committerAdrian Kummerlaender2016-05-08 22:26:18 +0200
commit0bc5575e0f744bfc3f5047e4a163cd1940864964 (patch)
treeb0d4c36f927c0eab4bd3d76747aef9106345296d
parent9a4b7db288446c279e8920d8575d52f5b5be6e7f (diff)
downloadvoronoi-0bc5575e0f744bfc3f5047e4a163cd1940864964.tar
voronoi-0bc5575e0f744bfc3f5047e4a163cd1940864964.tar.gz
voronoi-0bc5575e0f744bfc3f5047e4a163cd1940864964.tar.bz2
voronoi-0bc5575e0f744bfc3f5047e4a163cd1940864964.tar.lz
voronoi-0bc5575e0f744bfc3f5047e4a163cd1940864964.tar.xz
voronoi-0bc5575e0f744bfc3f5047e4a163cd1940864964.tar.zst
voronoi-0bc5575e0f744bfc3f5047e4a163cd1940864964.zip
Express Euclidean and Manhattan metric in terms of the Minkowski metric
-rw-r--r--example.cc26
1 files changed, 18 insertions, 8 deletions
diff --git a/example.cc b/example.cc
index a62fc48..18d0e78 100644
--- a/example.cc
+++ b/example.cc
@@ -3,14 +3,20 @@
#include <cmath>
#include <algorithm>
-double euclidean_metric(int refX, int refY, int x, int y) {
- return std::sqrt(
- std::pow(refX - x, 2) + std::pow(refY - y, 2)
+template <int p>
+double minkowski_metric(int refX, int refY, int x, int y) {
+ return std::pow(
+ std::pow(std::abs(refX - x), p) + std::pow(std::abs(refY - y), p),
+ 1.0/p
);
}
+double euclidean_metric(int refX, int refY, int x, int y) {
+ return minkowski_metric<2>(refX, refY, x, y);
+}
+
int manhattan_metric(int refX, int refY, int x, int y) {
- return std::abs(refX - x) + std::abs(refY - y);
+ return minkowski_metric<1>(refX, refY, x, y);
}
int main(int, char*[]) {
@@ -18,7 +24,7 @@ int main(int, char*[]) {
std::array<refpos, 5> ref{
refpos(100, 50, imgen::color(255, 0, 0 )),
- refpos(500, 300, imgen::color(0, 255, 0 )),
+ refpos(490, 300, imgen::color(0, 255, 0 )),
refpos(250, 250, imgen::color(0, 0, 255)),
refpos(400, 20, imgen::color(100, 10, 100)),
refpos(60, 400, imgen::color(20, 60, 300))
@@ -33,12 +39,16 @@ int main(int, char*[]) {
ref.begin(),
ref.end(),
[x, y](const refpos& a, const refpos& b) -> bool {
- return manhattan_metric(std::get<0>(a), std::get<1>(a), x, y)
- < manhattan_metric(std::get<0>(b), std::get<1>(b), x, y);
+ return minkowski_metric<5>(std::get<0>(a), std::get<1>(a), x, y)
+ < minkowski_metric<5>(std::get<0>(b), std::get<1>(b), x, y);
}
);
- return std::get<2>(nearest);
+ if ( euclidean_metric(std::get<0>(nearest), std::get<1>(nearest), x, y) <= 5 ) {
+ return imgen::color(0, 0, 0);
+ } else {
+ return std::get<2>(nearest);
+ }
}
);
}