我有一个 .txt 文件,从中找到有序对,然后使用 numpy 和 matplotlib 绘制图形。例如,这些是我的有序对:
[[(4.0, 0), (0, 6.0)], [(6.0, 0), (0, 3.0)]]
(每个子列表代表最终图形中的一条线)
图形如下所示:
但我想找到两条线之间的交点。 如果有更多的线,我怎样才能找到它们之间的公共区域?例如
以下是使用 Python 查找直线交点并阴影化公共区域的方法:
import numpy as np
import matplotlib.pyplot as plt
from shapely.geometry import Polygon, LineString
from shapely.ops import polygonize
def find_intersection(line1, line2):
"""查找两条线的交点。
Args:
line1: 格式为 ((x1, y1), (x2, y2)) 的元组,表示第一条线。
line2: 格式为 ((x1, y1), (x2, y2)) 的元组,表示第二条线。
Returns:
一个表示交点的元组 (x, y),如果线平行,则返回 None。
"""
(x1, y1), (x2, y2) = line1
(x3, y3), (x4, y4) = line2
denom = (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4)
if denom == 0: # 线平行
return None
x = ((x1 * y2 - y1 * x2) * (x3 - x4) - (x1 - x2) * (x3 * y4 - y3 * x4)) / denom
y = ((x1 * y2 - y1 * x2) * (y3 - y4) - (y1 - y2) * (x3 * y4 - y3 * x4)) / denom
return x, y
def plot_lines_and_intersection(lines):
"""绘制直线并阴影化公共区域。
Args:
lines: 直线列表,其中每条线都表示为 ((x1, y1), (x2, y2))。
"""
fig, ax = plt.subplots()
# 收集所有线段以构建多边形
all_segments = []
for line in lines:
all_segments.append(LineString(line))
ax.plot(*zip(*line), label=f"Line {lines.index(line)+1}")
# 找到所有交点
intersections = []
for i in range(len(lines)):
for j in range(i + 1, len(lines)):
intersection = find_intersection(lines[i], lines[j])
if intersection:
intersections.append(intersection)
# 使用 Shapely 创建多边形
polygon = Polygon(shell=all_segments).intersection(Polygon(shell=all_segments[::-1]))
if polygon.geom_type == 'Polygon':
# 填充多边形
ax.fill(*polygon.exterior.xy, alpha=0.3)
elif polygon.geom_type == 'MultiPolygon':
for poly in polygon:
ax.fill(*poly.exterior.xy, alpha=0.3)
# 绘制交点
for intersection in intersections:
ax.plot(*intersection, 'ro')
ax.set_xlabel("X 轴")
ax.set_ylabel("Y 轴")
ax.set_title("直线和交点")
ax.legend()
plt.grid(True)
plt.show()
# 示例用法:
lines = [[(4.0, 0), (0, 6.0)], [(6.0, 0), (0, 3.0)]] # 的示例数据
plot_lines_and_intersection(lines)
说明:
-
find_intersection(line1, line2)
: 此函数使用两条线的数学公式来查找其交点。如果线平行,则返回None
。 -
plot_lines_and_intersection(lines)
: -
它遍历
lines
列表,并使用ax.plot()
绘制每条线。 -
它调用
find_intersection()
来查找所有线对之间的交点。 -
它使用
shapely.geometry
模块来:-
使用
LineString
创建所有线段的表示。 -
通过将线段传递到
Polygon
来构造一个多边形。 -
找到
polygonize
操作的结果多边形的交集,以获取公共区域。
-
使用
-
如果找到交点,则使用
ax.plot()
将其绘制为红点。 -
它使用
ax.fill()
填充公共区域。 - 最后,它设置标签、标题、图例并显示绘图。
要从 .txt 文件加载数据:
-
假设的 .txt 文件包含以下格式的数据:
4.0 0 0 6.0 6.0 0 0 3.0
每行代表一条线,坐标用空格分隔。 -
使用以下代码从文件中读取数据:
python
with open("your_file.txt", "r") as f:
lines = [((float(line.split()[0]), float(line.split()[1])), (float(line.split()[2]), float(line.split()[3]))) for line in f]
这将读取文件并将数据解析为
lines
列表,然后可以将其传递给
plot_lines_and_intersection(lines)
。