测试1000点随机3个点创建三角形, 判断其余997个点在三角形内还是外

list = []

import random

for i in range(1000): # 随机生成1000个点保存到list列表
    x = random.randint(1, 1000)
    y = random.randint(1, 1000)
    list1 = []
    list1.append(x)
    list1.append(y)
    list.append(list1)
# print('list:%s' % list)

point1 = ''
point2 = ''
point3 = ''
for j in range(3): # 随机抽取三个点保存到point1,2,3中
    index = random.randint(0, 999)
    if j == 0:
        point1 = list[index]
    elif j == 1:
        point2 = list[index]
    elif j == 2:
        point3 = list[index]

print(point1, point2, point3)


def func(a, b):
    def line(x):
        return a * x + b

    return line

from fractions import Fraction  # 引入分数模块
# 根据一般式求出直线方程
a1 = point2[1] - point1[1]  # y2-y1
b1 = point1[0] - point2[0]  # x1-x2
c1 = point2[0] * point1[1] - point1[0] * point2[1]  # x2*y1-x1*y2
A1 = Fraction(-a1 , b1)
B1 = Fraction(-c1 , b1)
line1 = func(A1, B1)

a2 = point3[1] - point2[1]  # y2-y1
b2 = point2[0] - point3[0]  # x1-x2
c2 = point3[0] * point2[1] - point2[0] * point3[1]  # x2*y1-x1*y2
A2 = Fraction(-a2 , b2)
B2 = Fraction(-c2 , b2)
line2 = func(A2, B2)

a3 = point3[1] - point1[1]  # y2-y1
b3 = point1[0] - point3[0]  # x1-x2
c3 = point3[0] * point1[1] - point1[0] * point3[1]  # x2*y1-x1*y2
A3 = Fraction(-a3 , b3)
B3 = Fraction(-c3 , b3)
line3 = func(A3, B3)

m = [(A1, str(B1)), (A2, str(B2)), (A3, str(B3))]# 按照斜率从小到大排序
print(sorted(m))
n = sorted(m)

a1 = n[2][0]  # 最大直线斜率
b1 = Fraction(n[2][1])

a2 = n[1][0]  # 第二大直线斜率
b2 = Fraction(n[1][1])

a3 = n[0][0]  # 最小直线斜率
b3 = Fraction(n[0][1])

Line1 = func(a1, b1)  # 斜率最大的直线
Line2 = func(a2, b2)  # 斜率第二大的直线
Line3 = func(a3, b3)  # 斜率最小的直线

waimian = []
xianshang = []
limian = []

for l in list:
    if l[1]>Line1(l[0]):  # 点在斜率最大直线外面一定在三角形外
        waimian.append(l)
        continue
    elif l[1]<Line2(l[0]):
        waimian.append(l)
        continue
    elif l[1]>Line3(l[0]):
        waimian.append(l)
        continue
    elif l[1]==Line1(l[0]) or l[1]==Line2(l[0]) or l[1]==Line3(l[0]):
        xianshang.append(l)
        continue
    else:
        limian.append(l)

print('三角形外面:%s '%waimian)
print('在线上:%s'% xianshang)
print('三角形里面:%s'%limian)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值