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种方法来确定圆是否:
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));
}