如何编写读取一对坐标的代码并检查给定点是不是在一个圆内和一个矩形外?

Posted

技术标签:

【中文标题】如何编写读取一对坐标的代码并检查给定点是不是在一个圆内和一个矩形外?【英文标题】:How to write a code that reads a pair of coordinates and checks for given point if it is within a circle and out of a rectangle?如何编写读取一对坐标的代码并检查给定点是否在一个圆内和一个矩形外? 【发布时间】:2017-06-30 10:31:55 【问题描述】:

我是新来的。我尝试学习 C# 的基础知识,那是我的第一语言。我在互联网上发现了一个让我发疯的任务。我认为主要是数学部分给我带来了麻烦。我希望任何人都可以帮助我。这是任务:

编写一个程序,读取一对坐标 x 和 y,并使用表达式检查给定点 (x, y) 是否在圆 K(1, 1, 1.5) 内和矩形外R(顶部=1,左侧=-1,宽度=6,高度=2)。

输入

您将在输入的两行收到一对坐标 - 在第一行您将找到 x,在第二行 - y。

输出

如果点在圆内,则在圆内打印,如果在外,则在圆外。如果该点在矩形内部,则打印一个空格,然后在矩形内部打印,否则在矩形外部打印。有关视觉描述,请参阅示例测试。 约束

坐标 x 和 y 始终是 [-1000, 1000] 范围内的有效浮点数。

到目前为止我已经这样做了:

static void Main()

    double x = double.Parse(Console.ReadLine());
    double y = double.Parse(Console.ReadLine());
    double centerx = 1;
    double centery = 1;
    double r = 1.5;

    double widthR = 6;
    double HighR = 2;
    double topY = 0 + (HighR / 2);
    double rightX = 0 + (widthR / 2);
    double bottomY = 0 - (HighR / 2);
    double leftX = 0 - (widthR / 2);
    double rectanglePointX = x - (-1);
    double rectanglePointY = y - 1;

    bool IsInsideC = (x - centerx) * (x - centerx) + (y - centery) * (y - centery) <= r * r;
    bool IsInsideR = ((rectanglePointY< topY) && (rectanglePointY > bottomY) && (rectanglePointX < rightX) && (rectanglePointX > leftX));
    if (IsInsideC ==false && IsInsideR== false)
    
        Console.WriteLine("outside circle outside rectangle");
    
    else if (IsInsideC == true && IsInsideR == true)
    
        Console.WriteLine("inside circle inside rectangle");
    
    else if (IsInsideC == false && IsInsideR == true)
    
        Console.WriteLine("otside circle inside rectangle");
    
    else
    
        Console.WriteLine("inside circle outside rectangle");
    

提前致谢!

【问题讨论】:

代码有什么问题? 你还没有说出问题所在! 【参考方案1】:

提取方法,保持你的解决方案简单,不要重复自己:

private static bool IsWithinRectangle(double x, double y, 
    double left, double top, double width, double height) 

    // y should be below the top - y <= top and above the bottom: y >= top - height 
    return (x >= left) && (x <= left + width) && 
           (y <= top) && (y >= top - height); 


private static bool IsWithinCircle(double x, double y,
                                    double centerX, double centerY, double r) 
  return (x - centerX) * (x - centerX) + (y - centerY) * (y - centerY) <= r * r;

然后使用这些方法:

double pointX = ...
double pointY = ...

if (!IsWithinRectangle(pointX, pointY, ...) && 
     IsWithinCircle(pointX, pointY, ...)) 
     ...

测试:

  // Circle:
  double centerx = 1;
  double centery = 1;
  double r = 1.5;

  // Rectangle:
  double left = -1;
  double top = 1;
  double width = 6;
  double height = 2;

  // Point to test:
  double x = 2.5;
  double y = 2.0;

  string rectTest = IsWithinRectangle(x, y, left, top, width, height) 
    ? "within rect" 
    : "outside rect";

  string circleTest = IsWithinCircle(x, y, centerx, centery, r) 
    ? "within circle" 
    : "outside circle";

  Console.Write(string.Join(" & ", circleTest, rectTest));

结果:

  outside circle & outside rect

【讨论】:

它很好地定义了坐标是否在圆内,但它在矩形内会产生一些错误。我遇到了同样的问题。 @Julian Docev:请提供一个反例(“...它在矩形内产生一些错误...”);我建议一个点 (x, y) 在矩形内当且仅当 x[left..left+with] 范围内且 y[top..top+height] 范围内 在任务中检查结果。圆环还可以,但矩形并不总是。 ;x=2.5 y =2 - 外圆外矩形; x=0 y = 1 - 矩形内圆内; x= 2.5 y = 1 - 矩形内圆内; x= 1 y = 2 - 内圆外矩形。 @Julian Docev:我明白了,我们必须从top减去(y &lt;= top) &amp;&amp; (y &gt;= top - height):y 应该低于 @987654332 @ 你能更好地解释一下整个方程式吗,因为我不确定我是否理解;)【参考方案2】:

首先您必须了解这不是一个特定于编程的问题。 要创建程序,请按以下步骤操作:

在纸上手动写下解决此数学问题的每一步。 检查重复的步骤并将它们放在一起。 编写一个简单的伪代码(英文程序的简单表示)。 用任何编程语言转换伪代码。

通过这种方法,您几乎可以将程序中的所有数学问题转换为任何语言。

要求:

    对问题概念的理解(这里是如何在纸上数学中解决同样的问题) 基本编程知识

希望这会有所帮助。 :-)

【讨论】:

是的,数学不是我最强的一面,这就是我寻求帮助的原因:)【参考方案3】:

我认为这就是你所需要的 - Equation for testing if a point is inside a circle

如果这没有帮助,这里是另一个 - Check if point is inside a circle

这里是如何检查矩形 - Finding whether a point lies inside a rectangle or not

【讨论】:

以上是关于如何编写读取一对坐标的代码并检查给定点是不是在一个圆内和一个矩形外?的主要内容,如果未能解决你的问题,请参考以下文章

如何检查给定坐标是不是属于多边形? (离线地理围栏)

检查给定区域/坐标内的点的算法

如何测试一个点是不是在二维整数坐标中的凸多边形内?

查找用户是不是在给定坐标的给定距离内

如何设计一种分治算法来检查数组中是不是存在一对ai,aj使得ai-aj = M?

给定两个矩形的坐标,找出矩形是不是重叠