1 /* @(#)compkl.c 8.1 (Berkeley) 5/31/93 */ 2 /* $NetBSD: compkl.c,v 1.8 2009/05/24 21:44:56 dholland Exp $ */ 3 4 /* 5 * Copyright (c) 1980, 1993 6 * The Regents of the University of California. All rights reserved. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 11 * 1. Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in the 15 * documentation and/or other materials provided with the distribution. 16 * 3. Neither the name of the University nor the names of its contributors 17 * may be used to endorse or promote products derived from this software 18 * without specific prior written permission. 19 * 20 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 21 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 23 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 24 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 25 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 26 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 27 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 28 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 29 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 30 * SUCH DAMAGE. 31 */ 32 33 #include <math.h> 34 #include "trek.h" 35 36 /* 37 ** compute klingon distances 38 ** 39 ** The klingon list has the distances for all klingons recomputed 40 ** and sorted. The parameter is a Boolean flag which is set if 41 ** we have just entered a new quadrant. 42 ** 43 ** This routine is used every time the Enterprise or the Klingons 44 ** move. 45 ** 46 ** f -- set if new quadrant 47 */ 48 49 static void sortkl(void); 50 51 void 52 compkldist(int f) 53 { 54 int i, dx, dy; 55 double d; 56 double temp; 57 58 if (Etc.nkling == 0) 59 return; 60 for (i = 0; i < Etc.nkling; i++) { 61 /* compute distance to the Klingon */ 62 dx = Ship.sectx - Etc.klingon[i].x; 63 dy = Ship.secty - Etc.klingon[i].y; 64 d = dx * dx + dy * dy; 65 d = sqrt(d); 66 67 /* compute average of new and old distances to Klingon */ 68 if (!f) { 69 temp = Etc.klingon[i].dist; 70 Etc.klingon[i].avgdist = 0.5 * (temp + d); 71 } else { 72 /* new quadrant: average is current */ 73 Etc.klingon[i].avgdist = d; 74 } 75 Etc.klingon[i].dist = d; 76 } 77 78 /* leave them sorted */ 79 sortkl(); 80 } 81 82 83 /* 84 ** sort klingons 85 ** 86 ** bubble sort on ascending distance 87 */ 88 89 static void 90 sortkl(void) 91 { 92 struct kling t; 93 int f, i, m; 94 95 m = Etc.nkling - 1; 96 f = 1; 97 while (f) { 98 f = 0; 99 for (i = 0; i < m; i++) { 100 if (Etc.klingon[i].dist > Etc.klingon[i+1].dist) { 101 t = Etc.klingon[i]; 102 Etc.klingon[i] = Etc.klingon[i+1]; 103 Etc.klingon[i+1] = t; 104 f = 1; 105 } 106 } 107 } 108 } 109