繁体   English   中英

检查是否有一个点位于圆圈之外

[英]Check if theres a point that lies outside of circles

所以我正在尝试制作一个控制台应用程序来检查它是否在n圆圈之外有任何N(x,y)点。

因此,当有一个圆圈时,程序可以完美运行。 但是当我进入多个圈子时,它无法正常工作。

这是我的代码:

#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(&circ[i]);
  }

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

  for(int i = 0; i <brToc; i++) {
    readToc(&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; )。

换句话说:目前您的代码检查点是否在任何圆圈之外,但您似乎更想检查每个点是否在任何圆圈内。

你可以切换这个

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

    outside=true;
//...other instruction...
outside=outiside&&sqrt(pow(dx, 2) + pow(dy, 2)) > r);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM