判斷多個坐標是否在同一條直線上|Python練習系列[13]


練習內容:判斷多個坐標是否在同一條直線上

代碼演示視頻

完整代碼和注釋如下

print('請輸入幾個點的橫縱坐標,程序將會返回這幾個點是否在同一條直線上')
def coor_nums():#獲得每個值的橫縱坐標
	int_list=[]#初始化坐標列表
	wrong_list=[]#初始化錯誤列表
	judgement=''#判斷是否需要修正坐標值
	while True:
		nums=input('應以x1 y1 x2 y2...的格式輸入:\n')
		num_list=nums.split()
		if len(num_list)%2!=0:#如果輸入的坐標長度不是偶數 說明輸入錯誤
			print('請輸入每個點的橫縱坐標')
			continue
		for n in num_list:#對輸入的每個值
			try:
				num=float(n)
				int_list.append(num)#嘗試將輸入的值轉為浮點類型添加到坐標列表中
			except Exception as e:#如果發生異常
				print('你輸入的第'+str(num_list.index(n)+1)+'個值為:'+n+',它不是數字 請按照要求輸入')#提示修改
				wrong_list.append([num_list.index(n),n])#將錯誤坐標值的索引和錯誤坐標值都添加到錯誤列表
				int_list.append(n)#同時也將錯誤坐標值添加到坐標列表 便於修改
				judgement='need'#判斷為need 即需要修改
		return int_list,wrong_list,judgement
int_list,wrong_list,judgement=coor_nums()
def adjust(wrong_list):#調整錯誤列表並且修改對應坐標列表
	right_list=[]#初始化修改后的列表
	for wrong_num in wrong_list:#對於每個錯誤值
		while True:#循環修改直到修改正確
			right_num_input=input('正在修改第{}個值,原值為:{},現值為:\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('修改值仍然錯誤,請再次修改')
				continue
	return right_list
def k_line_judge(int_list,wrong_list,judgement):#判斷輸入點是否在同一條直線
	if judgement=='need':#如果為need則需要調整初次輸入的坐標值
		right_list=adjust(wrong_list)
		for n in right_list:
			int_list[n[0]]=n[1]#把每個修改后的值賦予坐標列表
	point_judge=list(set(int_list))
	if len(point_judge)==1:#如果輸入的每個值相同 說明是同一個點
		return print('所有點是同一個點 為({},{})'.format(point_judge[0],point_judge[0]))
	k_list=[]#初始化直線斜率列表
	for n in range(3,len(int_list),2):#處理坐標列表
		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)#嘗試向斜率列表中增加每兩個點的斜率
		except ZeroDivisionError as e:#如果出現了x2-x1=0的情況 暫時先略過
			pass
		if n==len(int_list)-1 and len(k_list)==0:#如果循環到最后 直線斜率列表長度仍然為0
			return print('所有點在直線x={}上'.format(int_list[0]))#說明輸入的坐標都在直線x=x1上
	set_k_list=list(set(k_list))
	if len(set_k_list)==1 and set_k_list[0]==0:#如果直線斜率列表長度為1 並且k=0 說明輸入坐標都在y=y1上
		print('所有點在直線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('所有點在直線y={}x{}上'.format(round(line_k,5),line_b))
		else:
			print('所有點在直線y={}x+{}上'.format(round(line_k,5),line_b))
	elif len(set_k_list)!=1:#如果斜率列表長度不為1說明不在同一條直線上
		print('所有點不在同一條直線上')
k_line_judge(int_list,wrong_list,judgement)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM