问题:我需要在C#/ VB.NET中绘制以下图片
请注意,我的问题不是在C#中绘制圆.
我的问题是绘制它们时没有太多空格且没有交集.
我的想法是使用“轨道”,然后以“轨道”线为中心绘制圆. (有些绕线较大,有些绕线较小)
问题在于不应有交叉路口.
有人有更好的主意吗?
或如何测试给定半径的绘制圆是否会与已经存在的圆相交?
解决方法:
圆的交点很容易计算:如果沿x的差的平方加上沿y的差的平方小于半径之和的平方,则圆相交.
请注意,这已经进行了一些优化,因为它避免了平方根.其他优化是可能的,例如当沿x的差大于半径之和时,它们将永不相交.
只需针对所有现有圈子测试新圈子,即可完成.
这是O(n ^ 2),但是很容易并且非常快,因为每个测试只是几个快速的操作.
当然,您可以寻找一种优化方法,不必针对每个圆圈都对每个圆圈进行测试,但这是昂贵的,大量的代码,因此仅对于很多圆圈而言才值得.首先尝试简单的解决方案.
在C代码中(对不起,我不会说VB):
struct { double x, y, r; } Circle;
bool circleIsAllowed(const std::vector<Circle>& circles, const Circle& newCircle)
{
for(std::vector<Circle>::const_iterator it = circles.begin(); it != circles.end(); ++it) // foreach(Circle it in circles)
{
double sumR = it->r + newCircle.r; // + minimumDistanceBetweenCircles (if you want)
double dx = it->x - newCircle.x;
double dy = it->y - newCircle.y;
double squaredDist = dx*dx + dy*dy;
if (squaredDist < sumR*sumR) return false;
}
return true; // no existing circle overlaps
}
编辑:更正了一些小错误,并注意到该问题与C无关