gpt4 book ai didi

python - 仅三角形内部的一些点被视为 'inside' 三角形

转载 作者:行者123 更新时间:2023-12-01 00:16:40 26 4
gpt4 key购买 nike

我一直在尝试制作一个简单的 pygame 程序来检查光标是否在三角形内部或外部。我通过找到较大三角形的面积,然后从鼠标位置到所有三个点制作三个内部三角形并找到它们的面积来完成此操作。

根据我的理解,如果三个内部三角形的面积之和等于总面积之和,则该点在三角形内部。但是,我的代码仅返回它位于三角形内部的特定像素,而不是整个区域。

我不确定这是数学错误还是编程错误,但无论如何,这里是代码:

import pygame
from math import sqrt

pygame.init()
DISPLAY = pygame.display.set_mode((400, 400))

def drawTriangle(pointA, pointB, pointC, color):
pygame.draw.polygon(DISPLAY, color, [pointA, pointB, pointC], 5)

def getLine(pointA, pointB):
return sqrt((pointB[0] - pointA[0])**2 + (pointB[1]-pointA[1])**2)

def getArea(pointA, pointB, pointC):

AB = getLine(pointA, pointB)
BC = getLine(pointB, pointC)
CA = getLine(pointC, pointA)

s = (AB + BC + CA) / 2

return sqrt(s*(s-AB) * (s-BC) * (s-CA))

A = [100, 100]
B = [200, 100]
C = [150, 200]
Color = (255, 255, 255)

while(True):

for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
break

mpx, mpy = pygame.mouse.get_pos()
posArray = [mpx, mpy]

drawTriangle(A, B, C, Color)

Area = getArea(A, B, C)

trigA = getArea(A, B, posArray)
trigB = getArea(posArray, B, C)
trigC = getArea(A, posArray, C)

if(trigA + trigB + trigC == Area):
Color = (0, 255, 0)

else:
Color = (255, 255, 255)

pygame.display.update()

到目前为止,我最好的猜测是这是一个舍入问题,但我不确定如何解决这个问题。我认为通过创建第一个 if 语句 <= 可以修复舍入错误,并且确实改善了结果,但它仍然不完美。如有任何帮助,我们将不胜感激。

最佳答案

我建议使用更有效的算法来计算三角形的面积。可以在 Check whether a given point lies inside a triangle or not 找到算法。 :

def getArea(pointA, pointB, pointC): 
x1, y1 = pointA
x2, y2 = pointB
x3, y3 = pointC
return abs((x1*(y2-y3) + x2*(y3-y1)+ x3*(y1-y2))/2.0)

请注意,您仍然可以使用自己的算法。但是

if(trigA + trigB + trigC == Area):

比较 float 。由于 float 的精度有限,此测试失败(请参阅 Floating-point arithmetic - Accuracy problems )。
您必须考虑一个epsilon。做abs(a - b) < epsilon而不是a == b 。它不是比较两个对象的值,而是将差异与足够低的值进行比较,以确保这些值相同。例如:

if abs(trigA + trigB + trigC - Area) < 0.001:
Color = (0, 255, 0)
else:
Color = (255, 255, 255)

关于python - 仅三角形内部的一些点被视为 'inside' 三角形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59289954/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com