Untitled
unknown
python
a year ago
4.8 kB
6
Indexable
from math import sqrt def sign(n): if n == 0: return 0 if n > 0: return '+' if n < 0: return '-' def find_cos(point1, point2, point3, point4): x1 = abs(point1[0] - point2[0]) y1 = abs(point1[1] - point2[1]) x2 = abs(point3[0] - point4[0]) y2 = abs(point3[1] - point4[1]) return (x1 * x2 + y1 * y2) / (point_to_point(point1, point2) + point_to_point(point3, point4)) def line_intersection(l1, l2, l3, l4): x1, y1 = l1 x2, y2 = l2 x3, y3 = l3 x4, y4 = l4 px = ((x1 * y2 - y1 * x2) * (x3 - x4) - (x1 - x2) * (x3 * y4 - y3 * x4)) / ( (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4)) py = ((x1 * y2 - y1 * x2) * (y3 - y4) - (y1 - y2) * (x3 * y4 - y3 * x4)) / ( (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4)) return [px, py] def point_to_point(point1, point2): return sqrt((point1[0] - point2[0]) ** 2 + (point1[1] - point2[1]) ** 2) def point_to_segment(point, segment_p1, segment_p2): x3, y3 = point x1, y1 = segment_p1 x2, y2 = segment_p2 px = x2 - x1 py = y2 - y1 norm = px * px + py * py u = ((x3 - x1) * px + (y3 - y1) * py) / float(norm) if u > 1: u = 1 elif u < 0: u = 0 x = x1 + u * px y = y1 + u * py dx = x - x3 dy = y - y3 dist = (dx * dx + dy * dy) ** .5 return dist def point_to_line(point, line1, line2): x0, y0 = point x1, y1 = line1 x2, y2 = line2 return abs((y2 - y1) * x0 - (x2 - x1) * y0 + x2 * y1 - y2 * x1) / sqrt((y2 - y1) ** 2 + (x2 - x1) ** 2) def point_to_ray(point, ray1, ray2): cos = find_cos(point, ray1, ray1, ray2) if cos < 0: return point_to_point(point, ray1) return point_to_line(point, ray1, ray2) def line_to_line(line1, line2, line3, line4): x1, y1 = line1 x2, y2 = line2 x3, y3 = line3 x4, y4 = line4 k1 = abs(y2 - y1) / abs(x2 - x1) k2 = abs(y4 - y3) / abs(x4 - x3) if k1 == k2: return point_to_line(line1, line3, line4) return 0 def segment_to_line(segment1, segment2, line1, line2): x1, y1 = segment1 x2, y2 = segment2 x3, y3 = line1 x4, y4 = line2 k1 = abs(y2 - y1) / abs(x2 - x1) k2 = abs(y4 - y3) / abs(x4 - x3) if k1 == k2: return point_to_line(segment1, line1, line2) return min(point_to_line(segment1, line1, line2), point_to_line(segment2, line1, line2)) def segment_to_segment(s1, s2, s3, s4): x1, y1 = s1 x2, y2 = s2 x3, y3 = s3 x4, y4 = s4 return min(point_to_segment(s1, s3, s4), point_to_segment(s2, s3, s4)) def segment_to_ray(s1, s2, r1, r2): return min(point_to_ray(s1, r1, r2), point_to_ray(s2, r1, r2)) def ray_to_ray(r1, r2, r3, r4): x1, y1 = r1 x2, y2 = r2 x3, y3 = r3 x4, y4 = r4 k1 = abs(y2 - y1) / abs(x2 - x1) k2 = abs(y4 - y3) / abs(x4 - x3) if k1 == k2: return point_to_ray(r1, r3, r4) return 0 def ray_to_line(r1, r2, l1, l2): x1, y1 = r1 x2, y2 = r2 x3, y3 = l1 x4, y4 = l2 k1 = abs(y2 - y1) / abs(x2 - x1) k2 = abs(y4 - y3) / abs(x4 - x3) intersection = line_intersection(r1, r2, l1, l2) if k1 == k2 or not phantom_intersection(intersection, r1, r2): return point_to_line(r1, l1, l2) return 0 def phantom_intersection(intersection, start, end): x, y = intersection x1, y1 = start x2, y2 = end return sign(x1 - x2) == sign(x1 - x) and sign(y1 - y2) == sign(y1 - y) def f(n): return f'{n:.{6}f}' a = [int(i) for i in input().split()] b = [int(i) for i in input().split()] c = [int(i) for i in input().split()] d = [int(i) for i in input().split()] from_a_to_c = point_to_point(a, c) from_a_to_cd = point_to_segment(a, c, d) from_a_to_cd_ray = point_to_ray(a, c, d) from_a_to_cd_line = point_to_line(a, c, d) from_ab_to_c = point_to_segment(c, a, b) from_ab_to_cd = segment_to_segment(a, b, c, d) from_ab_to_cd_ray = segment_to_ray(a, b, c, d) from_ab_to_cd_line = segment_to_line(a, b, c, d) from_ab_ray_to_c = point_to_ray(c, a, b) from_ab_ray_to_cd = segment_to_ray(c, d, a, b) from_ab_ray_to_cd_ray = ray_to_ray(a, b, c, d) from_ab_ray_to_cd_line = ray_to_line(a, b, c, d) from_ab_line_to_c = point_to_line(c, a, b) from_ab_line_to_cd = segment_to_line(c, d, a, b) from_ab_line_to_cd_ray = ray_to_line(c, d, a, b) from_ab_line_to_cd_line = line_to_line(a, b, c, d) print(*list(map(f, [ from_a_to_c, from_a_to_cd, from_a_to_cd_ray, from_a_to_cd_line, from_ab_to_c, from_ab_to_cd, from_ab_to_cd_ray, from_ab_to_cd_line, from_ab_ray_to_c, from_ab_ray_to_cd, from_ab_ray_to_cd_ray, from_ab_ray_to_cd_line, from_ab_line_to_c, from_ab_line_to_cd, from_ab_line_to_cd_ray, from_ab_line_to_cd_line ])), sep='\n')
Editor is loading...
Leave a Comment