Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- class point(object):
- def __init__(self,x,y):
- self.x = x
- self.y = y
- class line(object):
- def __init__(self,A,B,C):
- self.A = A
- self.B = B
- self.C = C
- def dist(a, b):
- return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y))
- def dist_line(p, l):
- return abs(l.A * p.x + l.B * p.y + l.C) / (sqrt(l.A * l.A + l.B * l.B))
- def make_point(x, y):
- return point(x, y)
- def make_line_byPoint(a, b):
- A = a.y - b.y
- B = b.x - a.x
- C = a.x * b.y - b.x * a.y
- return line(A, B, C)
- def intersect(a, b, lin):
- kek = b
- kek.x -= a.x
- kek.y -= a.y
- l = 0.0
- r = 1.0
- for i in range(1000):
- m1 = l + (r - l) / 3
- m2 = r - (r - l) / 3
- d1 = dist_line(make_point(a.x + kek.x * m1, a.y + kek.y * m1), lin)
- d2 = dist_line(make_point(a.x + kek.x * m2, a.y + kek.y * m2), lin)
- if (d1 > d2):
- l = m1
- else:
- r = m2
- return make_point(a.x + kek.x * l, a.y + kek.y * l)
- def sq(a, siz):
- res = 0
- j
- for i in range(siz):
- if (i == a.size() - 1):
- j = 0
- else:
- j = i + 1
- res += (a[i].x - a[j].x) * (a[i].y + a[j].y)
- return abs(res) / 2.0
- lines = []
- ans = 0.0
- def kek(ind, cur, siz):
- if (ind == len(lines)):
- ans = max(ans, sq(cur))
- return
- bubs = []
- for i in range(siz):
- b = intersect(cur[i], cur[(i + 1) % siz], lines[ind])
- if (dist_line(b, lines[ind]) > eps):
- continue
- if (bubs.size() == 0):
- bubs.append({i, b})
- continue
- if (dist(bubs.back().ss, b) > eps):
- bubs.pb({i, b})
- if (bubs.size() == 0):
- kek(ind + 1, cur, siz)
- return
- if (bubs.size() == 1):
- #cout << "on line you f** idiot";
- kek(ind + 1, cur)
- exit(0)
- if (bubs.size() != 2):
- print("something wrong....")
- while (1):
- a = 0
- # если сюда зайдет, то получим tl из-за бесконечного цикла
- i1 = bubs[0].ff
- i2 = bubs[1].ff
- a1
- siz1 = 0
- a1.append(bubs[0].ss)
- siz1 += 1
- for i in range(i1 + 1, i2 + 1):
- a1.append(cur[i])
- siz1 += 1
- a1.append(bubs[1].ss)
- siz1 += 1
- kek(ind + 1, a1)
- a2
- siz2 = 0
- siz2 += 1
- a2.append(bubs[1].ss)
- for i in range(i2 + 1, siz):
- a2.append(cur[i])
- siz2 += 1
- for i in range(0, i1 + 1):
- a2.append(cur[i])
- siz2 += 1
- siz2 += 1
- a2.append(bubs[0].ss)
- kek(ind + 1, a2, siz2)
- eps = 0.0000000001
- #inp = eval(input())
- inp = [((50, 32), (-13, 43)), ((23, -34), (80, 55))]
- for i in range(len(inp)):
- p1 = make_point(inp[i][0][0], inp[i][0][1])
- p2 = make_point(inp[i][1][0], inp[i][1][1])
- lines.append(make_line_byPoint(p1, p2))
- beg = []
- beg.append(make_point(-50, -50))
- beg.append(make_point(-50, 50))
- beg.append(make_point(50, 50))
- beg.append(make_point(50, -50))
- kek(0, beg, 4)
- print(ans)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement