/** *建物に対するグレア発生の有無を調べる. *西日を遮蔽する建物が一つも無いならば, *建物に対するグレアが発生すると判定する. */ static int fndGlrOccredFromBld(sun_angle_t sun, xy_coord_t orgn_pos, build_grid_t **bld_grd, xy_coord_t grd_len, grid_size_t grd_cell_sz){ /* 日影ベクトルの東西成分と南北成分の長さを計算する */ xy_coord_t shdw_vctr = getShdwVctr(sun, BUILD_HIGH); if(bef_indx_x != EMPTY){ if(fndBldHydedSun(sun, orgn_pos, bld_grd[bef_indx_y][bef_indx_x].head)){ return FALSE; } } /* 現在地へ日影が届き得る最遠の座標を求める. */ xy_coord_t shdw_end_pos = getShdwTailPos(sun, orgn_pos, shdw_vctr); /* 観測地と日影の届き得る末端座標を対角頂点に持つ 矩形の始端座標と終端座標を算出する */ xy_coord_t shdw_bgn_pos = getMinPos(orgn_pos, shdw_end_pos); shdw_end_pos = getMaxPos(orgn_pos, shdw_end_pos); /*観測地の東側に位置するが,建物に現在地が覆われる場合,西日は遮蔽される. その為,東方向と南または北方向に建物幅だけ長くする.*/ shdw_end_pos.x = ADD(shdw_end_pos.x, max_bld_wdth); /* 太陽が北方に位置する場合(日影は南方へ延びる) */ if(0.0f < sun.azim && sun.azim < 180.0f){ shdw_end_pos.y = ADD(shdw_end_pos.y, max_bld_wdth); } /* 太陽が南方に位置する場合(日影は北方へ延びる) */ else{ shdw_end_pos.y = ADD(shdw_end_pos.y, -max_bld_wdth); } /* 走査対象グリッド地図の始端インデックス番号と終端インデックス番号を割り当てる */ int trv_bgn_x, trv_bgn_y, trv_end_x, trv_end_y; setTrvBgnIndx(&trv_bgn_x, &trv_bgn_y, shdw_bgn_pos, bld_grd[1][1].bgn, grd_len); setTrvEndIndx(&trv_end_x, &trv_end_y, shdw_end_pos, bld_grd[1][1].end, grd_len, grd_cell_sz); /* 走査対象グリッド地図を走査していく.*/ int i, j; for(i=trv_bgn_y;i<=trv_end_y;i++){ for(j=trv_bgn_x;j<=trv_end_x;j++){ if(fndBldHydedSun(sun, orgn_pos, bld_grd[i][j].head)){ bef_indx_x = j; bef_indx_y = i; return FALSE; } } } return TRUE; }
void ScrollShape::dragPos(Coord from,Coord to,uCoord len,uCoord dlen) { if( from<to ) { ulen d=delta(IntDist(from,to),len,dlen); ulen cap=getMaxPos(); if( d<cap && drag_pos<cap-d ) pos=drag_pos+d; else pos=cap; } else if( from>to ) { ulen d=delta(IntDist(to,from),len,dlen); if( drag_pos>d ) pos=drag_pos-d; else pos=0; } }
Pos2D AntargisMap::truncPos(const Pos2D &p) const { Pos2D maxPos=getMaxPos(); return Pos2D(std::max(0.0f,std::min(maxPos.x,p.x)), std::max(0.0f,std::min(maxPos.y,p.y))); }