Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
struct Pt {
double x, y;
Pt(double _x = 0, double _y = 0) : x(_x), y(_y) {}
Pt operator+(const Pt& o) { return Pt(x+o.x, y+o.y); } // soma de vetores
Pt operator-(const Pt& o) { return Pt(x-o.x, y-o.y); } // subtração de vetores
Pt operator*(double b) { return Pt(x*b, y*b); } //retorna o vetor escalado por b
void operator+=(const Pt& o) { x += o.x, y += o.y; } // somar vetores com o operador +=
void operator-=(const Pt& o) { x -= o.x, y -= o.y; } // subtrair vetores com o operador -=
void operator*=(double b) { x*=b, y*=b; } //retorna o vetor escalado por b
double dot(const Pt& o) { return x*o.x + y*o.y; } // dot - produto escalar
double cross(const Pt& o) { return x*o.y - y*o.x; } // cross - produto vetorial
bool isleft(const Pt& o) {return cross(o) > 0;} // retorna se o esta para a esquerda
};
pair<bool, Pt> intersec(Pt A, Pt B, Pt C, Pt D){
//Se não houver interseccao, o valor bolleano será falso
//Se houver, retornamos o valor como verdadeiro, e o ponto de interseccao
if(!((B-A).isleft(C-A) != (B-A).isleft(D-A) && (D-C).isleft(A-C) != (D-C).isleft(B-C))){
//Sabemos que não há intersecção
return {false,Pt(0,0)};
}
B -= A;
C -= A;
D -= A;
double alphaini = 0, alphafim = 1;
for(int i = 0; i < 100; i++){
double mid = (alphaini + alphafim)/2;
Pt P = (B*mid);
if((D-C).isleft(P-C) == (D-C).isleft(B-C)) alphafim = mid;
else alphaini = mid;
}
return {true,Pt{(B*alphaini) + A}};
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment