home *** CD-ROM | disk | FTP | other *** search
/ Kinjite Games 1996 November / SENTINEL.img / dosgames / sports / apool098 / src / creatabl.c < prev    next >
C/C++ Source or Header  |  1995-05-20  |  5KB  |  104 lines

  1. /* This is "creatable.c", part of the pool (billiards)-program
  2.                    
  3.                      "ANOTHER POOL".
  4.  
  5.    "creatable.c" calculates the 'geometry' of the table to "table.dat".
  6.  
  7.    Copyright (C) 1995 by Gerrit Jahn (email: ub1g@rz.uni-karlsruhe.de)
  8.  
  9.    "ANOTHER POOL" is free software; you can redistribute it 
  10.    and/or modify it under the terms of the GNU General Public License 
  11.    as published by the Free Software Foundation; either version 2 of 
  12.    the License, or (at your option) any later version.
  13.  
  14.    This program is distributed in the hope that it will be useful,
  15.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17.    GNU General Public License for more details.
  18.  
  19.    You should have received a copy of the GNU General Public License
  20.    along with GNU CC; see the file COPYING.  If not, write to
  21.    the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  22.  
  23. /* ------------------------------ creatable.c ----------------------------- */
  24.  
  25. #include <math.h>
  26. #include <stdio.h>
  27. #include <stdlib.h>
  28.  
  29. #define w_c (1.0/sqrt(2.0)*wide_c)
  30. #define q_c (5.0/10.0*wide_c)
  31. #define r_c (1.0/sqrt(2.0)*t_c)
  32. #define RIGHT_C 600.0 /* f. Auflösung 640*480 !!! */
  33. #define DOWN_C RIGHT_C / 2
  34. #define MID_C RIGHT_C / 2
  35. #define FAKTOR_C (3.0/3.0) /* wie tief reicht Loch in die Bande */
  36. #define SKALARP(a,b) ( (a).x*(b).x + (a).y*(b).y )
  37. #define WB_C 20.0 /* Breite der Bande (komplett mit unsichtbaren Teilen */
  38. #define WB_C2 (WB_C/2)
  39. #define W (60.0 * M_PI / 180.0) /* Winkel f. Mittelloch-Bande */
  40. #define Q (35.0 * M_PI / 180.0)    /* Winkel f. Eckloch-Banden */
  41. #define ABST 3
  42.  
  43. void create_table( double wide_c ) /* berechnet Lage der Löcher und Banden */
  44.  {                  /* in Abhängigkeit von der Breite der Löcher */
  45.  struct vect { double x, y; } m_c, a_c, b_c, g_c, f_c;
  46.  double t_c, rad_c, dummym, dummyp;
  47.  FILE *datei;
  48.  if( !(datei=fopen("table.dat","w") ) ) 
  49.   {
  50.   printf("can't open 'table.dat' for writing (!) \n");
  51.   exit( 0 );
  52.   }
  53.  if( wide_c < 26.0) wide_c = 26.0;
  54.  else if( wide_c > 45.0) wide_c = 45.0;
  55.  /* dritten Punkt auf Kreis bestimmen (für die Löcher) */
  56.  a_c.x = -WB_C2;
  57.  a_c.y = w_c - WB_C2;
  58.  m_c.x = a_c.x + FAKTOR_C * WB_C2 + 1.0/sqrt(8.0) * wide_c;
  59.  m_c.y = a_c.y + FAKTOR_C * WB_C2 - 1.0/sqrt(8.0) * wide_c;
  60.  b_c.x = a_c.x + w_c/2.0;
  61.  b_c.y = a_c.y - w_c/2.0;
  62.  /* Vektor in Richtung m --> Mittelpunkt bestimmen: */
  63.  g_c.x = b_c.x-m_c.x; g_c.y = b_c.y-m_c.y;
  64.  /* Vektor a-m bestimmen */
  65.  f_c.x = a_c.x-m_c.x;
  66.  f_c.y = a_c.y-m_c.y;
  67.  t_c = -1.0/2.0 * ( SKALARP( f_c, f_c ) / SKALARP( g_c, f_c ) );
  68.  f_c.x = m_c.x + g_c.x * t_c;
  69.  f_c.y = m_c.y + g_c.y * t_c;
  70.  rad_c=sqrt( (m_c.x-f_c.x)*(m_c.x-f_c.x) + (m_c.y-f_c.y)*(m_c.y-f_c.y) );
  71.  t_c = rad_c - sqrt((b_c.x-m_c.x)*(b_c.x-m_c.x)+
  72.   (b_c.y-m_c.y)*(b_c.y-m_c.y))+1.5;
  73.  fprintf(datei,"%g\n",rad_c+0.5 ); /* Radius der Löcher schreiben */
  74.  /* Die sechs Löcher schreiben, Reihenfolge: lu, lo, mo, ro, ru, mu */
  75.  fprintf(datei,"%g %g\n",b_c.x-r_c-ABST, DOWN_C-b_c.y+r_c + ABST);
  76.  fprintf(datei,"%g %g\n",b_c.x-r_c-ABST, b_c.y-r_c-ABST);
  77.  fprintf(datei,"%g %g\n",MID_C,-(((1.0-FAKTOR_C)*WB_C2)+rad_c));
  78.  fprintf(datei,"%g %g\n",RIGHT_C-b_c.x+r_c+ABST, b_c.y-r_c-ABST);
  79.  fprintf(datei,"%g %g\n",RIGHT_C-b_c.x+r_c+ABST, DOWN_C-b_c.y+r_c+ABST);
  80.  fprintf(datei,"%g %g\n",MID_C,DOWN_C+(1.0-FAKTOR_C)*WB_C2+rad_c);
  81.  /* Banden schreiben, gegeben durch ihre 4 Eckpunkte, immer gegen den Uhr-
  82.     zeigersinn und der vierten Seite "außerhalb" des Tisches. Reihenfolge:
  83.     links, rechts, oben links, unten links, oben rechts, unten rechts      */
  84.  dummyp = w_c/2.0 + WB_C2/tan( Q );
  85.  dummym = w_c/2.0 - WB_C2/tan( Q );
  86.  fprintf( datei,"%g %g %g %g %g %g %g %g\n", 
  87.   -WB_C, DOWN_C-dummym, 0.0, DOWN_C-dummyp, 0.0, dummyp, -WB_C, dummym );
  88.  fprintf(datei,"%g %g %g %g %g %g %g %g\n", 
  89.   RIGHT_C+WB_C, dummym, RIGHT_C, dummyp, RIGHT_C, DOWN_C-dummyp, 
  90.    RIGHT_C+WB_C, DOWN_C-dummym );
  91.  fprintf(datei,"%g %g %g %g %g %g %g %g\n", dummym, -WB_C, dummyp, 0.0, 
  92.   MID_C-q_c-WB_C2/tan(W), 0.0, MID_C-q_c + WB_C2/tan(W), -WB_C );
  93.  fprintf(datei,"%g %g %g %g %g %g %g %g\n", MID_C-q_c + WB_C2/tan(W), 
  94.   DOWN_C+WB_C, MID_C-WB_C2/tan(W)-q_c, DOWN_C, dummyp, DOWN_C, dummym, 
  95.   DOWN_C+WB_C );
  96.  fprintf(datei,"%g %g %g %g %g %g %g %g\n", MID_C+q_c+0.5 - WB_C2/tan(W), 
  97.   -WB_C, MID_C+WB_C2/tan(W)+q_c+0.5, 0.0, RIGHT_C-dummyp, 0.0, 
  98.    RIGHT_C-dummym, -WB_C );
  99.  fprintf(datei,"%g %g %g %g %g %g %g %g\n", RIGHT_C-dummym, 
  100.   DOWN_C+WB_C, RIGHT_C-dummyp, DOWN_C, MID_C+WB_C2/tan(W)+q_c+0.5,
  101.   DOWN_C, MID_C+q_c+0.5-WB_C2/tan(W), DOWN_C+WB_C);
  102.  fclose(datei);
  103.  }
  104.