点和直线的关系

题目描述

平面直角坐标系中有一个点 CC 和一条直线 ABAB ,求点 CC 和直线 ABAB 的位置关系。

输入描述

第一行输入一个 TT ,代表测试数据量

每组测试数据输入有三行,每行一个实数坐标 (x, y)(x,y) 分别代表 A, B, CA,B,C 三个点。

1≤T≤10^3,−10^5≤x,y≤10^5。

输出描述

如果点 C 在直线 AB 上, 输出IN , 如果点 C 在直线 AB 左侧,输出L, 如果点 C 在直线 AB 右侧输出R

样例输入

3
0 1
1 0
1 1
0 0
1 1
2 2
0 0
0 1
1 0

样例输出

L
IN
R

思路

我们首先介绍一个概念:叉积

叉积是两个矢量模的乘积再乘夹角正弦,经过推导可以发现两个向量A(x1,y1),B(x2,y2)的叉积为:

                                                x1∗y2−x2∗y1

在本题中我们输入三个点的坐标,在函数中直接计算向量CA,CB的值,再带入到叉积的计算中,算出叉积,这个函数实际上求的是CA*CB=|CA||CB|sinθ

def Cross(A,B,C):
    return (A[0]-C[0])*(B[1]-C[1])-(B[0]-C[0])*(A[1]-C[1])

 我们注意Cross的正负是有特殊含义的。如下图,Multi即为Cross,以p0为参考点,下图为向量p0p1和p0p2的叉积。如果Cross大于0,则p0p2在p0p1的逆时针方向,p0在p1p2的左边。反之,如果Cross小于0,则p0p2在p0p1的顺时针方向,p0在p1p2的右边。特殊的,当Cross等于0,p1、p2、p0三点共线。

原理:A*B= |A|*|B|sinθ,其中这个角度可以想象为平面中有一坐标,它的值就是角P2P0x-角P1P0x的值。而我们题目中的要求的方向是A->B,即上图中P1->P2,所以当Cross>0,说明c在AB左边,<0,说明在右边。

代码

def Cross(A,B,C):
    return (A[0]-C[0])*(B[1]-C[1])-(B[0]-C[0])*(A[1]-C[1])

def area(p1,p2,p3):
    s=Cross(p1, p2, p3)
    if s>0:
        print("L")
    elif s<0:
        print("R")
    else:
        print("IN")

t=int(input())
for i in range(t):
    a=tuple(map(float,input().split()))
    b=tuple(map(float,input().split()))
    c=tuple(map(float,input().split()))
    area(a, b, c)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晓宜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值