Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# c语言中的圆问题#_C#_Oop_Methods_Geometry - Fatal编程技术网

C# c语言中的圆问题#

C# c语言中的圆问题#,c#,oop,methods,geometry,C#,Oop,Methods,Geometry,这部分我需要帮助 旁注:我有两个圆圈 我需要创建5种方法来确定圆是否: 相交(圆c) 切出(圆c) 切向(圆) 不相交(圆) 并包含(圆圈) (基本上,我需要确定另一个圆c是否与该圆相交,是否从外部与该圆相切,是否在该圆内但在某一点相交,是否在该圆外而不接触,是否完全在该圆内。) 为了确定它是否与另一个圆相交,我编写了以下代码: public bool intersect(Circle c) { Point p = new Point(), myCenter

这部分我需要帮助

旁注:我有两个圆圈

  • 我需要创建5种方法来确定圆是否:
相交(圆c)

切出(圆c)

切向(圆)

不相交(圆)

并包含(圆圈)

(基本上,我需要确定另一个圆c是否与该圆相交,是否从外部与该圆相切,是否在该圆内但在某一点相交,是否在该圆外而不接触,是否完全在该圆内。)

为了确定它是否与另一个圆相交,我编写了以下代码:

    public bool intersect(Circle c)
    {
        Point p = new Point(), myCenter = new Point();
        p.setPoint(c.x, c.y);
        myCenter.setPoint(x, y);

        return myCenter.dist(p) < radius + c.radius;
    }
我的班级:

class Circle : Point
{
    private double radius;
    public Circle(double xV, double yV, double r)
    {
        this.x = xV;
        this.y = yV;
        this.radius = r;
    }
    public void setRadius(double r)
    {
        radius = r > 0 ? radius : 0;
    }

    public bool onCircle(Point p)
    {
        return dist(p) == radius;
    }

    public bool intersect (Circle c)
    {
        Point p = new Point (), myCenter = new Point();
        p.setPoint (c.x, c.y);
        myCenter.setPoint (x, y);

        return myCenter.dist(p) < radius + c.radius;
    }
    public void print()
    {
        Console.Write("Circle: ({0}, {1}, {2})", x, y, radius);
    }
}

您应该重新检查交叉点的逻辑。现在的方法只适用于一个圆未完全包围另一个圆时不相交的圆。您选择测试的情况,同心圆,显示为中心之间的距离为0,实际上小于半径之和。另一种可能无法捕捉的情况是单个退化交点


我建议读一读关于圆交点的文章,想出一个更好的测试方法

你的编码风格看起来有点不确定-我会帮你算算的

取两个圆,A(中心
c1
,半径
r1
)和B(中心
c2
,半径
r2
)。设
d=c1.dist(c2)

  • 切出
    :条件是
    d=r1+r2
  • d=abs(r2-r1)
  • 不相交的
    d>r1+r2
  • 包含
    d

此外,考虑到数值精度,将任何等式更改为delta epsilon比较。例如,
a=b
变为
abs(a-b)
,其中
E
是某个最大阈值。

您的
相交
方法看起来应该会产生准确的结果,但由于
来自
可以大大简化:

public bool intersect(Circle c)
{
    return dist(c) < radius + c.radius;
}
调整比例因子以满足您的精度要求。然后你可以这样做:

public bool tangentOut(Circle c)
{
    return dist(c).EpsilonEquals(radius + c.radius);
}

public bool tangentIn(Circle c)
{
    return dist(c).EpsilonEquals(Math.Abs(c.radius - radius));
}

如果myCenter.dist(p)>半径+c半径,则无交点。但是没有对等。你是什么意思?如果大于,是否会脱节?是否交叉点脱节。在您的示例中,两个圆(0,0,1)和(0,0,5)vérify myCenter.dist(p)=0,radius+c.radius=6,因此myCenter.dist(p)radius+c.radius与此类似:返回Math.Abs(dist(p)-radius)<0.0001;我用这个作为我的一个代码,看看这个点是非常接近圆还是在圆环上。@LebronJamess是的,这正是我的意思。这些条件对你有用吗?我很好奇。您编写的条件是否与我为intersect编写的代码相同。无视上述评论。我对上述条件进行了编码。你认为我可以得到两个圆的一些示例点来测试每个条件下的代码吗?
public bool intersect(Circle c)
{
    return dist(c) < radius + c.radius;
}
public bool tangentOut(Circle c)
{
    return dist(c) == radius + c.radius;
}

public bool tangentIn(Circle c)
{
    return dist(c) == Math.Abs(c.radius - radius);
}

public bool disjoint(Circle c)
{
    return dist(c) > radius + c.radius;
}

public bool contains(Circle c)
{
    return dist(c) <= radius - c.radius
}
public static class Extensions
{
    public static bool EpsilonEqual(this double l, double r, double eScale = 1e+9)
    {
        double d = Math.Abs(l - r);
        double e = Math.Abs(Math.Max(l, r)) / 1e+9;
        return d <= e;
    }
}
public bool tangentOut(Circle c)
{
    return dist(c).EpsilonEquals(radius + c.radius);
}

public bool tangentIn(Circle c)
{
    return dist(c).EpsilonEquals(Math.Abs(c.radius - radius));
}