better `getIntersection` system. fix #818, #808, #603, #879