Un maestro de matemáticas-K. La relación entre el punto y el triángulo (producto cruzado para encontrar el área)

Descripción Conociendo las
coordenadas de tres puntos A, B y C de un triángulo en un sistema de coordenadas plano, juzgue si otro punto D está en el triángulo (un punto en el lado del triángulo también se considera que está en el triángulo)

La entrada
tiene cuatro líneas con dos números en cada línea. Las primeras tres líneas representan las coordenadas de A, B y C, y la cuarta línea representa las coordenadas de D.

La salida
genera una cadena de caracteres, "in" significa que el punto D está dentro del triángulo ABC y "out" significa que el punto D está fuera del triángulo ABC.

Muestras
Entrada 复制
1.0 2.0
7.0 1.0
7.0 5.0
5.0 3.0
Salida
en

Idea:
Usa la relación de área de triángulos para juzgar la relación entre puntos y triángulos.
Suponga que el punto es P y los tres vértices del triángulo son A, B y C.
Calcule las áreas de los triángulos ABC, ABP, ACP y BCP respectivamente:
Si:
S (ABC) = S (ABP) + S (ACP) + S (BCP),
entonces el punto está en el triángulo o en el lado de el triangulo.
Entonces, el problema se transforma en encontrar el área del triángulo al conocer las coordenadas de los tres puntos del triángulo.
Hay varios métodos en Baidu en Internet, todos los cuales tienen errores de precisión:

double cul(node a,node b,node c){
    
    
    double x1=a.x,y1=a.y;
    double x2=b.x,y2=b.y;
    double x3=c.x,y3=c.y;
    return x1*y2-x1*y3+x2*y3-x2*y1+x3*y1-x2*y2;
}
double cul(node a,node b,node c)
{
    
    
    double x1=a.x,y1=a.y;
    double x2=b.x,y2=b.y;
    double x3=c.x,y3=c.y;
    double aa=sqrt( (x1-x2)*(x1-x2) + (y1-y2)*(y1-y2) );
    double bb=sqrt( (x3-x2)*(x3-x2) + (y3-y2)*(y3-y2) );
    double cc=sqrt( (x1-x3)*(x1-x3) + (y1-y3)*(y1-y3) );
    double pp=(aa+bb+cc)/2;
    double S=sqrt( pp*(pp-aa)*(pp-bb)*(pp-cc));
    return S;
}

Entonces Zhang Ju dijo que si podía usar el área del triángulo, me "mataría".
La idea de Zhang Ju es usar el producto cruzado para encontrar el área de un triángulo.
De acuerdo con el conocimiento de la escuela secundaria, suponiendo que los dos lados del triángulo son a, b, y el ángulo entre los dos lados es c, entonces el área del triángulo es a ∗ b ∗ sinc ∗ 1 2 a * b * sinc * \ frac {1} {2}aBs i n c21
La definición de producto cruzado es el producto de dos módulos vectoriales y luego multiplicado por el seno del ángulo incluido, que se puede convertir en cálculo de coordenadas.
Código:

#pragma GCC optimize(2)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<ll,ll>PLL;
typedef pair<int,int>PII;
typedef pair<double,double>PDD;
#define I_int ll
inline ll read()
{
    
    
    ll x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9')
    {
    
    
        if(ch=='-')f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9')
    {
    
    
        x=x*10+ch-'0';
        ch=getchar();
    }
    return x*f;
}
#define read read()
#define closeSync ios::sync_with_stdio(0);cin.tie(0);cout.tie(0)
#define multiCase int T;cin>>T;for(int t=1;t<=T;t++)
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define repp(i,a,b) for(int i=(a);i<(b);i++)
#define per(i,a,b) for(int i=(a);i>=(b);i--)
#define perr(i,a,b) for(int i=(a);i>(b);i--)
ll ksm(ll a,ll b,ll p)
{
    
    
    ll res=1;
    while(b)
    {
    
    
        if(b&1)res=res*a%p;
        a=a*a%p;
        b>>=1;
    }
    return res;
}
#define PI acos(-1)
const double eps=1e-10;
struct node
{
    
    
    double x,y;
    node operator - (node &s){
    
    
        return (node){
    
    x-s.x,y-s.y};
    }
};
double operator*(node a,node b){
    
    
    return a.x*b.y-b.x*a.y;
}
double cul(node a,node b,node c){
    
    
    return fabs((b-a)*(c-a)/2);
}
int main()
{
    
    

    node a,b,c,d;
    cin>>a.x>>a.y>>b.x>>b.y>>c.x>>c.y>>d.x>>d.y;
    double abc=cul(a,b,c);
    double abd=cul(a,b,d);
    double acd=cul(a,c,d);
    double bcd=cul(b,c,d);
    if(abd+acd+bcd==abc) puts("in");
    else puts("out");
    return 0;
}

Supongo que te gusta

Origin blog.csdn.net/weixin_45675097/article/details/114445589
Recomendado
Clasificación