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  }