虽然多边形绘图点/线中的点失败Circle.contains_point; Python; matplotlib; pyplot

如何解决虽然多边形绘图点/线中的点失败Circle.contains_point; Python; matplotlib; pyplot

我的任务:绘制一个初始点并计算新的点位置 (x,y),而点在一个圆圈中。

我的问题: 使用 while 循环执行此操作无法运行代码块,因为它错误地确定圆不包含该点(图 1)。然而,使用 for 循环可以看到多个点驻留在圆中,但仍然错误地识别出圆中不存在点(图 2)。

附加信息:我似乎也无法获得要绘制的线而不是点(例如使用 pyplot.plot(x,y,'-'))。 如果有更简化的方法,例如绘制圆/点/线,或整个方法,我会很想看到它们。感谢您提供的任何帮助。

在这里和其他地方进行了大量搜索后,我得到了以下代码

# 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,'.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,'.c')
    counter += 1

# Post-checks
print(circle.contains_point([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

Fig 1 (while loop)

# 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

Fig 2 (for loop)

解决方法

更新:

利用这些答案中概述的方法:

我修改后的代码现在可以正确识别点是否在 Circle 中,并根据 while 执行 contains_point() 循环。

修改后的代码:

# 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)

# Get path and 2D affine transformation
pathC = circle.get_path()
transformC = circle.get_transform()
    
# Apply transformation to the path
transPath = transformC.transform_path(pathC)
    
# Get path of transformed circle
polygon = mPatches.PathPatch(transPath,alpha = 0.3)


# CREATE POINTS ####
# Input initial coordinates
x0 = -1
y0 = 0.5
# Assignment for new point equation
x = x0
y = y0
# Store
curr_pt = (x,y)
all_x = []
all_y = []

# Iterations required to escape circle
counter = 0

# Pre-check
cp1 = polygon.contains_point(curr_pt)
print("Pre-loop checks:")
print("Polygon contains point:",cp1)
print("Counter:",counter)
print("(x,y):",x,y)
print("")

# Create figure and single subplot
fig,ax = plt.subplots()

# Plot initial point (x,y)
ax.scatter(curr_pt[0],curr_pt[1],color = 'c')

# Plot new points
while polygon.contains_point(curr_pt):    
    xnew = x**2 - y**2 + x0
    ynew = 2 * x * y + y0
    x = xnew
    y = ynew
    # Update current point
    curr_pt = (x,y)
    # Update x,y lists for plotting lines
    all_x.append(curr_pt[0])
    all_y.append(curr_pt[1])
    # Plot new point
    ax.scatter(curr_pt[0],color = 'c')
    # Increment counter
    counter += 1
    if counter == 50:
        break

# Post-check
cp2 = polygon.contains_point(curr_pt)
print("Post-loop checks:")
print("Polygon contains point:",cp2)
print("Counter:",y)
print("(xnew,ynew):",xnew,ynew)


# CREATE PLOT ####
# Plot lines
ax.plot(all_x,all_y,color = 'c')
# Plot circle
ax.add_patch(polygon)

# Print plot
ax.set_aspect(1.0)
fig.savefig("Correct point in polygon (points and lines).png")
plt.show()

输出:

Pre-loop checks:
Polygon contains point: True
Counter: 0
(x,y): -1 0.5

Post-loop checks:
Polygon contains point: False
Counter: 4
(x,y): -2.6183929443359375 0.890380859375
(xnew,ynew): -2.6183929443359375 0.890380859375

enter image description here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?