El problema de los tres cuerpos de la civilización de las palomas (matemáticas)

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Idea: El significado general del título es darte muchas áreas triangulares. Los puntos en el plano se cubren una vez en un área triangular. Si cubren un número impar de veces, habrá gravedad, de lo contrario no existirá. .
Entonces, la clave de esta pregunta es juzgar si el punto (xqi, yqi) está en el área del triángulo .

Inserte la descripción de la imagen aquí

Juzgue si el punto p está dentro del triángulo:
use el método del área para determinar
si está dentro del triángulo, debe satisfacer SABC = S ABP + SACP + SBCP;

Debido a que este problema da las coordenadas de tres puntos,
el área del triángulo se calcula multiplicando el vector por / 2.

Área de ABC = vector AC producto cruzado vector AB;

#include <bits/stdc++.h>
using namespace std;
struct node{
    
    
    int x,y;
};
node a[10010][3];
double area(node A,node B,node C){
    
    
    double x1 = B.x - A.x;
    double x2 = C.x - A.x;
    double y1 = B.y - A.y;
    double y2 = C.y - A.y;
    return abs(x1*y2-x2*y1)/2.0;
}
int main()
{
    
    
    ios::sync_with_stdio(false); cin.tie(0),cout.tie(0);
    int n,q; cin>>n>>q;
    for(int i=0;i<n;i++){
    
    
        for(int j=0;j<3;j++){
    
    
            cin>>a[i][j].x>>a[i][j].y;
        }
    }
    while(q--){
    
    
        node xx; cin>>xx.x>>xx.y;
        int ans = 0;
        for(int i=0;i<n;i++){
    
    
            double area1 = area(a[i][0],a[i][1],a[i][2]);
            double area2 = area(a[i][0],a[i][1],xx)+area(a[i][0],a[i][2],xx)+area(a[i][1],a[i][2],xx);
            if(area1==area2) ans++;

        }
        if(ans%2==0) cout<<"No"<<endl;
        else cout<<"Yes"<<endl;
    }
    return 0;
}

Supongo que te gusta

Origin blog.csdn.net/qq_43811879/article/details/109630766
Recomendado
Clasificación