给定的三个坐标可以是矩形的点吗

问题描述 投票:0回答:1

我目前正在学习如何用 Python 编写代码,我遇到了这个任务,我正在尝试解决它。但我认为我在某个地方犯了错误,我想知道也许有人可以帮助我。任务是编写一段代码,该代码将: 从文本文件导入四个 2D 坐标(A、B、C 和 X) 检查 A、B、C 是否可以是矩形的点 检查X是否在ABC矩形内 计算矩形的对角线。

到目前为止我有这个:

import math

def distance(point1, point2):
    return math.sqrt((point2[0] - point1[0])**2 + (point2[1] - point1[1])**2)

def is_rectangle(point1, point2, point3):
    distances = [
        distance(point1, point2),
        distance(point2, point3),
        distance(point3, point1)
    ]

    distances.sort()

    if distances[0] == distances[1] and distances[1] != distances[2]:
        return True
    else:
        return False
def is_inside_rectangle(rectangle, point):
    x_values = [vertex[0] for vertex in rectangle]
    y_values = [vertex[1] for vertex in rectangle]

    if (min(x_values) < point[0] < max(x_values)) and (min(y_values) < point[1] < max(y_values)):
        return True
    else:
        return False

with open('coordinates.txt', 'r') as file:
    coordinates = []
    for line in file:
        x, y = map(int, line.strip()[1:-1].split(','))
        coordinates.append((x, y))

rectangle = [coordinates[0], coordinates[1], coordinates[2]]
diagonal1 = distance(coordinates[0], coordinates[2])
diagonal2 = distance(coordinates[1], coordinates[3])
if is_rectangle(coordinates[0], coordinates[1], coordinates[2]) and is_inside_rectangle(rectangle, coordinates[3]):
    print("True")
    print(f"Diagonal of the rectangle is: {max(diagonal1, diagonal2)}")

else:
    print("False")

代码可以工作,但我认为它计算对角线是错误的。例如,我们将这些点作为输入:A(0, 0)、B(5,0)、C(0, 5) 和 X(2, 2)。它说它们可以是矩形的点,对角线是 5。当我把这些点放在纸上时,第四个点可以是 D(5, 5),然后对角线是 7.07(50 的平方根)。或者它可以是 D(-5, 5),但它是一个平行四边形,一条对角线是 5,但它不是最大的。 另外,我正在尝试编写一个函数来检查文本文件中的所有数据是否都是整数。假设 B 是 (m, k),那么它应该返回 false,如果所有数据都是整数,则继续执行代码。对此有什么想法吗?

python math coordinates
1个回答
0
投票

让我们看看您的

is_rectangle
函数的逻辑。

def is_rectangle(point1, point2, point3):
    distances = [
        distance(point1, point2),
        distance(point2, point3),
        distance(point3, point1)
    ]

    distances.sort()

    if distances[0] == distances[1] and distances[1] != distances[2]:
        return True
    else:
        return False

您正在测试三角形 ABC 的两条最小边是否相等,并且与最大边是否不同。

有效回答问题:“ABC 是等腰三角形吗?”

但是你应该问的问题是:“ABC 是一个三角形吗?”

有多种方法可以测试三角形 ABC 是否是直角三角形。

  • 一种方法是检查三对向量 (AB,AC)、(BA,BC)、(CA,CB) 中的一对是否正交,即其点积是否为 0。
  • 另一种方法是检查三个距离 AB、AC、BC 是否构成毕达哥拉斯三元组,即当
    z**2 == x**2 + y**2
    x,y,z = sorted(map(distances,itertools.combinations(points,2)))
  • 是否为真

PS:一般情况下写

if condition: return True else: return False
时,不妨直接写
return condition

考虑到这一点,您在 python 中为此函数编写的代码相当于:

from itertools import combinations

def is_acute_isosceles_triangle(point1, point2, point3):
    distances = sorted(map(distance, combinations((point1,point2,point3), 2)))
    return (distances[0] == distances[1] and distances[1] != distances[2])
© www.soinside.com 2019 - 2024. All rights reserved.