问倒好几个人的有关问题,实在是想不出什么很好的办法去实现,求大神帮个忙写个算法吧

问倒好几个人的问题,实在是想不出什么很好的办法去实现,求大神帮个忙写个算法吧
本帖最后由 xiaofeilongw 于 2012-11-04 20:38:18 编辑
问倒好几个人的有关问题,实在是想不出什么很好的办法去实现,求大神帮个忙写个算法吧,如图,红色大区域包含了很多黄色的小区域,这些区域都是由线段和圆弧组成的;线段和圆弧数据结构为:1.Line,startX,startY,endX,endY;2.Arc,centerX,centerY,startX,startY,endX,endY,ClockwiseFlag;一个不规则图形可以由这两种数据任意组成;大区域和小区域均是如此;现在需要判断一个半径为12.7的圆能否放入这个大区域内,且不包含或部分包含黄色的小区域;如果可以,求出能放入该圆的圆心所在处;另如图问倒好几个人的有关问题,实在是想不出什么很好的办法去实现,求大神帮个忙写个算法吧这种情况需要放入半径为12.7的圆2个,换句话说一个区域只要放一个就可以了。。。。。麻烦大神们帮个忙吧,实在是比较急啊。。。。用C++和MFC都可
------解决方案--------------------
没有太好的办法,我会楞找:

令圆的半径是 r;
for (x=0;x<屏幕宽度;x++)
for (y=0;y<屏幕高度;y++)
{
    for Each Item x In S do
    {
       switch(x 的类型)
       {
       case 线段:
           if (该线段上所有的点与 (x,y) 的距离均>r) return (x,y);
           break;
       case 弧:
           if (该弧上所有点与 (x,y) 的距离均>y) return (x,y);
           break;
       }
    }
}
返回:没有找到合适的圆心


------解决方案--------------------
呜~题目改了,是什么不规则的图形呢,需要找合适的包围盒
------解决方案--------------------
楼主是要表达这个意思么:在这个平面中找一个可以放下但不会覆盖其他图形的的圆?
个人思路:

其他图形都是规则图形,那么图形的方程是可以知道的,也就是说每个图形都可以抽象成若干个适当的点(根据你要求的圆的半径,尽可能的选择一些均匀分布点到图形里即可,用这些点表示这些图形。)
这样问题就转换成:在一个平面点集中,找一个点到其它所有点的距离的最小值 大于 你要放的圆的半径。这个问题就可以用模拟退火来做,算法是有点暴力的,数据量不是非常大完全可以在短时间(ms)内完成。
例如:随机从这个平面域中选取20个点作为初始解,每次退火每个点都随机产生20个点来作为邻域,然后判断,将更优值替换以前的解,然后有从这些选出的局部最优解不断继续这个过程,直到精度要求,然后判断保留的点是否有满足要求的。