2 from scipy.optimize import fmin
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])
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))
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]
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)
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]
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))
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]
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)))]