github.com/archlabjp/eeslism-go@v0.0.0-20231109122333-4bb7bfcdf292/eeslism/KAUNT.go (about) 1 //This file is part of EESLISM. 2 // 3 //Foobar is free software : you can redistribute itand /or modify 4 //it under the terms of the GNU General Public License as published by 5 //the Free Software Foundation, either version 3 of the License, or 6 //(at your option) any later version. 7 // 8 //Foobar is distributed in the hope that it will be useful, 9 //but WITHOUT ANY WARRANTY; without even the implied warranty of 10 //MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the 11 //GNU General Public License for more details. 12 // 13 //You should have received a copy of the GNU General Public License 14 //along with Foobar.If not, see < https://www.gnu.org/licenses/>. 15 16 /* 17 18 障害物に当たった点の合計をカウントする 19 FILE=KAUNT.c 20 Create Date=1999.6.7 21 22 */ 23 24 package eeslism 25 26 import "math" 27 28 func minval(span []float64, u int, min *int, val *float64) { 29 *val = 10000.0 30 *min = -1 31 32 for i := 0; i < u; i++ { 33 if span[i] > 0.0 && *val >= span[i] { 34 *val = span[i] 35 *min = i 36 } 37 } 38 } 39 40 func KAUNT( 41 mlpn int, 42 ls float64, 43 ms float64, 44 ns float64, 45 suma *float64, 46 sumg *float64, 47 sumwall []float64, 48 s float64, 49 mlp []P_MENN, 50 p []XYZ, 51 O XYZ, 52 E XYZ, 53 wa float64, 54 wb float64, 55 G XYZ, 56 gpn int, 57 nday int, 58 gcnt *int, 59 startday int, 60 wlflg int, 61 ) { 62 var rp, h int 63 var l int 64 var sdsum float64 65 66 var i, j int 67 U := 0.0 68 Px := 0.0 69 Py := 0.0 70 Pz := 0.0 71 var nai float64 72 x := 0.0 73 y := 0.0 74 z := 0.0 75 76 S := 0.0 77 T := 0.0 78 var span []float64 79 80 var mencnt []int 81 82 var dumy2 int 83 var dumy1 float64 84 var k int 85 var mini float64 86 //var minib int 87 88 span = make([]float64, mlpn) 89 mencnt = make([]int, mlpn) 90 91 sdsum = 0.0 92 i = 0 93 94 for l = 0; l < mlpn; l++ { 95 96 nai = ls*mlp[l].e.X + ms*mlp[l].e.Y + ns*mlp[l].e.Z 97 98 if nai == 0.0 { 99 span[l] = -1.0 100 } else { 101 KOUTEN(x, y, z, ls, ms, ns, &Px, &Py, &Pz, mlp[l].P[0], mlp[l].e) 102 CAT(&ls, &ms, &ns) 103 PRA(&U, ls, ms, ns, Px, Py, Pz) 104 105 rp = mlp[l].polyd - 2 106 107 /*--多角形ループ 三角形:1回、四角形:2回、、---*/ 108 for h = 0; h < rp; h++ { 109 INOROUT(Px, Py, Pz, mlp[l].P[0], mlp[l].P[h+1], mlp[l].P[h+2], &S, &T) 110 if ((S >= 0.0 && T >= 0.0) && ((S + T) <= 1.0)) && (U > 0.0) { 111 span[l] = math.Sqrt(Px*Px + Py*Py + Pz*Pz) 112 break // 090131 higuchi debug 113 } else { 114 span[l] = -1.0 115 } 116 } 117 118 } 119 } 120 121 /*--あたった障害物を近い順に並べ替える--*/ 122 /*--樋口 080920 追加--*/ 123 124 for i = 0; i < mlpn; i++ { 125 mencnt[i] = i 126 } 127 128 for i = 0; i < mlpn-1; i++ { 129 mini = span[i] 130 //minib = mencnt[i] 131 k = i 132 for j = i + 1; j < mlpn; j++ { 133 if span[j] < mini { 134 mini = span[j] 135 //minib = mencnt[j] 136 k = j 137 } 138 } 139 dumy1 = span[i] 140 dumy2 = mencnt[i] 141 span[i] = span[k] 142 mencnt[i] = mencnt[k] 143 span[k] = dumy1 144 mencnt[k] = dumy2 145 } 146 147 k = 0 148 for i = 0; i < mlpn; i++ { 149 if span[i] > 0 { 150 if k == 0.0 { 151 sumwall[mencnt[i]] = sumwall[mencnt[i]] + mlp[mencnt[i]].shad[nday] 152 sdsum = 1 - mlp[mencnt[i]].shad[nday] /*--透過分--*/ 153 k = 1 154 } else { 155 sumwall[mencnt[i]] = sumwall[mencnt[i]] + sdsum*mlp[mencnt[i]].shad[nday] 156 sdsum = sdsum * (1 - mlp[mencnt[i]].shad[nday]) 157 } 158 } 159 } 160 161 if k == 0 { 162 //どの面にも当たらなかった場合 163 if s > 0.0 { 164 (*suma) = (*suma) + 1 165 } else if s < 0.0 { 166 (*sumg) = (*sumg) + 1 167 } else { 168 (*suma) = (*suma) + 1 169 (*sumg) = (*sumg) + 1 170 } 171 } else { 172 //どれかの面にあたった場合 173 if s > 0.0 { 174 (*suma) = (*suma) + sdsum 175 } else { 176 (*sumg) = (*sumg) + sdsum 177 } 178 } 179 180 if (s < 0.0) && (nday == startday) { 181 /*--始めの1回のみ地面のポイントを計算する--*/ 182 if *gcnt < gpn { 183 DAINYUU_GP(&p[*gcnt], O, E, ls, ms, ns) 184 R_ZAHYOU(p[*gcnt], G, &p[*gcnt], wa, wb) 185 (*gcnt) = (*gcnt) + 1 186 } 187 } 188 }