From beb3b7582ee8ceb0ea8af3e1747dbce2bf60bfb0 Mon Sep 17 00:00:00 2001 From: Aki Date: Fri, 26 Aug 2022 22:46:06 +0200 Subject: Implemented finding candidates for boundaries --- plot.py | 47 +++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 43 insertions(+), 4 deletions(-) diff --git a/plot.py b/plot.py index 1669c5a..6ba676e 100644 --- a/plot.py +++ b/plot.py @@ -1,6 +1,9 @@ import csv +import math +import operator import os import re +from collections import deque import matplotlib.pyplot as plot @@ -21,11 +24,47 @@ def load(directory): if match: yield int(match.group(1)), os.path.join(directory, file) - return [(x, _load(y)) for x, y in _files(directory)] + return [(x, _load(y)) for x, y in sorted(_files(directory), key=lambda x: x[0])] -swis = load("dataset") +def increment(x): + return x + 1 + + +def decrement(x): + return x - 1 + -for index, data in swis: - plot.plot([x[0] for x in data], [x[1] for x in data], label=index) +def find_boundary_curves(swis, x, y): + segments = deque() + for index, data in swis: + width = data[-1][0] - data[0][0] + relative = x - data[0][0] + candidate = math.floor(relative / width * len(data)) + 1 + condition = operator.lt if data[candidate][0] > x else operator.gt + step = decrement if data[candidate][0] > x else increment + j = candidate + i = candidate + while not condition(data[i][0], x): + j = i + i = step(i) + if i > j: + i, j = j, i + if data[i][1] > y and data[j][1] > y: + segments.append((index, data, i, j)) + break + if data[i][1] < y and data[j][1] < y: + if segments: + segments.popleft() + segments.append((index, data, i, j)) + return segments + + +swis = load("dataset") +x = 16.61 +y = 8600 +segments = find_boundary_curves(swis, x, y) +plot.plot([x], [y], "rx") +for index, data, i, j in segments: + plot.plot([x[0] for x in data], [x[1] for x in data], ".") plot.show() -- cgit v1.1