X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2Fconvert_create_bmp_for_rect_in_circ_dimensions_to_integers.c;fp=src%2Fconvert_create_bmp_for_rect_in_circ_dimensions_to_integers.c;h=bf6667337549e60990ade3a231a6efe29ba7aa81;hb=ec2d2ab8e90a0c4b86ffc2385655c2fb27fcacd9;hp=0000000000000000000000000000000000000000;hpb=795fb988211df268a8f7724bd2f4493c594abee9;p=debian%2Fatlc diff --git a/src/convert_create_bmp_for_rect_in_circ_dimensions_to_integers.c b/src/convert_create_bmp_for_rect_in_circ_dimensions_to_integers.c new file mode 100644 index 0000000..bf66673 --- /dev/null +++ b/src/convert_create_bmp_for_rect_in_circ_dimensions_to_integers.c @@ -0,0 +1,114 @@ +/* atlc - arbitrary transmission line calculator, for the analysis of +transmission lines are directional couplers. + +Copyright (C) 2002. Dr. David Kirkby, PhD (G8WRB). + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either package_version 2 +of the License, or (at your option) any later package_version. + +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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, +USA. + +Dr. David Kirkby, e-mail drkirkby at gmail.com + +*/ +#include "config.h" + + +#ifdef HAVE_STRING_H +#include +#endif + +#ifdef HAVE_STRINGS_H +#include +#endif + +#ifdef HAVE_STDLIB_H +#include +#endif +#include "definitions.h" + +/* names, colours and Ers are all arrays of 10. It would be better they were +in a structure as they are all linked closely, but they are not and I +can't be bothered to change it */ + +extern double DD, ww, hh, xx, yy, Er1; +extern int D, w, h, x, y; +extern int lowest; +extern int highest, verbose; + +void convert_create_bmp_for_rect_in_circ_dimensions_to_integers(int accuracy_level) +{ + int best_D=-1, best_w=-1, best_h=-1, best_x=-1, best_y=-1; + int min=-1, max=-1; + int i; + double error, error_min=VERY_LARGE, gridsize, best_grid_size=-1; + + /* scale grid size, according to a command line option */ + lowest*=(int) 0.5+pow(2.0,(double) accuracy_level); + highest*=(int) 0.5+pow(2.0,(double) accuracy_level); + + for(i=min;i<=max;++i) + { + /* Try various combinations for D, w, h, x, & y etc */ + gridsize=DD/i; + D=(int)(DD/gridsize + 0.5); + w=(int)(ww/gridsize + 0.5); + h=(int)(hh/gridsize + 0.5); + x=(int)(xx/gridsize + 0.5); + y=(int)(yy/gridsize + 0.5); + error=0.0; + error+=pow((DD-D*gridsize)/DD,2.0); /* relative error in D */ + error+=pow((ww-w*gridsize)/ww,2.0); + error+=pow((hh-h*gridsize)/hh,2.0); + if(x>0) + error+=pow((xx-x*gridsize)/xx,2.0); + if(y>0) + error+=pow((yy-y*gridsize)/yy,2.0); + if(error < error_min-TINY) + { + error_min=error; + best_D=D; + best_w=w; + best_h=h; + best_x=x; + best_y=y; + best_grid_size=gridsize; + } + } + D=best_D; + w=best_w; + h=best_h; + x=best_x; + y=best_y; + if(verbose==TRUE) + { + fprintf(stderr,"error_min=%.16f\n",error_min); + fprintf(stderr,"User requested: D=%f w=%f h=%f x=%f y=%f Er1=%f\n\n",DD,ww,hh,xx,yy,Er1); + fprintf(stderr,"Internally the program is using the following grid:\n"); + fprintf(stderr,"D=%d w=%d h=%d x=%d y=%d \n", D, w, h, x, y); + fprintf(stderr,"which equates to dimensions of D=%f w=%f h=%f x=%f y=%f\n", D*gridsize, w*gridsize, h*gridsize, x*gridsize, + y*gridsize); + if(error_min > TINY) + { + fprintf(stderr,"This means we are simulating a transmission line with these dimensions:\n"); + fprintf(stderr,"W=%f w=%f h=%f x=%f y=%f (mm, inches or whatever)\n",D*best_grid_size,w*best_grid_size,h*best_grid_size,x*best_grid_size,y*best_grid_size); + fprintf(stderr,"\nThese are slightly different to what you indicated on the command line,\n"); + fprintf(stderr,"but they are the best approximation possible, given the grid size\n"); + } + } + check_error(DD,D,best_grid_size,"D"); + check_error(ww,w,best_grid_size,"w"); + check_error(hh,h,best_grid_size,"h"); + check_error(xx,x,best_grid_size,"x"); + check_error(yy,y,best_grid_size,"y"); +}