#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:
Не очень важные части, удаленные из ваших циклов, в основном таковы:
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);