Soyo

Tìm hình chữ nhật giao nhau của hai hình chữ nhật

Hình chữ nhật gồm 2 điểm: topRight bottomLeft

Screen-Shot-2019-04-05-at-9.03.35-PM

Quy định hình chữ nhật

struct Point {
    let x: Double
    let y: Double
}

struct Rectangle {
    let bottomLeft: Point
    let topRight: Point
    
    func isValidRectangle () -> Bool {
        return (topRight.x - bottomLeft.x) * (topRight.y - bottomLeft.y) > 0
    }
    
    func intersect(with rec: Rectangle) -> Rectangle? {
        //Todo
    }
}

Khi nào 2 hình chữ nhật giao nhau:
((x1,y1), (x2,y2)) / ((a1,b1), (a2,b2)) ????????????
khi ngoại trừ 4 trường hợp không giao nhau sau:

Screen-Shot-2019-04-05-at-9.14.51-PM

Chúng ta trả về nil cho 4 trường hợp trên, không thì trả về dựa vào min max ( xem đầu và một chút tưởng tượng :V)

func intersect(with rec: Rectangle) -> Rectangle? {
    if (bottomLeft.y >= rec.topRight.y || topRight.y <= rec.bottomLeft.y) 
        { return nil }
    if (topRight.x <= rec.bottomLeft.x || bottomLeft.x >= rec.topRight.x) 
        { return nil }

    let firstPoint = Point(x: max(bottomLeft.x, rec.bottomLeft.x), y: max(bottomLeft.y, rec.bottomLeft.y))
    let secondPoint = Point(x: min(topRight.x, rec.topRight.x), y: min(topRight.y, rec.topRight.y))

    return Rectangle(bottomLeft: firstPoint, topRight: secondPoint)
}

Time to test: thử viết test class xem nào

struct TestIntersect {
    let input1: (Double, Double, Double, Double)
    let input2: (Double, Double, Double, Double)
    let expect: (Double, Double, Double, Double)?
    func test() -> Bool {
        ///yolooooo
    }
}

Happy coding!

Comments