In this first post I wanted to explore the basics of blogging blogdown. I treat an example of a little python challenge which I encountered in first my job hunt process. I particularly like it because it is a geometric problem.
Problem
Write a function that tests if a point falls within a specified distance “dist” of any part of a solid, 2D rectangle. The rectangle is specified by the bottom left corner, a width, and a height.
Suggested Solution
We define a class that represents a Point. Each Point has an x and y coordinate.
class Point(object):
def __init__(self, init_x=0.0, init_y=0.0):
self.x = init_x
self.y = init_y
We define a class that represents a Rectangle. Its position is determined by the Point at the bottom left corner. The dimensions of the Rectangle is determined by its width and height.
class Rectangle(object):
def __init__(self, bottom_left_x=0.0, bottom_left_y=0.0, init_width=0.0, init_height=0.0):
self.bottom_left = Point(bottom_left_x, bottom_left_y)
self.width = init_width
self.height = init_height
This function idicates whether a given point lies within a distance dist of a given Rectangle, returning a boolaen value. That is, if \(A\subset \mathbb{R}^2\) denotes the given rectangle, we want to compute the indicator function of the open set
\[ U_{dist}:= \{ p \in\mathbb{R}^2 : \exists q \in R \quad \text{such that} \quad ||p-q|| < dist \}. \]
First function verifies if the x-coordinate of the Point is at a distance less than dist. If it is then it verifies the y-coordinate. For the y-coordinate it evaluates two cases:
It checks if its outside the Rectangle but still within a distance less that dist (checks to the left and to the right).
It checks if it is inside the Rectangle.
import math
def is_point_within_dist_of_rect(rect=Rectangle(), point=Point(), dist=0.0):
if((rect.bottom_left.x - dist)< point.x and point.x < (rect.bottom_left.x + rect.width + dist)):
if(point.x < rect.bottom_left.x):
a = rect.bottom_left.x - point.x
y_max = rect.bottom_left.y + rect.height + math.sqrt(dist**2-a**2)
y_min = rect.bottom_left.y - math.sqrt(dist**2-a**2)
if((y_min < point.y) and point.y < y_max):
return True
else:
return False
elif(point.x < (rect.bottom_left.x + rect.width)):
y_max = rect.bottom_left.y + rect.height + dist
y_min = rect.bottom_left.y - dist
if((y_min < point.y) and point.y < y_max):
return True
else:
return False
else:
a = rect.bottom_left.x+rect.width - point.x
y_max = rect.bottom_left.y + rect.height + math.sqrt(dist**2-a**2)
y_min = rect.bottom_left.y - math.sqrt(dist**2-a**2)
if((y_min < point.y) and point.y < y_max):
return True
else:
return False
return False
Eamples
We consider square of side 2 with the center of mass at the origin.
rectangle = Rectangle(-1,-1,2,2)
We check that the origin is in the square.
point_1 = Point(0,0)
is_point_within_dist_of_rect(rectangle, point_1, dist=1)
True
We check that the upper right corner is in the square.
point_2 = Point(1,1)
is_point_within_dist_of_rect(rectangle, point_2, dist=1)
True
We check a point outside a the square.
point_3 = Point(0,3)
is_point_within_dist_of_rect(rectangle, point_3, dist=1)
False
Now we consider a limit case. First we define:
threshold_value= 1 + math.sqrt(2)/2
epsilon = 0.0001
We consider two cases:
- We check a point close (outside) to the region boundary.
point_4 = Point(threshold_value + epsilon, threshold_value + epsilon)
is_point_within_dist_of_rect(rectangle, point_4, dist=1)
False
- We check a point close (inside) to the region boundary.
point_5 = Point(threshold_value - epsilon, threshold_value - epsilon)
is_point_within_dist_of_rect(rectangle, point_5, dist=1)
True