📄 billmove.c
字号:
/* billmove.c**** physics of the billard system to calculate timestep** Copyright (C) 2001 Florian Berger** Email: harpin_floh@yahoo.de, florian.berger@jk.uni-linz.ac.at**** This program is free software; you can redistribute it and/or modify** it under the terms of the GNU General Public License Version 2 as** published by the Free Software Foundation;**** This program is distributed in the hope that it will be useful,** but WITHOUT ANY WARRANTY; without even the implied warranty of** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the** GNU General Public License for more details.**** You should have received a copy of the GNU General Public License** along with this program; if not, write to the Free Software** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.***/#define SQRTM1 100000.0#include "options.h"#include "billmove.h"#include "math.h"#include "stdlib.h"#include "stdio.h"#include "string.h" /* memcpy */#define MAX_EVENT_NR 1000enum event_type { BALL_out, BALL_wall, BALL_ball};struct BallEvent{ int ballnr; int ballnr2; VMvect pos; VMvect pos2; VMvect v; VMvect v2; VMvect w; VMvect w2; int timestep_nr; BMfloat timeoffs; enum event_type event;};static struct{ int timestep_nr; BMfloat duration; BMfloat duration_last; int out_half; int out_full; int out_white; int out_black; int eventnr; struct BallEvent event[MAX_EVENT_NR];} move_log;void BM_reset_move_info(){ move_log.out_half=0; move_log.out_full=0; move_log.out_white=0; move_log.out_black=0; move_log.eventnr=0; move_log.timestep_nr=0; move_log.duration=0.0; move_log.duration_last=0.0;}int BM_get_balls_out_half() { return move_log.out_half; }int BM_get_balls_out_full() { return move_log.out_full; }int BM_get_balls_out_total() { return move_log.out_full+move_log.out_half; }int BM_get_balls_out_all() { return move_log.out_full+move_log.out_half+move_log.out_white+move_log.out_black; }int BM_get_white_out() { return move_log.out_white; }int BM_get_ball_out(int nr) { int i,ballout; ballout=0; for(i=0;i<move_log.eventnr;i++){ if( move_log.event[i].event==BALL_out && move_log.event[i].ballnr==nr ){ ballout=1; } } return ballout;}int BM_get_nth_ball_out(int n){ int i,ballout; ballout=-1; for(i=0;i<move_log.eventnr && n!=0;i++){ if( move_log.event[i].event==BALL_out ){ n--; if( n==0 ) ballout=move_log.event[i].ballnr; } } return ballout;}int BM_get_min_ball_out() { int i,minnr; minnr=100; for(i=0;i<move_log.eventnr;i++){ if( move_log.event[i].event==BALL_out && move_log.event[i].ballnr<minnr ){ minnr=move_log.event[i].ballnr; } } return minnr;}int BM_get_1st_ball_hit(){ int i,hitball; hitball=-1; for(i=0;i<move_log.eventnr;i++){ if( move_log.event[i].event==BALL_ball ){ if( move_log.event[i].ballnr!=0 ){ hitball=move_log.event[i].ballnr; } else { hitball=move_log.event[i].ballnr2; } break; } } return hitball;}int BM_get_non_strafraum_wall_hit_before_1st_ball( int (* in_strafraum)(VMvect) ){ int i; int rval=0; for( i=0 ; i<move_log.eventnr && move_log.event[i].event!=BALL_ball ; i++ ){ if( move_log.event[i].event==BALL_wall ){ if( !in_strafraum(move_log.event[i].pos2) ){ rval=1; break; } } } return rval;}int BM_get_nth_ball_hit(int n){ int i,j,hitball; hitball=-1; i=0; for(j=0;j<(n-1);j++){ for( ;i<move_log.eventnr;i++){ if( move_log.event[i].event==BALL_ball ){ if( move_log.event[i].ballnr==0 || move_log.event[i].ballnr2==0 ) break; } } i++; } for( ;i<move_log.eventnr;i++){ if( move_log.event[i].event==BALL_ball ){ if( move_log.event[i].ballnr==0 ){ hitball=move_log.event[i].ballnr2; break; } else if( move_log.event[i].ballnr2==0 ){ hitball=move_log.event[i].ballnr; break; } } } return hitball;}int BM_get_nth_ball_hit_by_ind(int ind, int n){ int i,j,hitball; hitball=-1; i=0; for(j=0;j<(n-1);j++){ for( ;i<move_log.eventnr;i++){ if( move_log.event[i].event==BALL_ball ){ if( move_log.event[i].ballnr==ind || move_log.event[i].ballnr2==ind ) break; } } i++; } for( ;i<move_log.eventnr;i++){ if( move_log.event[i].event==BALL_ball ){ if( move_log.event[i].ballnr==ind ){ hitball=move_log.event[i].ballnr2; break; } else if( move_log.event[i].ballnr2==ind ){ hitball=move_log.event[i].ballnr; break; } } } return hitball;}VMvect BM_get_1st_ball_hit_pos(){ int i; VMvect hitpos; hitpos=vec_xyz(100,100,100); for(i=0;i<move_log.eventnr;i++){ if( move_log.event[i].event==BALL_ball ){ if( move_log.event[i].ballnr!=0 ){ hitpos=move_log.event[i].pos; } else { hitpos=move_log.event[i].pos2; } break; } } return hitpos;}int BM_get_balls_hit() { int i,hits; hits=0; for(i=0;i<move_log.eventnr;i++){ if( move_log.event[i].event==BALL_ball ){ if( move_log.event[i].ballnr==0 || move_log.event[i].ballnr2==0 ){ hits++; } } } return hits;}int BM_get_balls_hit_last() { int i,hits; hits=0; for(i=0;i<move_log.eventnr;i++){ if( move_log.event[i].event==BALL_ball ){ if( move_log.event[i].timestep_nr==move_log.timestep_nr ){ hits++; } } } return hits;}int BM_get_walls_hit_last() { int i,hits; hits=0; for(i=0;i<move_log.eventnr;i++){ if( move_log.event[i].event==BALL_wall ){ if( move_log.event[i].timestep_nr==move_log.timestep_nr ){ hits++; } } } return hits;}double BM_get_balls_hit_strength_last() { int i; double hitstrength=0.0; for(i=0;i<move_log.eventnr;i++){ if( move_log.event[i].event==BALL_ball ){ if( move_log.event[i].timestep_nr==move_log.timestep_nr ){ hitstrength+=fabs( vec_mul( vec_unit(vec_diff(move_log.event[i].pos,move_log.event[i].pos2)), vec_diff(move_log.event[i].v,move_log.event[i].v2) ) ); } } } return hitstrength;}void BM_get_balls_hit_strength_last_index(int index, double * strength, double * toffs){ int i; for(i=0;i<move_log.eventnr;i++){ if( move_log.event[i].event==BALL_ball ){ if( move_log.event[i].timestep_nr==move_log.timestep_nr ){ index--; if( !(index+1) ){ *strength=fabs( vec_mul( vec_unit(vec_diff(move_log.event[i].pos,move_log.event[i].pos2)), vec_diff(move_log.event[i].v,move_log.event[i].v2) ) );// *strength *= *strength; *toffs=move_log.event[i].timeoffs; break; } } } } if( i==move_log.eventnr ){ *toffs=0.0; *strength=0.0; }}double BM_get_walls_hit_strength_last() { int i; double hitstrength=0.0; for(i=0;i<move_log.eventnr;i++){ if( move_log.event[i].event==BALL_wall ){ if( move_log.event[i].timestep_nr==move_log.timestep_nr ){ hitstrength+=vec_abs( move_log.event[i].v2 ); } } } return hitstrength;}void BM_get_walls_hit_strength_last_index(int index, double * strength, double * toffs){ int i; for(i=0;i<move_log.eventnr;i++){ if( move_log.event[i].event==BALL_wall ){ if( move_log.event[i].timestep_nr==move_log.timestep_nr ){ index--; if( !(index+1) ){ *strength=vec_abs(move_log.event[i].v2);// *strength *= *strength; *toffs=move_log.event[i].timeoffs; break; } } } } if( i==move_log.eventnr ){ *toffs=0.0; *strength=0.0; }}BallType * BM_get_ball_by_nr( int nr, BallsType *pballs ){ int i; for(i=0;i<pballs->nr;i++){ if( pballs->ball[i].nr == nr ) break; } return (i!=pballs->nr) ? &(pballs->ball[i]) : NULL ;}void record_move_log_event( enum event_type event, int nr, int nr2, BallsType *pballs, BMfloat timeoffs ){ move_log.event[move_log.eventnr].event=event;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -