点和圆的关系 [2190767]

预备知识

  • 两个坐标点 p1(x1,y1)、p2(x2,y2) 直接的距离为:


  • 判断点和圆的关系,只需要计算该点和圆心的距离 d,和圆的半径 r 进行比较:
    • 如果 d = r,则点在圆上
    • 如果 d < r,则点在圆内
    • 如果 d > r,则点在圆外

思路、步骤

  • 设计点类(Pointer)
    • 成员变量:x轴坐标(int x),y轴坐标(int y)
    • 成员方法:公共的访问方法 void setX(int x)、int getX()、void setY(int y)、int getY()
  • 设计圆类(Circle)
    • 成员变量:圆心(Pointer center)、半径(int radius)
    • 成员方法:公共的访问方法 void setCenter(int x, int y)、void setRadius(int radius)、判断点和圆关系 void isPointerInCircle(Pointer& point)
  • void isPointerInCircle(Pointer& point) 实现思路
根据计算点和圆心的距离的公式可知,需要对数据应用开跟运算,比较麻烦。这里可以不开跟,得到的结果就是两点之间距离的平方,直接和圆半径的平法进行比较即可:
    • 如果 d的平方 = r的平方,则点在圆上
    • 如果 d的平方 < r的平方,则点在圆内
    • 如果 d的平方 > r的平方,则点在圆外

代码实现

#include <iostream>
using namespace std;

// 点类
class Pointer {

private:
    int x;  // x 坐标
    int y;  // y 坐标

public:
    void setX(int x) {
        this->x = x;
    }

    int getX() {
        return x;
    }

    void setY(int y) {
        this->y = y;
    }

    int getY() {
        return y;
    }

};

// 圆类
class Circle {

private:
    Pointer center;	// 圆心
    int radius;	// 半径

public:
    void setCenter(int x, int y) {
        center.setX(x);
        center.setY(y);
    }

    void setRadius(int radius) {
        this->radius = radius;
    }

	void isPointerInCircle(Pointer& point) {
        // 计算点和圆心的距离
        int distance = (point.getX() - center.getX()) * (point.getX() - center.getX())
            + (point.getY() - center.getY()) * (point.getY() - center.getY());

        int r = radius * radius;

        if (distance < r) {
            cout << "in" << endl;
        }
        else if (distance == r) {
            cout << "on" << endl;
        }
        else {
            cout << "out" << endl;
        }

    }
};

int main() {

    // 键盘输入点的坐标
    int x, y;
    cin >> x;
    cin >> y;

    // 创建一个点
    Pointer p;
    p.setX(x);
    p.setY(y);

    // 创建一个圆
    Circle c;
    c.setCenter(5, 0);
    c.setRadius(5);

    // 判断点和圆的关系
    c.isPointerInCircle(p);

    return 0;
}