fork download
  1. #include <iostream>
  2. #include <math.h>
  3.  
  4.  
  5. using namespace std;
  6.  
  7. int main() {
  8. double xA,yA, xB,yB;
  9. int count = 0;
  10. int n;
  11.  
  12. cin >> xA >> yA >> xB >> yB; // Координаты A и B отрезка:
  13. cin >> n; // Количество окружностей
  14.  
  15. double **Arr = new double* [3]; // Задаем массив для кругов, в каждой строчке которого будут хранится x,y,r круга
  16. for (int i = 0; i < n; i++)
  17. Arr[i] = new double [3];
  18.  
  19. for (int i = 0; i < n; i++) {
  20. for (int j = 0; j < 3; j++) {
  21. cin >> Arr[i][j];
  22. }
  23. }
  24. double r12 = sqrt((xB-xA)*(xB-xA) + (yB-yA)*(yB-yA)); // Длина отрезка от A до B
  25. for (int i = 0; i < n; i++) {
  26. double r1 = sqrt((Arr[i][0]-xA)*(Arr[i][0]-xA) + (Arr[i][1]-yA)*(Arr[i][1]-yA)); // Длина отрезка от т. M до A
  27. double r2 = sqrt((Arr[i][0]-xB)*(Arr[i][0]-xB) + (Arr[i][1]-yB)*(Arr[i][1]-yB)); // Длина отрезка от т. M до B
  28.  
  29. if (((r12*r12+r1*r1) - r2*r2) >= 0 && ((r12*r12+r2*r2) - r1*r1) >= 0) { // Если перпендикуляр опущенный на прямую, проведенную через A u B лежит на отрезке AB, то проверяем, равен или больше ли радиус окружности
  30. double d = (fabs((yB-yA)*Arr[i][0] + (xB-xA)*Arr[i][1] + (xA*yB-yA*xB)))/sqrt((yB-yA)*(yB-yA) + (xB-xA)*(xB-xA));
  31. if ((Arr[i][2] - d) >= 0) {
  32. count++;
  33. }
  34. }
  35. else { // Иначе, если перпендикуляр опущенный на прямую лежит вне отрезка, то проверяем, равен или больше ли радиус одному из отрезков от точки М до А или В
  36. if ((Arr[i][2] - r1) >= 0 || (Arr[i][2] - r2) >= 0) {
  37. count++;
  38. }
  39. }
  40. }
  41. cout << count;
  42.  
  43. return 0;
  44. }
Success #stdin #stdout 0s 3476KB
stdin
10 10
10 20
2
10 10 5
10 20 5
stdout
Standard output is empty