<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      思路:首先傳入一個劃分的區塊大小的邊長,然后根據邊長把地圖均勻的切塊,然后找中心點,然后大亂開始依次擴充

      步驟:

      0.我這里使用的是按5格邊長來劃分區塊

      1.首先我們先把地塊劃分成均勻的區塊,如圖

      這種最后的生成效果如下,可以看出中心點過于平行

      2.所以我們可以根據選區的奇偶次序進行上下差異化

      3.然后我們可以獲取區塊中的一個非邊緣的點的位置

      4.然后對他們隨機排序,然后進行擴充

       實現下在其他地圖的效果,可以看出是不錯的,當然最后還是要需要手動來調整一些重要邊界的位置

      源碼:

        1     //自動切割
        2     //type -1全部 0僅陸地 1僅海洋
        3     public void autoCutRegion(int gridAvgWidth,int maxCount,int type){
        4         int minCount=gridAvgWidth*gridAvgWidth/4;
        5        //重置所有的region數據
        6         for(int i=0,iMax=mapHexagons.size;i<iMax;i++){
        7             MapHexagon mapHexagon=mapHexagons.get(i);
        8             if(type==-1){
        9                 mapHexagon.setRegionId(-1);
       10             }else if(type==0){
       11                 if(!mapHexagon.isSea()){
       12                     mapHexagon.setRegionId(-1);
       13                 }
       14             }else if(type==1){
       15                 if(mapHexagon.isSea()){
       16                     mapHexagon.setRegionId(-1);
       17                 }
       18             }
       19             mapHexagon.hexagonId=i;
       20         }
       21 
       22         //隨機出所有region
       23         int xcMax=mapWidth/gridAvgWidth;
       24         int ycMax=mapHeight/gridAvgWidth;
       25         IntArray ids=new IntArray();
       26         IntArray tempIds=new IntArray();
       27         for(int xc=0;xc<xcMax;xc++){
       28             for(int yc=0;yc<ycMax;yc++) {
       29                 for(int xi=1;xi<gridAvgWidth-1;xi++){
       30                     for(int yi=1;yi<gridAvgWidth-1;yi++){
       31                         int x = xc*gridAvgWidth+xi;//坐標X
       32                      //   int y= yc*gridAvgWidth+yi;//坐標Y 原橫排的取用方法
       33                         int y= yc*gridAvgWidth+yi-(xc%2==0?gridAvgWidth/2:0);//坐標Y
       34                         int id = getId(x, y, -1);
       35                         MapHexagon mapHexagon = getHexagonData(id);
       36                         if (mapHexagon != null && mapHexagon.getRegionId() == -1) {
       37                             boolean rs=false;
       38                             if(type==-1){
       39                                 rs=true;
       40                             }else if(type==0){
       41                                 if(!mapHexagon.isSea()){
       42                                     rs=true;
       43                                 }
       44                             }else if(type==1){
       45                                 if(mapHexagon.isSea()){
       46                                     rs=true;
       47                                 }
       48                             }
       49                             if(rs){
       50                                 tempIds.add(id);
       51                             }
       52                         }
       53                     }
       54                 }
       55                 if(tempIds.size>0){
       56                     int id=tempIds.random();
       57                     MapHexagon mapHexagon = getHexagonData(id);
       58                     mapHexagon.setRegionId(mapHexagon.hexagonId);
       59                     ids.add(id);
       60                     tempIds.clear();
       61                 }
       62             }
       63         }
       64 
       65 
       66         //原來的純粹的隨機出所有region 已棄用
       67       /*  for(int i=1;i<=gridCount;i++){
       68             int   x= ComUtil.getRandom(0,mapWidth);//隨機坐標X
       69             int   y= ComUtil.getRandom(0,mapHeight);//隨機坐標Y
       70             int id=getId(x,y,-1);
       71             MapHexagon mapHexagon=getHexagonData(id);
       72             if(mapHexagon!=null&&mapHexagon.getRegionId()==-1){
       73                 mapHexagon.setRegionId(mapHexagon.hexagonId);
       74                 ids.add(id);
       75             }
       76         }*/
       77         //隨機排序 并將所有的地塊擴張
       78         ids.shuffle();
       79         IntMap<IntArray> regionIdsMap=new IntMap<>();
       80         for(int i=0,/*iMax=(mapWidth*mapHeight)/(gridCount/2)*/iMax=0;i<iMax;i++){//
       81             for(int j=0,jMax=ids.size;j<jMax;j++){
       82                 int id=ids.get(j);
       83                 MapHexagon mapHexagon=getHexagonData(id);
       84                 if(mapHexagon!=null&&mapHexagon.getRegionId()==mapHexagon.hexagonId){
       85                     IntArray rs;
       86                     if(regionIdsMap.containsKey(id)){
       87                         rs=regionIdsMap.get(id);
       88                     }else{
       89                         rs=new IntArray();
       90                         rs.add(id);
       91                         regionIdsMap.put(id,rs);
       92                     }
       93                     if(rs!=null&&rs.size>0){
       94                         int lastCount=rs.size;
       95                         for(int m=0,mMax=rs.size;m<mMax;m++){
       96                             int id2=rs.get(m);
       97                             MapHexagon mapHexagon2=getMapHexagon(id2);
       98                             if(mapHexagon2!=null){
       99                                 for(int n=1;n<=6;n++){//左上1,上2,右上3,左下4,下5,右下6
      100                                     MapHexagon borderM=getBorderHexagon(id2,n);
      101                                     if(borderM!=null&&(borderM.getRegionId()==-1)&&((mapHexagon2.isSea()&&borderM.isSea())||(!mapHexagon2.isSea()&&!borderM.isSea()))){
      102                                        if(!rs.contains(borderM.hexagonId)){
      103                                            rs.add(borderM.hexagonId);
      104                                        }
      105                                         borderM.setRegionId(mapHexagon2.getRegionId());
      106                                     }
      107                                 }
      108                             }
      109                         }
      110                         if(lastCount==rs.size){
      111                             continue;
      112                         }else {
      113                             lastCount=rs.size;
      114                         }
      115                     }
      116                 }
      117             }
      118         }
      119      //將所有小地塊清空
      120         for(int j=ids.size-1;j>=0;j--){//(int i = newDependencies.size() - 1; i >= 0; i--
      121             int id=ids.get(j);
      122             if(regionIdsMap.containsKey(id)){
      123                 IntArray rs=regionIdsMap.get(id);
      124                 if(rs.size<=minCount){
      125                     for(int m=rs.size-1;m>=0;m--){
      126                         int id2=rs.get(m);
      127                         MapHexagon mapHexagon2=getMapHexagon(id2);
      128                         mapHexagon2.setRegionId(-1);
      129                     }
      130                     regionIdsMap.remove(id);
      131                     ids.removeValue(id);
      132                 }
      133             }
      134         }
      135 
      136         //將所有region為空的清除
      137         for(int i=0,iMax=mapHexagons.size;i<iMax;i++){
      138             MapHexagon mapHexagon=mapHexagons.get(i);
      139             if(mapHexagon!=null){
      140                 MapHexagon region=mapHexagon.getRegionHexagonData();
      141                 if(region==null||region.getRegionId()!=mapHexagon.getRegionId()){
      142                     mapHexagon.setRegionId(-1);
      143                 }
      144             }
      145         }
      146         //也可以繼續擴張現有大地塊,這里我選擇自己手動處理那些消失的小地塊
      147 
      148       /*  for(int i=0,iMax=(mapWidth*mapHeight)/(gridCount/2);i<iMax;i++){
      149             for(int j=0,jMax=ids.size;j<jMax;j++){
      150                 int id=ids.get(j);
      151                 MapHexagon mapHexagon=getHexagonData(id);
      152                 if(regionIdsMap.containsKey(id)&&mapHexagon!=null&&mapHexagon.getRegionId()==mapHexagon.hexagonId){
      153                     IntArray rs=regionIdsMap.get(id);
      154                     if(rs!=null&&rs.size>0){
      155                         int lastCount=rs.size;
      156                         for(int m=0,mMax=rs.size;m<mMax;m++){
      157                             int id2=rs.get(m);
      158                             MapHexagon mapHexagon2=getMapHexagon(id2);
      159                             if(mapHexagon2!=null){
      160                                 for(int n=1;n<=6;n++){//左上1,上2,右上3,左下4,下5,右下6
      161                                     MapHexagon borderM=getBorderHexagon(id2,n);
      162                                     if(borderM!=null&&(borderM.getRegionId()==-1)&&((mapHexagon2.isSea()&&borderM.isSea())||(!mapHexagon2.isSea()&&!borderM.isSea()))){
      163                                         if(!rs.contains(borderM.hexagonId)){
      164                                             rs.add(borderM.hexagonId);
      165                                         }
      166                                         borderM.setRegionId(mapHexagon2.getRegionId());
      167                                     }
      168                                 }
      169                             }
      170                         }
      171                         if(lastCount==rs.size||lastCount>maxCount){
      172                             continue;
      173                         }else {
      174                             lastCount=rs.size;
      175                         }
      176                     }
      177                 }
      178             }
      179         }*/
      180 
      181 
      182       //輸出超量地塊
      183         for(int j=0,jMax=ids.size;j<jMax;j++){
      184             int id=ids.get(j);
      185             MapHexagon hexagon=getHexagonData(id);
      186             if(hexagon!=null){
      187                 hexagon.initVirAttribute();
      188                 hexagon.updHexagonBorderAttribute();
      189                 if(hexagon.getRegionId()==-1){
      190                     Gdx.app.error("autoRegion: region is error",id+"");
      191                 }
      192                 if(regionIdsMap.containsKey(id)){
      193                     IntArray rs=regionIdsMap.get(id);
      194                     if(rs.size>maxCount){
      195                         Gdx.app.log("autoRegion: grid>maxCount",id+":"+rs.size);
      196                     }
      197                 }
      198             }
      199         }
      200     }
      自動切割方法

       

      posted on 2023-09-01 15:25  黑獄  閱讀(171)  評論(0)    收藏  舉報

      主站蜘蛛池模板: 在线看国产精品自拍内射| 99人体免费视频| 欧美亚洲人成网站在线观看| 在线aⅴ亚洲中文字幕| 国产精品午夜福利视频| 办公室强奷漂亮少妇视频| 中文字幕久久精品波多野结| 一本久道久久综合中文字幕| 人妻聚色窝窝人体WWW一区| 69精品丰满人妻无码视频a片| 精品人妻少妇嫩草av系列| 韩国精品一区二区三区| 免费人成网站免费看视频| 亚洲熟妇色自偷自拍另类| 国产三级精品三级在线看| 亚洲精品一区二区天堂| 精品素人AV无码不卡在线观看| 内射干少妇亚洲69XXX| 欧美三级中文字幕在线观看| 国产av午夜精品福利| 前郭尔| 91亚洲国产成人久久蜜臀| 国产成人啪精品午夜网站| 天干天干天啪啪夜爽爽99| 亚洲欧洲成人a∨在线| 坐盗市亚洲综合一二三区| 国产欧美日韩亚洲一区二区三区| 国产99视频精品免费视频36| 亚洲国产av区一区二| 国产精品一久久香蕉国产线看观看 | 又粗又大又黄又硬又爽免费看| 亚洲一区二区三区av无码| 久久碰国产一区二区三区| 蜜芽亚洲AV无码精品国产午夜| 久久人人爽人人爽人人av| 老师破女学生处特级毛ooo片| 国产极品丝尤物在线观看| 毛片一区二区在线看| 久久热这里只有精品国产| 亚洲国产在一区二区三区| 草裙社区精品视频播放|