I don't believe this is correct. Counter example:

```
p0, p1 = np.array([ 175., 0.]), np.array([ 190., 0.])
p2, p3 = np.array([180, -90]),  np.array([180, 90])

print lines_intersect(p0, p1, p2, p3)
```