#include <iostream>
#include <ctime>
#include <cstdlib>
typedef double angle;
struct Cscan { // why class? This is clearly POD
int gran; //I don't know what gran is. Perhaps this should also be floating-point.
angle lockaz, lockel;
};
const double pi = 3.141592653589793; // Let's use radians internally, not degrees.
const angle rightangle = pi/2; // It's much handier for real calculations.
inline angle deg2rad(angle dg) { return dg * rightangle / 90.; }
angle random_in_sym_rightangle() {
return rightangle * ( ((double) rand()) / ((double) RAND_MAX) - .5 );
}
bool equal_in_margin(angle theta, angle phi, angle margin) {
return (theta > phi-margin && theta < phi+margin);
}
#define TRAVERSE_SYM_RIGHTANGLE(phi) \
for ( angle phi = -pi/4; phi < pi/4; phi += deg2rad(4) )
int lock_k // better give this a more descriptive name
( const Cscan& BS1, const Cscan& BS2, int k ) {
TRAVERSE_SYM_RIGHTANGLE(az1) {
TRAVERSE_SYM_RIGHTANGLE(el1) {
TRAVERSE_SYM_RIGHTANGLE(az2) {
TRAVERSE_SYM_RIGHTANGLE(el2) {
if( equal_in_margin( az1, BS1.lockaz, deg2rad(6) )
&& equal_in_margin( el1, BS1.lockel, deg2rad(6) )
&& equal_in_margin( az2, BS1.lockaz, deg2rad(6) )
&& equal_in_margin( el2, BS2.lockel, deg2rad(6) ) ) {
std::cout << "locked \n" << BS1.lockaz << " " << BS1.lockel << " " << BS2.lockaz << " " << BS2.lockel << '\n'
<< az1 << " " << el1 << " " << az2 << " " << el2 << std::endl;
return 1;
}
}
}
}
}
return k;
}
int main() {
srand (time(NULL));
int az1, az2, el1, el2, j, k;
Cscan BS1, BS2;
BS1.lockaz = random_in_sym_rightangle();
BS1.lockel = random_in_sym_rightangle();
BS2.lockaz = random_in_sym_rightangle();
BS2.lockel = random_in_sym_rightangle();
k = rand() % 2;
if(k == 0)
k = -1;
BS1.lockaz = k*BS1.lockaz;
k = rand() % 2;
if(k == 0)
k = -1;
BS1.lockel = k*BS1.lockel;
k = rand() % 2;
if(k == 0)
k = -1;
BS2.lockaz = k*BS2.lockaz;
k = rand() % 2;
if(k == 0)
k = -1;
BS2.lockel = k*BS2.lockel;
lock_k(BS1, BS2, k);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y3RpbWU+CiNpbmNsdWRlIDxjc3RkbGliPgoKdHlwZWRlZiBkb3VibGUgYW5nbGU7CgpzdHJ1Y3QgQ3NjYW4geyAgLy8gd2h5IGNsYXNzPyBUaGlzIGlzIGNsZWFybHkgUE9ECiAgaW50IGdyYW47IC8vSSBkb24ndCBrbm93IHdoYXQgZ3JhbiBpcy4gUGVyaGFwcyB0aGlzIHNob3VsZCBhbHNvIGJlIGZsb2F0aW5nLXBvaW50LgogIGFuZ2xlIGxvY2theiwgbG9ja2VsOwp9OwoKY29uc3QgZG91YmxlIHBpID0gMy4xNDE1OTI2NTM1ODk3OTM7ICAvLyBMZXQncyB1c2UgcmFkaWFucyBpbnRlcm5hbGx5LCBub3QgZGVncmVlcy4KY29uc3QgYW5nbGUgcmlnaHRhbmdsZSA9IHBpLzI7ICAgICAgLy8gIEl0J3MgbXVjaCBoYW5kaWVyIGZvciByZWFsIGNhbGN1bGF0aW9ucy4KCmlubGluZSBhbmdsZSBkZWcycmFkKGFuZ2xlIGRnKSB7IHJldHVybiBkZyAqIHJpZ2h0YW5nbGUgLyA5MC47IH0KCmFuZ2xlIHJhbmRvbV9pbl9zeW1fcmlnaHRhbmdsZSgpIHsKICByZXR1cm4gcmlnaHRhbmdsZSAqICggKChkb3VibGUpIHJhbmQoKSkgLyAoKGRvdWJsZSkgUkFORF9NQVgpIC0gLjUgKTsKfQoKYm9vbCBlcXVhbF9pbl9tYXJnaW4oYW5nbGUgdGhldGEsIGFuZ2xlIHBoaSwgYW5nbGUgbWFyZ2luKSB7CiAgcmV0dXJuICh0aGV0YSA+IHBoaS1tYXJnaW4gJiYgdGhldGEgPCBwaGkrbWFyZ2luKTsKfQoKI2RlZmluZSBUUkFWRVJTRV9TWU1fUklHSFRBTkdMRShwaGkpIFwKICBmb3IgKCBhbmdsZSBwaGkgPSAtcGkvNDsgcGhpIDwgcGkvNDsgcGhpICs9IGRlZzJyYWQoNCkgKQoKaW50IGxvY2tfayAgLy8gYmV0dGVyIGdpdmUgdGhpcyBhIG1vcmUgZGVzY3JpcHRpdmUgbmFtZQogICAgICAoIGNvbnN0IENzY2FuJiBCUzEsIGNvbnN0IENzY2FuJiBCUzIsIGludCBrICkgewogIFRSQVZFUlNFX1NZTV9SSUdIVEFOR0xFKGF6MSkgewogICAgVFJBVkVSU0VfU1lNX1JJR0hUQU5HTEUoZWwxKSB7CiAgICAgIFRSQVZFUlNFX1NZTV9SSUdIVEFOR0xFKGF6MikgewogICAgICAgIFRSQVZFUlNFX1NZTV9SSUdIVEFOR0xFKGVsMikgewogICAgICAgICAgaWYoIGVxdWFsX2luX21hcmdpbiggYXoxLCBCUzEubG9ja2F6LCBkZWcycmFkKDYpICkKICAgICAgICAgICAgICAgJiYgZXF1YWxfaW5fbWFyZ2luKCBlbDEsIEJTMS5sb2NrZWwsIGRlZzJyYWQoNikgKQogICAgICAgICAgICAgICAmJiBlcXVhbF9pbl9tYXJnaW4oIGF6MiwgQlMxLmxvY2theiwgZGVnMnJhZCg2KSApCiAgICAgICAgICAgICAgICYmIGVxdWFsX2luX21hcmdpbiggZWwyLCBCUzIubG9ja2VsLCBkZWcycmFkKDYpICkgKSB7CiAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAibG9ja2VkIFxuIiA8PCBCUzEubG9ja2F6IDw8ICIgIiA8PCBCUzEubG9ja2VsIDw8ICIgIiA8PCBCUzIubG9ja2F6IDw8ICIgIiA8PCBCUzIubG9ja2VsIDw8ICdcbicKICAgICAgICAgICAgICAgPDwgYXoxIDw8ICIgIiA8PCBlbDEgPDwgIiAiIDw8IGF6MiA8PCAiICIgPDwgZWwyIDw8IHN0ZDo6ZW5kbDsKICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQogIHJldHVybiBrOwp9CgppbnQgbWFpbigpIHsKICAgIHNyYW5kICh0aW1lKE5VTEwpKTsKICAgIGludCBhejEsIGF6MiwgZWwxLCBlbDIsIGosIGs7CgogICAgQ3NjYW4gQlMxLCBCUzI7CgogICAgQlMxLmxvY2theiA9IHJhbmRvbV9pbl9zeW1fcmlnaHRhbmdsZSgpOwogICAgQlMxLmxvY2tlbCA9IHJhbmRvbV9pbl9zeW1fcmlnaHRhbmdsZSgpOwogICAgQlMyLmxvY2theiA9IHJhbmRvbV9pbl9zeW1fcmlnaHRhbmdsZSgpOwogICAgQlMyLmxvY2tlbCA9IHJhbmRvbV9pbl9zeW1fcmlnaHRhbmdsZSgpOwoKCgogICAgayA9IHJhbmQoKSAlIDI7CiAgICBpZihrID09IDApCiAgICAgICAgICAgIGsgPSAtMTsKICAgIEJTMS5sb2NrYXogPSBrKkJTMS5sb2NrYXo7CgogICAgayA9IHJhbmQoKSAlIDI7CiAgICBpZihrID09IDApCiAgICAgICAgICAgIGsgPSAtMTsKICAgIEJTMS5sb2NrZWwgPSBrKkJTMS5sb2NrZWw7CgogICAgICAgICAgICBrID0gcmFuZCgpICUgMjsKICAgIGlmKGsgPT0gMCkKICAgICAgICAgICAgayA9IC0xOwogICAgQlMyLmxvY2theiA9IGsqQlMyLmxvY2thejsKCiAgICBrID0gcmFuZCgpICUgMjsKICAgIGlmKGsgPT0gMCkKICAgICAgICAgICAgayA9IC0xOwogICAgQlMyLmxvY2tlbCA9IGsqQlMyLmxvY2tlbDsKCiAgICBsb2NrX2soQlMxLCBCUzIsIGspOwoKICB9ICAgICAgIA==