testing/nose: Restructure to split out examples
[swc-testing-nose.git] / testing / nose / exercises / close-line / close_line.py
1 import numpy as np
2 from scipy.optimize import fmin
3
4 #
5 # Attempt 1
6 #
7
8 def point_on_line1(x, p1, p2):
9     y = p1[1] + (x - p1[0])*(p2[1] - p1[1]) / (p2[0] - p1[0])
10     return np.array([x, y])
11
12
13 def dist_from_line1(x, pdata, p1, p2):
14     pline = point_on_line1(x, p1, p2)
15     return np.sqrt(np.sum((pline - pdata)**2))
16
17
18 def closest_data_to_line1(data, p1, p2):
19     dists = np.empty(len(data), dtype=float)
20     for i, pdata in enumerate(data):
21         x = fmin(dist_from_line1, p1[0], (pdata, p1, p2), disp=False)[0]
22         dists[i] = dist_from_line1(x, pdata, p1, p2)
23     imin = np.argmin(dists)
24     return imin, data[imin]
25
26
27 #
28 # Attempt 2
29 #
30
31 def dist_from_line2(pdata, p1, p2):
32     a = np.sqrt(np.sum((p1 - pdata)**2))
33     b = np.sqrt(np.sum((p2 - pdata)**2))
34     c = np.sqrt(np.sum((p2 - p1)**2))
35     h = a * np.sqrt(1.0 - ((a**2 + c**2 - b**2) / (2.0 * a * c))**2)
36     return h
37
38 def closest_data_to_line2(data, p1, p2):
39     dists = np.empty(len(data), dtype=float)
40     for i, pdata in enumerate(data):
41         dists[i] = dist_from_line2(pdata, p1, p2)
42     imin = np.argmin(dists)
43     return imin, data[imin]
44
45 #
46 # Attempt 3
47 #
48
49 def perimeter3(pdata, p1, p2):
50     a = np.sqrt(np.sum((p1 - pdata)**2))
51     b = np.sqrt(np.sum((p2 - pdata)**2))
52     c = np.sqrt(np.sum((p2 - p1)**2))
53     return (a + b + c)
54
55 def closest_data_to_line3(data, p1, p2):
56     peris = np.empty(len(data), dtype=float)
57     for i, pdata in enumerate(data):
58         peris[i] = perimeter3(pdata, p1, p2)
59     imin = np.argmin(peris)
60     return imin, data[imin]
61
62 #
63 # Attempt 4
64 #
65
66 def closest_data_to_line4(data, p1, p2):
67     return data[np.argmin(np.sqrt(np.sum((p1 - data)**2, axis=1)) + \
68                 np.sqrt(np.sum((p2 - data)**2, axis=1)))]
69