This commit is contained in:
Casper 2018-10-08 15:35:14 +02:00
parent 08c4b1f790
commit bb2797a8c2
No known key found for this signature in database
GPG Key ID: B1156723DB3BDDA8
2 changed files with 60 additions and 6 deletions

View File

@ -1,10 +1,10 @@
import matplotlib.pyplot as plt
import collections
from enum import Enum, auto
from random import randint
Point = collections.namedtuple("Point", "x y")
Point = collections.namedtuple("Point", ("x", "y"))
class Side(Enum):
ON = auto()
@ -14,13 +14,14 @@ class Side(Enum):
def sidedness(slope, intersection, p3, eps=0.0000001):
print(slope * p3[0] + intersection )
""" finds where a point is in regards to a line """
# finds where a point is in regards to a line
if p3[1] - eps <= slope * p3[0] + intersection <= p3[1] + eps or p3[0] - eps <= (p3[1] - intersection)/slope <= p3[0] + eps:
return Side.ON
elif p3[1] > slope * p3[0] + intersection:
return Side.ABOVE
return Side.BELOW
def diplay_prune_points(points, p1, p2):
xs = [p[0] for p in points]
ys = [p[1] for p in points]
@ -90,7 +91,6 @@ def solve1D(points, xm, iteration_num):
return v
def findBridge(points, xm):
if xm > 0:
v = (-float('Inf'), -float('Inf'))
@ -190,5 +190,3 @@ res_ys = [p[1] for p in result]
plt.plot(res_xs, res_ys)
plt.plot(xs, ys, 'ro')
plt.show()

56
h2/howto Normal file
View File

@ -0,0 +1,56 @@
---- MbC ---
MbC(P: l, r): (finds UH of P from x-coordinates l to r)
Find median x-coordinate x_m
Partition points on x_m into Pl and Pr
Find bridge uv over x_m
Remove points below bridge
Recurse MbC(Pl: l, u.x) and MbC(Pr: v.x, r)
Find bridge is finding the line (y=ax+b) such that:
1) passes above all the points
2) has the lowest intersection point with the median line
---- 1D ----
Unknown x1
Minimize c1*x1
such that
a1*x1 \leq b1
a2*x1 \leq b2
...
an*x1 \leq bn
for each of the constraints:
ai*x1 \leq bi
=>
if ai > 0: x1 <= bi/ai
if ai < 0: x1 >= bi/ai
if ai = 0:
if bi < 0: impossible
if bi \geq 0: always satisfied
this means that each constraint half of the real line
therefore run for-loop on bi/ai and check the ifs
when we have feasible region/interval:
if c1 > 0: choose minimum of interval
if c1 < 0: choose maximum of interval
if c1 = 0: degenerate
---- 2D ----
a and b are unknowns
minimize ax_m + b
such that y_i \leq ax_i + b, for every input point (x_i, y_i)
where x_m is given (median)
Algorithm:
Initialise v
Randomly shuffle constraints
for i=1 to n:
if constraint i does not violate v, do nothing
else solve 1d LP on boundary of constraint i