Segmentos de Poj (use la multiplicación cruzada para determinar la intersección de los segmentos de línea)

  • Segmentos

  • El significado
    de la pregunta: Dé algunos segmentos de línea y pregunte si hay una línea recta para que las proyecciones de estos segmentos de línea en la línea recta tengan un punto común.

  • Ideas Después de
    leer un blog de un gran dios, me di cuenta de que el problema se puede transformar en si hay una línea recta m que interseca todos los segmentos de línea, y la línea recta l perpendicular am es la línea recta deseada.
    Podemos enumerar la combinación de dos por dos de los puntos finales de dos segmentos de línea (los dos puntos finales se toman de diferentes segmentos de línea) como un segmento de línea de la línea recta m (en realidad, porque el segmento de línea dado es limitado, por lo que si hay una línea recta m, puede Tome un segmento de la línea para intersecar todos los segmentos de línea dados), ¿por qué enumeramos la línea formada por los dos puntos finales de dos segmentos de línea diferentes? Suponiendo que esta línea existe, siempre podemos mover la línea en paralelo hasta que alcance el punto final de un cierto segmento de línea, y luego rotar la línea con el punto final como eje, y definitivamente rotará hasta el punto final de otro segmento de línea, entonces Está probado, y es el segmento de línea que cumple la condición (que interseca el segmento de línea dado) tomado de la línea requerida m. ¿Cómo juzgar la intersección de dos segmentos de recta? Sabemos que a × ba \ times bun×b = | a | | b | pecado ⁡ θ \ sin \ thetasinθ . Cuando el ángulo entre los dos vectores es mayor que 108 °, el producto del producto cruzado es negativo (tenga en cuenta quea × b ≠ b × aa \ times b \ not = b \ times aun×segundo=segundo×a , aunque el valor absoluto es el mismo, el positivo y el negativo son opuestos).
    Use la regla de la mano derecha para determinar la dirección de la cruz
    Si los segmentos de línea ab y cd se intersecan, hayca ⃗ × cb ⃗ \ vec {ca} \ times \ vec {cb}c a ×c b da ⃗ × db ⃗ \ vec {da} \ times \ vec {db}d a ×d b Signo diferente y da ⃗ × ca ⃗ \ vec {da} \ times \ vec {ca}d a ×c a Y db ⃗ × cb ⃗ \ vec {db} \ times \ vec {cb}d b ×c b También diferente
    Inserte la descripción de la imagen aquí

  • Código

#pragma GCC optimize(2)
//#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>

using namespace std;

typedef long long ll;
typedef unsigned long ul;
typedef unsigned long long ull;
#define pi acos(-1.0)
#define e exp(1.0)
#define pb push_back
#define mk make_pair
#define fir first
#define sec second
#define scf scanf
#define prf printf
typedef pair<ll,ll> pa;
const ll INF=0x3f3f3f3f3f3f3f3f;
const int MAX_N=116;
const double eps=1e-8;
int N,T;
struct node{
    
    
	double x,y;
}seg_l[MAX_N],seg_r[MAX_N];
double gao(node a,node b,node tmp){
    
    
	double x1,x2,y1,y2;
	x1=a.x-tmp.x;
	y1=a.y-tmp.y;
	x2=b.x-tmp.x;
	y2=b.y-tmp.y;
	return x1*y2-x2*y1;
}
bool do_(node a,node b){
    
    
	int i,j;
	if(fabs(a.x-b.x)<eps&&fabs(a.y-b.y)<eps)
	return 0;
	for(i=1;i<=N;i++){
    
    
		if(gao(a,b,seg_l[i])*gao(a,b,seg_r[i])>eps)
		return 0;
	} 
	return 1;
	
} 
int main()
{
    
    
//  freopen(".../.txt","w",stdout);
//  freopen(".../.txt","r",stdin);
	ios::sync_with_stdio(false);
	cin>>T;
	int i,j;
	while(T--){
    
    
		cin>>N;
		for(i=1;i<=N;i++){
    
    
			cin>>seg_l[i].x>>seg_l[i].y>>seg_r[i].x>>seg_r[i].y;
		} 
		if(N==1){
    
    
			cout<<"Yes!"<<endl;
			continue;
		}
		bool flag=0;
		for(i=1;i<=N;i++){
    
    
			for(j=i+1;j<=N;j++){
    
    
				if(do_(seg_l[i],seg_l[j]))
				flag=1;
				else if(do_(seg_l[i],seg_r[j]))
				flag=1;
				else if(do_(seg_r[i],seg_l[j]))
				flag=1;
				else if(do_(seg_r[i],seg_r[j]))
				flag=1;
//				if(flag)
//				break;
			}
			if(flag)
			break;
		}
		if(flag)
		cout<<"Yes!"<<endl;
		else
		cout<<"No!"<<endl;
	}
	return 0;
}

Supongo que te gusta

Origin blog.csdn.net/weixin_43311695/article/details/108782366
Recomendado
Clasificación