Circle line-segment collision detection algorithm?

前端 未结 28 1748
被撕碎了的回忆
被撕碎了的回忆 2020-11-22 06:38

I have a line from A to B and a circle positioned at C with the radius R.

\"Image\"

What is a good alg

28条回答
  •  野趣味
    野趣味 (楼主)
    2020-11-22 07:15

    Solution in python, based on @Joe Skeen

    def check_line_segment_circle_intersection(line, point, radious):
        """ Checks whether a point intersects with a line defined by two points.
    
        A `point` is list with two values: [2, 3]
    
        A `line` is list with two points: [point1, point2]
    
        """
        line_distance = distance(line[0], line[1])
        distance_start_to_point = distance(line[0], point)
        distance_end_to_point = distance(line[1], point)
    
        if (distance_start_to_point <= radious or distance_end_to_point <= radious):
            return True
    
        # angle between line and point with law of cosines
        numerator = (math.pow(distance_start_to_point, 2)
                     + math.pow(line_distance, 2)
                     - math.pow(distance_end_to_point, 2))
        denominator = 2 * distance_start_to_point * line_distance
        ratio = numerator / denominator
        ratio = ratio if ratio <= 1 else 1  # To account for float errors
        ratio = ratio if ratio >= -1 else -1  # To account for float errors
        angle = math.acos(ratio)
    
        # distance from the point to the line with sin projection
        distance_line_to_point = math.sin(angle) * distance_start_to_point
    
        if distance_line_to_point <= radious:
            point_projection_in_line = math.cos(angle) * distance_start_to_point
            # Intersection occurs whent the point projection in the line is less
            # than the line distance and positive
            return point_projection_in_line <= line_distance and point_projection_in_line >= 0
        return False
    
    def distance(point1, point2):
        return math.sqrt(
            math.pow(point1[1] - point2[1], 2) +
            math.pow(point1[0] - point2[0], 2)
        )
    

提交回复
热议问题