"""
有一个n边形(P0,P1,P2...Pn),每一边皆为垂直或者水平,现在给定数值k,
以P0为起点,将n边形的周长分成k段,每一段等长,请打印出所有的k等分点的坐标。
"""
分析:
主要的思想就是先求出所有线段的总长,然后求出k等分线段的长度,然后去找k等分点的坐标。因为每个边不是垂直就是水平,这样我们就可以通过x或者y坐标的差值得到线段的长度,同时还需要考虑到线段的方向性(四个方向),终点到起点的线段长度也要单独的考虑。代码如下:
def k_equal(a_list, k):
"""
K等分点
:param a_list: n边形坐标列表
:param k: 分成k段
:return: 等分点的坐标
"""
n = len(a_list)
lines_len = 0 # 定义线段长度
line_direction = [] # 1代表垂直上,2代表水平右,-1代表垂直下,-2代表水平左
line_len_list = [] # 记录每段线段的长度
for i in range(n-1):
# 如果x坐标相等,就是垂直线段,y坐标差就是线段长度
if a_list[i][0] == a_list[i + 1][0]:
line_len = abs(a_list[i + 1][1] - a_list[i][1])
lines_len += line_len
line_len_list.append(line_len)
if a_list[i + 1][1] - a_list[i][1] > 0:
line_direction.append(1)
else:
line_direction.append(-1)
# 如果y坐标相等,就是水平线段,x坐标差就是线段长度
if a_list[i][1] == a_list[i + 1][1]:
line_len = abs(a_list[i + 1][0] - a_list[i][0])
lines_len += line_len
line_len_list.append(line_len)
if a_list[i + 1][0] - a_list[i][0] > 0:
line_direction.append(2)
else:
line_direction.append(-2)
# 加上终点到起点的线段
if a_list[0][0] == a_list[n - 1][0]:
line_len = abs(a_list[0][1] - a_list[n - 1][1])
lines_len += line_len
line_len_list.append(line_len)
if a_list[0][1] - a_list[n - 1][1] > 0:
line_direction.append(1)
else:
line_direction.append(-1)
if a_list[0][1] == a_list[n - 1][1]:
line_len = abs(a_list[0][0] - a_list[n - 1][0])
lines_len += line_len
line_len_list.append(line_len)
if a_list[0][0] - a_list[n - 1][0] > 0:
line_direction.append(2)
else:
line_direction.append(-2)
equal_line = lines_len / k # 等分线段长度
tmp_equal_line = equal_line # 存储等分线段长度
m = len(line_direction)
k_list = [] # 存储k等分点坐标
for j in range(m):
# 垂直上线段
if line_direction[j] == 1:
# 当前线段上有多个等分点的情况
if equal_line <= line_len_list[j]:
base = 0 # 记录当前k坐标起点
while equal_line <= line_len_list[j]:
k_list.append((float(a_list[j][0]), a_list[j][1] + (equal_line + base)))
base += equal_line
line_len_list[j] -= equal_line
equal_line = tmp_equal_line
equal_line = tmp_equal_line - line_len_list[j]
else:
equal_line -= line_len_list[j]
# 垂直下线段
elif line_direction[j] == -1:
# 当前线段上有多个等分点的情况
if equal_line <= line_len_list[j]:
base = 0 # 记录当前k坐标起点
while equal_line <= line_len_list[j]:
k_list.append((float(a_list[j][0]), a_list[j][1] - (equal_line + base)))
base += equal_line
line_len_list[j] -= equal_line
equal_line = tmp_equal_line
equal_line = tmp_equal_line - line_len_list[j]
else:
equal_line -= line_len_list[j]
# 水平右线段
elif line_direction[j] == 2:
# 当前线段上有多个等分点的情况
if equal_line <= line_len_list[j]:
base = 0 # 记录当前k坐标起点
while equal_line <= line_len_list[j]:
k_list.append((a_list[j][0] + (equal_line + base), float(a_list[j][1])))
base += equal_line
line_len_list[j] -= equal_line
equal_line = tmp_equal_line
equal_line = tmp_equal_line - line_len_list[j]
else:
equal_line -= line_len_list[j]
# 水平左线段
else:
# 当前线段上有多个等分点的情况
if equal_line <= line_len_list[j]:
base = 0 # 记录当前k坐标起点
while equal_line <= line_len_list[j]:
k_list.append((a_list[j][0] - (equal_line + base), float(a_list[j][1])))
base += equal_line
line_len_list[j] -= equal_line
equal_line = tmp_equal_line
equal_line = tmp_equal_line - line_len_list[j]
else:
equal_line -= line_len_list[j]
print(k_list)
alist = [(1, 2), (1, 3), (5, 3), (5, 2)]
k_equal(alist, 5)