Проверьте, есть ли точка, которая лежит за пределами кругов

#c #algorithm #geometry

#c #алгоритм #геометрия

Вопрос:

Итак, я пытаюсь создать консольное приложение, которое проверяет, есть ли у него какие-либо N(x,y) точки за пределами n кругов.

Таким образом, программа работает идеально, когда есть один круг. Но когда я ввожу более одного круга, он не работает должным образом.

Вот мой код:

 #include <stdio.h>
#include <iostream>
#include <cmath>

using namespace std;
struct tokr {
    float x, y, r; int br;
};
struct ttoc {
    float x, y;
};
tokr circ[30];
ttoc points[20];
int brokr, brtoc;
void readOkr(tokr* ok) {
    cout << "x: "; cin >> ok->x;
    cout << "y: "; cin >> ok->y;
    cout << "r="; cin >> ok->r;
}
void readToc(ttoc* t) {
    cout << "x :"; cin >> t->x;
    cout << "y :"; cin >> t->y;
}
int main()
{
  int n, brToc;
  float dx,dy,r;
  bool outside;

  cout << "Number of circles: ";
  cin >> n;

  for(int i = 0; i <n; i  ) {
    readOkr(amp;circ[i]);
  }

  cout << "Number of points: ";
  cin >> brToc;

  for(int i = 0; i <brToc; i  ) {
    readToc(amp;points[i]);
  }

  for(int i = 0; i<brToc; i  ) {
    outside = false;
    for(int j = 0; j<n; j  ) {
        dx = abs(points[i].x - circ[j].x);
        dy = abs(points[i].y - circ[j].y);
        r = abs(pow(circ[j].r,2));
        if(pow(dx,2)   pow(dy,2) > r) {
           outside = true;
           break;
        }
    }
    if(outside) cout << "Point: " << i 1 << " is outside n";
  }


  return 0;
}
}
 

Тесты:

С одним кругом:

С одним кругом

С более чем 1 окружностью:

более 1

Ответ №1:

Не очень важные части, удаленные из ваших циклов, в основном таковы:

 for(int i = 0; i<brToc; i  ) {
outside = false;
for(int j = 0; j<n; j  ) {
    dx = ...;
    dy = ...;
    r = ...;
    if(pow(dx,2)   pow(dy,2) > r) {
       outside = true;
       break;
    }
}
if(outside) cout << "Point: " << i 1 << " is outside n";
 

Вы должны сравнить с r*r , потому что расстояние равно sqrt(dx^2 dy^2) . Однако это не главная проблема.

У вашего флага outside перевернута логика. Вы начинаете с того, что говорите, что точка находится внутри круга, и как только вы находите один круг, который не покрывает точку, вы говорите, что точка находится снаружи, и выходите из цикла. Только один «внешний» круг заставляет ваш код заключить, что точка не находится внутри какого-либо круга. Это неправильно.

Вместо этого вы должны начать с предположения, что точка не находится внутри какого-либо круга ( outside=true; ), и только когда вы обнаружите, что точка находится внутри одного из кругов, вы можете разорвать цикл (и установить outside=false; ).

Другими словами: в настоящее время ваш код проверяет, находятся ли точки за пределами любого из кругов, но, похоже, вы скорее хотите проверить, находится ли каждая из точек внутри любого из кругов.

Ответ №2:

Вы можете просто переключить это

  outside=false;
    //...other instructions...
    if(pow(dx,2)   pow(dy,2) > r) {
           outside = true;
           break;
        }
 

с

     outside=true;
//...other instruction...
outside=outisideamp;amp;sqrt(pow(dx, 2)   pow(dy, 2)) > r);