2007-12-29 19:27:58 +00:00
|
|
|
// math stuff for graphics, from FreePCB
|
|
|
|
|
2008-05-30 18:06:21 +00:00
|
|
|
#ifndef abs
|
|
|
|
#define abs(x) (((x) >=0) ? (x) : (-(x)))
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
2007-12-29 19:27:58 +00:00
|
|
|
typedef struct PointTag
|
|
|
|
{
|
|
|
|
double X,Y;
|
2008-03-12 11:49:16 +00:00
|
|
|
} PointT;
|
2007-12-29 19:27:58 +00:00
|
|
|
|
|
|
|
typedef struct EllipseTag
|
|
|
|
{
|
2008-03-12 11:49:16 +00:00
|
|
|
PointT Center; /* ellipse center */
|
2007-12-29 19:27:58 +00:00
|
|
|
// double MaxRad,MinRad; /* major and minor axis */
|
|
|
|
// double Phi; /* major axis rotation */
|
|
|
|
double xrad, yrad; // radii on x and y
|
2008-05-30 18:06:21 +00:00
|
|
|
double theta1, theta2; // start and end angle for arc
|
2007-12-29 19:27:58 +00:00
|
|
|
} EllipseKH;
|
|
|
|
|
|
|
|
const CPoint zero(0,0);
|
|
|
|
|
|
|
|
class my_circle {
|
|
|
|
public:
|
|
|
|
my_circle(){};
|
|
|
|
my_circle( int xx, int yy, int rr )
|
|
|
|
{
|
|
|
|
x = xx;
|
|
|
|
y = yy;
|
|
|
|
r = rr;
|
|
|
|
};
|
2008-05-30 18:06:21 +00:00
|
|
|
int x, y, r;
|
2007-12-29 19:27:58 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
class my_rect {
|
|
|
|
public:
|
|
|
|
my_rect(){};
|
|
|
|
my_rect( int xi, int yi, int xf, int yf )
|
|
|
|
{
|
|
|
|
xlo = min(xi,xf);
|
|
|
|
xhi = max(xi,xf);
|
|
|
|
ylo = min(yi,yf);
|
|
|
|
yhi = max(yi,yf);
|
|
|
|
};
|
2008-05-30 18:06:21 +00:00
|
|
|
int xlo, ylo, xhi, yhi;
|
2007-12-29 19:27:58 +00:00
|
|
|
};
|
|
|
|
|
2008-05-30 18:06:21 +00:00
|
|
|
class my_seg {
|
2007-12-29 19:27:58 +00:00
|
|
|
public:
|
|
|
|
my_seg(){};
|
|
|
|
my_seg( int xxi, int yyi, int xxf, int yyf )
|
|
|
|
{
|
|
|
|
xi = xxi;
|
|
|
|
yi = yyi;
|
|
|
|
xf = xxf;
|
|
|
|
yf = yyf;
|
|
|
|
};
|
2008-05-30 18:06:21 +00:00
|
|
|
int xi, yi, xf, yf;
|
2007-12-29 19:27:58 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
// math stuff for graphics
|
2008-02-01 11:01:32 +00:00
|
|
|
#if 0
|
2008-05-30 18:06:21 +00:00
|
|
|
void DrawArc( CDC * pDC, int shape, int xxi, int yyi, int xxf, int yyf, bool bMeta=FALSE );
|
2008-02-01 11:01:32 +00:00
|
|
|
#endif
|
|
|
|
|
2008-05-30 18:06:21 +00:00
|
|
|
bool Quadratic( double a, double b, double c, double *x1, double *x2 );
|
2007-12-29 19:27:58 +00:00
|
|
|
void RotatePoint( CPoint *p, int angle, CPoint org );
|
|
|
|
void RotateRect( CRect *r, int angle, CPoint org );
|
|
|
|
int TestLineHit( int xi, int yi, int xf, int yf, int x, int y, double dist );
|
|
|
|
int FindLineIntersection( double a, double b, double c, double d, double * x, double * y );
|
2008-05-30 18:06:21 +00:00
|
|
|
int FindLineSegmentIntersection( double a, double b, int xi, int yi, int xf, int yf, int style,
|
2007-12-29 19:27:58 +00:00
|
|
|
double * x1, double * y1, double * x2, double * y2, double * dist=NULL );
|
2008-05-30 18:06:21 +00:00
|
|
|
int FindSegmentIntersections( int xi, int yi, int xf, int yf, int style,
|
2007-12-29 19:27:58 +00:00
|
|
|
int xi2, int yi2, int xf2, int yf2, int style2,
|
|
|
|
double x[]=NULL, double y[]=NULL );
|
2008-05-30 18:06:21 +00:00
|
|
|
bool FindLineEllipseIntersections( double a, double b, double c, double d, double *x1, double *x2 );
|
|
|
|
bool FindVerticalLineEllipseIntersections( double a, double b, double x, double *y1, double *y2 );
|
|
|
|
bool TestForIntersectionOfStraightLineSegments( int x1i, int y1i, int x1f, int y1f,
|
2007-12-29 19:27:58 +00:00
|
|
|
int x2i, int y2i, int x2f, int y2f,
|
|
|
|
int * x=NULL, int * y=NULL, double * dist=NULL );
|
|
|
|
void GetPadElements( int type, int x, int y, int wid, int len, int radius, int angle,
|
|
|
|
int * nr, my_rect r[], int * nc, my_circle c[], int * ns, my_seg s[] );
|
|
|
|
int GetClearanceBetweenPads( int type1, int x1, int y1, int w1, int l1, int r1, int angle1,
|
|
|
|
int type2, int x2, int y2, int w2, int l2, int r2, int angle2 );
|
|
|
|
int GetClearanceBetweenSegmentAndPad( int x1, int y1, int x2, int y2, int w,
|
2008-05-30 18:06:21 +00:00
|
|
|
int type, int x, int y, int wid, int len,
|
2007-12-29 19:27:58 +00:00
|
|
|
int radius, int angle );
|
|
|
|
int GetClearanceBetweenSegments( int x1i, int y1i, int x1f, int y1f, int style1, int w1,
|
|
|
|
int x2i, int y2i, int x2f, int y2f, int style2, int w2,
|
|
|
|
int max_cl, int * x, int * y );
|
|
|
|
|
|
|
|
/** Function GetPointToLineSegmentDistance
|
|
|
|
* Get distance between line segment and point
|
|
|
|
* @param x,y = point
|
|
|
|
* @param xi,yi and xf,yf = the end-points of the line segment
|
|
|
|
* @return the distance
|
|
|
|
*/
|
|
|
|
double GetPointToLineSegmentDistance( int x, int y, int xi, int yi, int xf, int yf );
|
|
|
|
|
|
|
|
double GetPointToLineDistance( double a, double b, int x, int y, double * xp=NULL, double * yp=NULL );
|
2008-05-30 18:06:21 +00:00
|
|
|
bool InRange( double x, double xi, double xf );
|
2007-12-29 19:27:58 +00:00
|
|
|
double Distance( int x1, int y1, int x2, int y2 );
|
2008-05-30 18:06:21 +00:00
|
|
|
int GetArcIntersections( EllipseKH * el1, EllipseKH * el2,
|
|
|
|
double * x1=NULL, double * y1=NULL,
|
|
|
|
double * x2=NULL, double * y2=NULL );
|
2007-12-29 19:27:58 +00:00
|
|
|
CPoint GetInflectionPoint( CPoint pi, CPoint pf, int mode );
|
|
|
|
|
|
|
|
// quicksort (2-way or 3-way)
|
|
|
|
void quickSort(int numbers[], int index[], int array_size);
|
|
|
|
void q_sort(int numbers[], int index[], int left, int right);
|
|
|
|
void q_sort_3way( int a[], int b[], int left, int right );
|