这题的思路是利用同向法求点是否包含在三角形内部:
假设点P位于三角形内,会有这样一个规律,当我们沿着ABCA的方向在三条边上行走时,你会发现点P始终位于边AB,BC和CA的右侧。我们就利用这一点,但是如何判断一个点在线段的左侧还是右侧呢?我们可以从另一个角度来思考,当选定线段AB时,点C位于AB的右侧,同理选定BC时,点A位于BC的右侧,最后选定CA时,点B位于CA的右侧,所以当选择某一条边时,我们只需验证点P与该边所对的点在同一侧即可。问题又来了,如何判断两个点在某条线段的同一侧呢?
两点p1(x1,y1),p2(x2,y2),判断点p(x,y)在线的左边还是右边:
Tmp = (y1 – y2) * x + (x2 – x1) * y + x1 * y2 – x2 * y1
Tmp > 0 在左侧
Tmp = 0 在线上
Tmp < 0 在右侧
所以,有了方法写程序就很简单了:# -*- coding: utf-8 -*-
"""
Created on Sat Jan 7 09:41:55 2017
@author: Jerry Xu
"""
def tend(a,b,p):
x1,y1 = a
x2,y2 = b
x, y = p
return (y1-y2)*x + (x2-x1)*y + x1*y2 -x2*y1
def judge(a,b,c):
d1 = tend(a,b,(0,0))
d2 = tend(b,c,(0,0))
d3 = tend(c,a,(0,0))
if (d1>0 and d2>0 and d3>0) or (d1<0 and d2<0 and d3<0): #我们只需判断是否同向即可,都左或者都右都可以。
return True
else:
return False
c = 0
with open('p102_triangles.txt') as f:
lines = f.readlines()
for line in lines:
line = line.strip('\n').split(',')
A = (int(line[0]),int(line[1]))
B = (int(line[2]),int(line[3]))
C = (int(line[4]),int(line[5]))
if judge(A,B,C):
c += 1
print (c)
输出:
228 |