python输入多个坐标点_判断多个坐标是否在同一条直线上|Python练习系列[13]
練習(xí)內(nèi)容:判斷多個(gè)坐標(biāo)是否在同一條直線上
完整代碼和注釋如下
print('請輸入幾個(gè)點(diǎn)的橫縱坐標(biāo),程序?qū)?huì)返回這幾個(gè)點(diǎn)是否在同一條直線上')
def coor_nums():#獲得每個(gè)值的橫縱坐標(biāo)
int_list=[]#初始化坐標(biāo)列表
wrong_list=[]#初始化錯(cuò)誤列表
judgement=''#判斷是否需要修正坐標(biāo)值
while True:
nums=input('應(yīng)以x1 y1 x2 y2...的格式輸入:\n')
num_list=nums.split()
if len(num_list)%2!=0:#如果輸入的坐標(biāo)長度不是偶數(shù) 說明輸入錯(cuò)誤
print('請輸入每個(gè)點(diǎn)的橫縱坐標(biāo)')
continue
for n in num_list:#對輸入的每個(gè)值
try:
num=float(n)
int_list.append(num)#嘗試將輸入的值轉(zhuǎn)為浮點(diǎn)類型添加到坐標(biāo)列表中
except Exception as e:#如果發(fā)生異常
print('你輸入的第'+str(num_list.index(n)+1)+'個(gè)值為:'+n+',它不是數(shù)字 請按照要求輸入')#提示修改
wrong_list.append([num_list.index(n),n])#將錯(cuò)誤坐標(biāo)值的索引和錯(cuò)誤坐標(biāo)值都添加到錯(cuò)誤列表
int_list.append(n)#同時(shí)也將錯(cuò)誤坐標(biāo)值添加到坐標(biāo)列表 便于修改
judgement='need'#判斷為need 即需要修改
return int_list,wrong_list,judgement
int_list,wrong_list,judgement=coor_nums()
def adjust(wrong_list):#調(diào)整錯(cuò)誤列表并且修改對應(yīng)坐標(biāo)列表
right_list=[]#初始化修改后的列表
for wrong_num in wrong_list:#對于每個(gè)錯(cuò)誤值
while True:#循環(huán)修改直到修改正確
right_num_input=input('正在修改第{}個(gè)值,原值為:{},現(xiàn)值為:\n'.format(wrong_num[0]+1,wrong_num[1]))
try:
right_num=float(right_num_input)
right_list.append([wrong_num[0],right_num])#將修改值添加到正確列表
break
except Exception as e:
print('修改值仍然錯(cuò)誤,請?jiān)俅涡薷?#39;)
continue
return right_list
def k_line_judge(int_list,wrong_list,judgement):#判斷輸入點(diǎn)是否在同一條直線
if judgement=='need':#如果為need則需要調(diào)整初次輸入的坐標(biāo)值
right_list=adjust(wrong_list)
for n in right_list:
int_list[n[0]]=n[1]#把每個(gè)修改后的值賦予坐標(biāo)列表
point_judge=list(set(int_list))
if len(point_judge)==1:#如果輸入的每個(gè)值相同 說明是同一個(gè)點(diǎn)
return print('所有點(diǎn)是同一個(gè)點(diǎn) 為({},{})'.format(point_judge[0],point_judge[0]))
k_list=[]#初始化直線斜率列表
for n in range(3,len(int_list),2):#處理坐標(biāo)列表
try:
k=(int_list[n]-int_list[n-2])/(int_list[n-1]-int_list[n-3])#斜率公式k=(y2-y1)/(x2-x1)
k_list.append(k)#嘗試向斜率列表中增加每兩個(gè)點(diǎn)的斜率
except ZeroDivisionError as e:#如果出現(xiàn)了x2-x1=0的情況 暫時(shí)先略過
pass
if n==len(int_list)-1 and len(k_list)==0:#如果循環(huán)到最后 直線斜率列表長度仍然為0
return print('所有點(diǎn)在直線x={}上'.format(int_list[0]))#說明輸入的坐標(biāo)都在直線x=x1上
set_k_list=list(set(k_list))
if len(set_k_list)==1 and set_k_list[0]==0:#如果直線斜率列表長度為1 并且k=0 說明輸入坐標(biāo)都在y=y1上
print('所有點(diǎn)在直線y={}上'.format(int_list[1]))
elif len(set_k_list)==1 and set_k_list[0]!=0:#如果直線斜率列表長度為1 并且k不等于0
line_k=set_k_list[0]#說明在一條y=kx+b的直線上
line_b=int_list[1]-int_list[0]*line_k#b=y-kx
if float(line_b)<=0:#分為b>0和b<=0兩種打印情況
print('所有點(diǎn)在直線y={}x{}上'.format(round(line_k,5),line_b))
else:
print('所有點(diǎn)在直線y={}x+{}上'.format(round(line_k,5),line_b))
elif len(set_k_list)!=1:#如果斜率列表長度不為1說明不在同一條直線上
print('所有點(diǎn)不在同一條直線上')
k_line_judge(int_list,wrong_list,judgement)
總結(jié)
以上是生活随笔為你收集整理的python输入多个坐标点_判断多个坐标是否在同一条直线上|Python练习系列[13]的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何调整小米路由器的信道小米路由器如何调
- 下一篇: 列举python中常用的数据类型_列举P