While point in polygon plot points/lines fails (Circle.contains_point; Python; matplotlib; pyplot)
My task: Plot an initial point and calculate new point positions (x, y) while points are in a circle.
My problem: Using a
while loop to perform this fails to run the code block as it incorrectly determines the circle doesn't contain the point (fig 1). However, using a
for loop it can be seen that multiple points reside in the circle, but still incorrectly identifies that points don't exist in the circle (fig 2).
Additional info: I also can't seem to get lines instead of points to be plotted (e.g. using
pyplot.plot(x, y, '-')).
If there are more streamlined methods, for instance in plotting the circle/points/lines, or the entire approach I'd be interested to see them. I appreciate any help that can be offered.
After much searching here and elsewhere I've come as far as the following code:
# IMPORT LIBRARIES #### import numpy as np import matplotlib.pyplot as plt import matplotlib.path as mPath import matplotlib.patches as mPatches # CREATE CIRCLE #### # Input circle radius circleRadius = 2 # Create circle (arguments: centre, radius, face colour (fc), edge colour (ec), alpha) circle = mPatches.Circle((0, 0), radius = circleRadius, fc = 'm', alpha = 0.3) # Plot circle fig1, ax = plt.subplots() ax.add_patch(circle) ax.set_xlim(-5, 5) ax.set_ylim(-5, 5) ax.set_aspect('equal') # CREATE POINTS #### # Input coordinates x0 = -1 y0 = 0.5 # Assignment for equation x = x0 y = y0 # Store curr_pt = [x, y] counter = 0 # Plot 1st point (x, y) plt.plot(x, y, '.c') # Pre-checks print(circle.contains_point([x, y])) print(counter) print(x0, y0) print(x, y) # Plot points while circle.contains_point([x, y]): # see 1st figure #for i in range(5): # uncomment this line (for) and comment above line (while) see 2nd figure xnew = x**2 - y**2 + x0 ynew = 2 * x * y + y0 x = xnew y = ynew # Update current point curr_pt = [x, y] # Plot point (x, y) plt.plot(x, y, '.c') counter += 1 # Post-checks print(circle.contains_point([x, y])) print(counter) print(x0, y0) print(x, y) print(xnew, ynew) # note this check will output error with while loop as they will not be defined # Print plot plt.show()
# while loop (Fig 1) False 0 -1 0.5 -1 0.5 False 0 -1 0.5 -1 0.5
# for loop (Fig 2) False 0 -1 0.5 -1 0.5 False 5 -1 0.5 5.063203536206856 -4.162733919918537 5.063203536206856 -4.162733919918537