Python 只考虑三角形内部的一些点';内部';三角形

Python 只考虑三角形内部的一些点';内部';三角形,python,pygame,trigonometry,Python,Pygame,Trigonometry,我一直在尝试制作一个简单的pygame程序,检查光标是否在三角形的内部或外部。我通过找到大三角形的面积,然后从鼠标位置到所有三个点制作三个内部三角形,并找到它们的面积 根据我的理解,如果三个内部三角形的面积之和等于总面积之和,那么点就在三角形内部。但是,我的代码只返回它位于三角形内部特定像素上的三角形,而不是整个区域 我不确定这是一个数学错误还是一个编程错误,但下面是代码: 导入pygame 从数学导入sqrt pygame.init() DISPLAY=pygame.DISPLAY.set_模

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

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

我不确定这是一个数学错误还是一个编程错误,但下面是代码:

导入pygame
从数学导入sqrt
pygame.init()
DISPLAY=pygame.DISPLAY.set_模式((400400))
def drawTriangle(点A、点B、点C、颜色):
多边形(显示,颜色,[pointA,pointB,pointC],5)
def getLine(点A、点B):
返回sqrt((点B[0]-点A[0])**2+(点B[1]-点A[1])**2)
def getArea(点A、点B、点C):
AB=getLine(点A、点B)
BC=getLine(点B、点C)
CA=getLine(点C,点A)
s=(AB+BC+CA)/2
返回sqrt(s*(s-AB)*(s-BC)*(s-CA))
A=[100100]
B=[200100]
C=[150200]
颜色=(255、255、255)
虽然(正确):
对于pygame.event.get()中的事件:
如果event.type==pygame.QUIT:
pygame.quit()
打破
mpx,mpy=pygame.mouse.get_pos()
posArray=[mpx,mpy]
drawTriangle(A、B、C、颜色)
面积=获取面积(A、B、C)
trigA=getArea(A、B、posArray)
trigB=getArea(posArray,B,C)
trigC=getArea(A,posArray,C)
如果(trigA+trigB+trigC==面积):
颜色=(0,255,0)
其他:
颜色=(255、255、255)
pygame.display.update()

到目前为止,我最好的猜测是这是一个取整问题,但如果是的话,我不确定如何解决这个问题。我认为通过使用第一个if语句a,我建议使用更有效的算法来计算三角形的面积。可在以下位置找到算法:

def getArea(点A、点B、点C):
x1,y1=点A
x2,y2=点B
x3,y3=点C
返回abs((x1*(y2-y3)+x2*(y3-y1)+x3*(y1-y2))/2.0)
注意,您也可以使用自己的算法。但是

if(trigA+trigB+trigC==面积):
比较浮点数。由于浮点数的精度有限,此测试失败(请参阅)。
你必须考虑一个ε。做
abs(a-b)
而不是
a==b
。它不是比较两个对象的值,而是将差异与一个足够低的值进行比较,以确保值是相同的。e、 g:

如果abs(trigA+trigB+trigC-面积)<0.001:
颜色=(0,255,0)
其他:
颜色=(255、255、255)

是的,3个新三角形的区域“重叠”,可能会出现一些像素化,产生比目标更大的区域。如果将所有坐标乘以10或更多,然后找到区域,会发生什么情况?@quamrana这不是问题,问题原本是只有特定的像素显示在三角形内部,而绝大多数没有。正如我所怀疑的,这是一个比较准确的问题,这对我很有帮助。谢谢你的帮助。如果我正确理解epsilon,那么它不是比较两个对象的值,而是将差值与一个足够低的值进行比较,这个值足以保证值是相同的?@NetherMan是的,没错。好吧,这确实很有意义,肯定是我在学习的过程中错过的东西。