#include #include #include #include #include #include using namespace std; ifstream fin("squares.txt"); #define cin fin struct Square { int x, y, l; double a, b; // 原点から {右下角, 左上角} を望んだ角度 }; double calc_dist_to_edge(Square &s, double angle) { double middle_angle = atan2((double)s.y, (double)s.x); if (angle < middle_angle) // 右下半分 return s.y / sin(angle); else return s.x / cos(angle); } int count_visible_squares(vector &squares) { vector angles; for (int i = 0; i < squares.size(); i++) { angles.push_back(squares[i].a); angles.push_back(squares[i].b); } sort(angles.begin(), angles.end()); set visible_squares; for (int i = 0; i < angles.size() - 1; i++) { if (angles[i+1] - angles[i] < 1e-8) continue; int visible_square = -1; double min_dist = 1e8; for (int j = 0; j < squares.size(); j++) { if (squares[j].a <= angles[i] && angles[i+1] <= squares[j].b) { double dist = calc_dist_to_edge(squares[j], angles[i]); if (dist < min_dist) { visible_square = j; min_dist = dist; } } } if (visible_square != -1) visible_squares.insert(visible_square); } return visible_squares.size(); } int main() { int n; while (cin >> n, n) { vector squares; for (int i = 0; i < n; i++) { Square s; cin >> s.x >> s.y >> s.l; s.a = atan2((double)s.y, (double)s.x+s.l); s.b = atan2((double)s.y+s.l, (double)s.x); squares.push_back(s); } cout << count_visible_squares(squares) << endl; } return 0; }