《python语言程序设计》第4章第31题和第32题结合更加无法判断点是否在线段上的问题

2022-06-11

又是一个新的问题。

一个判断点是否在线段上的题。这个题的上一个题是通过判断点在线段的左、中、右三个方向。
按原书中的内容编写程序。发现和原书的完全不一样。
我最后在今天找到了一个比较合理的答案,
非常感谢写这个公式的作者,谢谢

以下,是我截取他文章的内容。

怎么判断坐标为(xp,yp)的点P是在直线的哪一侧呢?
设直线是由其上两点(x1,y1),(x2,y2)确定的,直线方向是由(x1,y1)到(x2,y2)的方向。
假设直线方程为:Ax+By+C=0,则有:
    A=y2-y1;   B=x1-x2;  C=x2y1-x1y2;
这时可以通过计算D,来判断点P是在直线的哪一侧:
    D=Axp+Byp+C
若D<0,则点P在直线的左侧;若D>0,则点P在直线的右侧;若D=0,则点P在直线上。*

我利用这个算法修正了,确定点在左、中、右三个方向时,原书中的错误。

但是我继续有这个公式做下一个题,也就是确定点是否在线段上的时候。这个公式又不好使了。

4.31和4.32两个题的内容见下图

在这里插入图片描述
在这里插入图片描述

现在4.31题我的PYTHON程序如下

p0X, p0Y = eval(input("Enter coordinates for the p0 is x,y "))
p1X, p1Y = eval(input("Enter coordinates for the p1 is x,y "))
p2X, p2Y = eval(input("Enter coordinates for the p2 is x,y "))

a = p1Y - p0Y
b = p0X - p1X
c = p1X * p0Y - p0X * p1Y
d = (a * p2X) + (b * p2Y) +c

if d < 0:
    print("p2 is on the left side of the line from p0 to p1")

elif d > 0:
    print("p2 is on the right side of the line from p0 to p1")

elif d == 0:
    print("p2 is on the same line from p0 to p1")

4.32题的PYTHON程序如下:

x0, y0 = eval(input("Enter coordinates for the p0 is x,y "))
x1, y1 = eval(input("Enter coordinates for the p1 is x,y "))
x2, y2 = eval(input("Enter coordinates for the p2 is x,y "))

a = y1-y0
b = x0-x1
c = x1 * y0 - x0 * y1
d = (a * x2) + (b * y2) + c

if d == 0:
    print(f"{x2, y2} is on the line segment  from {x0, y0} to {x1, y1}")
else:
    print(f"{x2, y2} is not on the line segment  from {x0, y0} to {x1, y1}")

现在的问题是输入4.32题的测试结果,2个结果全都是点在线段上。

我开始怀疑是不是我的条件有问题。但是从4.31来看d <0 , >0, =0的结果都是对的。所以这个疑问让我有些琢磨不透。

2022-11-30 回看今天这个文章。我也有点不明白。我写的。有时间再详细记录。

现在有异议 特声明一下

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

电饭叔

谢谢各位兄弟们的关注,谢谢破费

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值