Java 如何检查圆是否重叠

Java 如何检查圆是否重叠,java,graph,encoding,geometry,Java,Graph,Encoding,Geometry,我正在写一个程序,检查一个圆是否包含另一个圆,某个点是否在圆内,或者我遇到问题的点是否与另一个圆重叠 import javafx.scene.shape.Circle; public class Problem10_11 { public static void main(String[] args) { //Create circle with certain parameters. Circle2D c1 = new Circle2D(2, 2, 5.

我正在写一个程序,检查一个圆是否包含另一个圆,某个点是否在圆内,或者我遇到问题的点是否与另一个圆重叠

import javafx.scene.shape.Circle;
public class Problem10_11 {
    public static void main(String[] args) {
        //Create circle with certain parameters.
        Circle2D c1 = new Circle2D(2, 2, 5.5);

        //Create output which will be tested by all our methods.
        System.out.println("The area for circle 1 is " +c1.getArea()+ 
                " and its perimeter is " + c1.getPerimeter());
        System.out.println("Is (3,3) contained within circle 1? " 
                + c1.contains(3, 3));
        System.out.println("Does circle 1 contain circle 2? " 
                + c1.contains(new Circle2D(4,5,10.5)));
        System.out.println("Does circle 1 overlap with circle 3? " 
                + c1.overlaps(new Circle2D(3, 5, 2.3)));
    }
}
class Circle2D {
    double x; //first parameter
    double y; //second parameter
    double radius; //third parameter

    Circle2D() {
    }
    public Circle2D(double x, double y, double radius) {
        this.x = x;
        this.y = y;
        this.radius = radius;
    }
    public void setX(double x) {
        this.x = x;  //set x
    }
    public double getX() {
        return x; //grab x
    }
    public void setY(double y) {
        this.y = y; //set y
    }
    public double getY() {
        return y; //grab y
    }
    public void setRadius(double radius) {
        this.radius = radius; //set radius
    }
    public double getRadius() {
        return radius; //grab radius
    }
    public double getArea() {
            double area = Math.PI*radius*radius; //formula for area
                return area;
    }
    public double getPerimeter() {
            double perimeter = 2*Math.PI*radius; //formula for perimeter
                return perimeter;
    }
    public boolean contains(double x, double y) {
        //Use distance formula to check if a specific point is within our circle. 
            double distance = Math.sqrt(Math.pow(this.x - x, 2) + (Math.pow(this.y - y, 2)));
            if (distance  <= radius * 2)
                return true;
            else {
                return false;
            }
    }
    public boolean contains(Circle2D circle) {
        //Use distance formula to check if a circle is contained within another circle.
        double distance = Math.sqrt(Math.pow(circle.getX() - x, 2) + (Math.pow(circle.getY() - y, 2)));
        if (distance <= (this.radius - circle.radius)) {
            return true;
        } else {
            return false;
        }
    }
    public boolean overlaps(Circle2D circle) {
        //Use distance formula to check if a circle overlaps with another circle.
            double distance = Math.sqrt(Math.pow(circle.getX() - x, 2) + (Math.pow(circle.getY() - y, 2)));



    }
}
导入javafx.scene.shape.Circle;
公共课问题10_11{
公共静态void main(字符串[]args){
//创建具有特定参数的圆。
Circle2D c1=新的Circle2D(2,2,5.5);
//创建将由我们所有方法测试的输出。
System.out.println(“圆圈1的面积为”+c1.getArea()+
其周长为“+c1.getPermiture());
System.out.println(“是否(3,3)包含在圆1中?”
+c1.含有(3,3));
System.out.println(“圆圈1是否包含圆圈2?”
+c1.包含(新圆圈2D(4,5,10.5));
System.out.println(“圆圈1与圆圈3重叠吗?”
+c1.重叠(新圆圈2D(3,5,2.3));
}
}
类圆形2D{
double x;//第一个参数
双y;//第二个参数
双半径;//第三个参数
圆圈2d(){
}
公共圆2D(双x、双y、双半径){
这个.x=x;
这个。y=y;
这个半径=半径;
}
公共无效集x(双x){
this.x=x;//设置x
}
公共双getX(){
返回x;//抓取x
}
公共空间设置(双y){
this.y=y;//设置y
}
公共双盖{
返回y;//抓取y
}
公共空间设置半径(双半径){
this.radius=radius;//设置半径
}
公共双getRadius(){
返回半径;//抓取半径
}
公共区域(){
双面积=Math.PI*半径*半径;//面积公式
返回区;
}
公共双边界{
双周长=2*Math.PI*半径;//周长公式
返回周长;
}
公共布尔包含(双x,双y){
//使用距离公式检查特定点是否在圆内。
double distance=Math.sqrt(Math.pow(this.x-x,2)+(Math.pow(this.y-y,2));

如果(距离如果圆心之间的距离小于两个圆的半径之和,则它们重叠

double minDistance = Math.max(circle.getRadius(),this.radius) - Math.min(circle.getRadius(),this.radius);
    if (distance <= (this.radius + circle.getRadius()) && distance>= minDistance) return true;
            else return false;
double minDistance=Math.max(circle.getRadius(),this.radius)-Math.min(circle.getRadius(),this.radius);
如果(距离=距离)返回true;
否则返回false;

1.-必须将两个圆都放在空间中,给它们一些坐标
2.-必须从两个圆中获取向量。
3.-你必须规范化这些向量并以单位获得正确的距离, 我将使用像素。
4.-最后,你必须检查这两个向量之间的距离是否小于两个圆的半径,如果是,那么它们是重叠的。
这里有一个更好解释的链接: ,实际上,这是我们在游戏开发中非常常用的一种方法,当我们想要检查圆碰撞时(对于2D游戏)

您可以参考

公共布尔重叠(圆形2D圆形){
//使用距离公式检查一个圆是否与另一个圆重叠。
双距离=Math.sqrt(Math.pow(circle.getX()-x,2)+(Math.pow(circle.getY()-y,2));
返回距离=Math.abs(this.radius-circle.radius)
}

是的,但是如果圆包含在一个圆内,它不会给出正确的结果吗?是的,在这种情况下,它们确实重叠,并且一个包含在另一个圆内,如果你想
false
在这种情况下,你还需要一个条件,即距离应该大于两个圆中较大的圆的半径。这里有更好的计算方法这里是最小距离,但想法是一样的,距离应该大于两个圆半径的差。编辑我用一个重叠的图形尝试了这个,它给了我假输出。尝试了这个,仍然给了我真输出,当它应该是假。太棒了,尝试了多个场景,这确实有效:)泰!一定是误会了,因为这对我的处境毫无帮助。画一幅画。
double minDistance = Math.max(circle.getRadius(),this.radius) - Math.min(circle.getRadius(),this.radius);
    if (distance <= (this.radius + circle.getRadius()) && distance>= minDistance) return true;
            else return false;
public boolean overlaps(Circle2D circle) {
        //Use distance formula to check if a circle overlaps with another circle.
        double distance = Math.sqrt(Math.pow(circle.getX() - x, 2) + (Math.pow(circle.getY() - y, 2)));
        return distance <= (this.radius + circle.radius) and distance >= Math.abs(this.radius - circle.radius)
}