判断多个坐标是否在同一条直线上|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)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值