Circle-Rectangle collision detection (intersection)

前端 未结 24 1408
无人共我
无人共我 2020-11-22 02:55

How can I tell whether a circle and a rectangle intersect in 2D Euclidean space? (i.e. classic 2D geometry)

24条回答
  •  心在旅途
    2020-11-22 03:19

    your sphere and rect intersect IIF
    the distance between the circle-center and one vertex of your rect is smaller than the radius of your sphere
    OR
    the distance between the circle-center and one edge of your rect is smaller than the radius of your sphere ([point-line distance ])
    OR
    the circle center is inside the rect

    point-point distance:

    P1 = [x1,y1]
    P2 = [x2,y2]
    Distance = sqrt(abs(x1 - x2)+abs(y1-y2))
    

    point-line distance:

    L1 = [x1,y1],L2 = [x2,y2] (two points of your line, ie the vertex points)
    P1 = [px,py] some point
    
    Distance d =  abs( (x2-x1)(y1-py)-(x1-px)(y2-y1) ) / Distance(L1,L2)
    


    circle center inside rect:
    take an seperating axis aproach: if there exists a projection onto a line that seperates the rectangle from the point, they do not intersect

    you project the point on lines parallel to the sides of your rect and can then easily determine if they intersect. if they intersect not on all 4 projections, they (the point and the rectangle) can not intersect.

    you just need the inner-product ( x= [x1,x2] , y = [y1,y2] , x*y = x1*y1 + x2*y2 )

    your test would look like that:

    //rectangle edges: TL (top left), TR (top right), BL (bottom left), BR (bottom right)
    //point to test: POI
    
    seperated = false
    for egde in { {TL,TR}, {BL,BR}, {TL,BL},{TR-BR} }:  // the edges
        D = edge[0] - edge[1]
        innerProd =  D * POI
        Interval_min = min(D*edge[0],D*edge[1])
        Interval_max = max(D*edge[0],D*edge[1])
        if not (  Interval_min ≤ innerProd ≤  Interval_max ) 
               seperated = true
               break  // end for loop 
        end if
    end for
    if (seperated is true)    
          return "no intersection"
    else 
          return "intersection"
    end if
    

    this does not assume an axis-aligned rectangle and is easily extendable for testing intersections between convex sets.

提交回复
热议问题