CodeGo.net>如何绘制石原变换(圆圈没有交集的圆圈)?

问题:我需要在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无关

上一篇:python – 如何计算两条线的交点?


下一篇:python-在OpenGL中逼近球体