Main Page   Class Hierarchy   Alphabetical List   Compound List   File List   Compound Members   File Members  

xymath.cpp

Go to the documentation of this file.
00001 /*****************************************************************************/
00002 /* Módulo: xymath.cpp                                                        */
00003 /* Autores: Carlos Henrique Levy e Jaudênia Cavalcante                       */
00004 /* Data: 08 mar 96                                                           */
00005 /*****************************************************************************/
00006 
00007 #include "xymath.h"
00008 #include <stdlib.h>
00009 
00010 const char* xy_id_xymath_cpp="$Id: xymath.cpp,v 1.13 2002/01/23 16:10:20 clinio Exp $";                                                         
00011 static double Tol = 1e-7;
00012 
00013 int mtDecade(double val)
00014 {
00015    double l = log10(val);
00016    return (int)floor(l);
00017 }
00018 
00019 double mtTolerance(double v)
00020 {
00021    double oldtol = Tol;
00022    Tol = v;
00023    return oldtol;
00024 }
00025 
00026 // verifica se v1 e v2 são iguais
00027 xybool mtEqual(double v1, double v2)
00028 {
00029    return (fabs(v2 - v1) < Tol);
00030 }
00031 
00032 // verifica se v1 e v2 são iguais numa tolerância
00033 xybool mtEqual(double v1, double v2, double tol)
00034 {
00035    return (fabs(v2 - v1) < tol);
00036 }
00037 
00038 // verifica se v1 é menor ou igual a v2 numa tolerância
00039 xybool mtLessEqual(double v1, double v2, double tol)
00040 {
00041    return (v1<v2) || mtEqual(v1, v2, tol); // (); 
00042 }
00043 
00044 // verifica se v1 é menor ou igual a v2 numa tolerância
00045 xybool mtLessEqual(double v1, double v2)
00046 {
00047    return (v1<v2) || mtEqual(v1, v2); // (); 
00048 }
00049 
00050 // retorna a distância entre os pontos (x0, y0) e (x1, y1)
00051 double mtDistance(double x0, double y0, double x1, double y1)
00052 {
00053    return sqrt(fabs((x1 - x0) * (x1 - x0) + (y1 - y0) * (y1 - y0)));
00054 }
00055 
00056 // retorna a distância entre os pontos (x0, y0) e (x1, y1)
00057 double mtDistance(int x0, int y0, int x1, int y1)
00058 {
00059    return sqrt((double) abs((x1 - x0) * (x1 - x0) + (y1 - y0) * (y1 - y0)));
00060 }
00061 
00062 // faz a rotação no ponto (xi, yi) de um certo ângulo, resultando (xr, yr)
00063 void mtRotate(double xi, double yi, double angle, double* xr, double* yr)       
00064 {
00065    *xr = xi * cos(angle) - yi * sin(angle);
00066    *yr = xi * sin(angle) + yi * cos(angle);
00067 }
00068 
00069 // faz a rotação no ponto (xi, yi) de um certo ângulo, resultando (xr, yr)
00070 void mtRotate(int xi, int yi, double angle, int* xr, int* yr)   
00071 {
00072    *xr = (int) (xi * cos(angle) - yi * sin(angle));
00073    *yr = (int) (xi * sin(angle) + yi * cos(angle));
00074 }
00075 
00076 // verifica a interseção entre áreas
00077 xybool mtIntercept(double xmin1, double ymin1, double xmax1, double ymax1,
00078                 double xmin2, double ymin2, double xmax2, double ymax2)
00079 {
00080    if      (xmin1 > xmax2) return 0;
00081    else if (xmax1 < xmin2) return 0;
00082    else if (ymin1 > ymax2) return 0;
00083    else if (ymax1 < ymin2) return 0;
00084    else                    return 1;
00085 }
00086 
00087 // verifica a interseção entre áreas
00088 xybool mtIntercept(int xmin1, int ymin1, int xmax1, int ymax1,
00089                 int xmin2, int ymin2, int xmax2, int ymax2)
00090 {
00091    if      (xmin1 > xmax2) return 0;
00092    else if (xmax1 < xmin2) return 0;
00093    else if (ymin1 > ymax2) return 0;
00094    else if (ymax1 < ymin2) return 0;
00095    else                    return 1;
00096 }
00097 
00098 // verifica a inclusão entre duas áreas
00099 xybool mtInclude(double xmin1, double ymin1, double xmax1, double ymax1,
00100               double xmin2, double ymin2, double xmax2, double ymax2)
00101 {
00102    if ((xmin2 < xmin1) && (xmax1 < xmax2) && (ymin2 < ymin1) &&
00103        (ymax1 < ymax2))
00104           return xytrue;
00105    else
00106       return xyfalse;
00107 }
00108 
00109 // verifica a inclusão entre duas áreas
00110 xybool mtInclude(int xmin1, int ymin1, int xmax1, int ymax1,
00111               int xmin2, int ymin2, int xmax2, int ymax2)
00112 {
00113    if ((xmin2 < xmin1) && (xmax1 < xmax2) && (ymin2 < ymin1) &&
00114        (ymax1 < ymax2))
00115           return xytrue;
00116    else
00117       return xyfalse;
00118 }
00119 
00120 // verifica se o ponto está no retângulo
00121 xybool mtPointInRect(int px, int py, int x1, int y1, int x2, int y2)
00122 {
00123    return ((x1 <= px) && (px <= x2) && (y1 <= py) && (py <= y2));
00124 }
00125 
00126 // verifica se o ponto está no retângulo
00127 xybool mtPointInRect(double px, double py, double x1, double y1,
00128                    double x2, double y2)
00129 {
00130    return ((x1 <= px) && (px <= x2) && (y1 <= py) && ( py <= y2));
00131 }
00132 
00133 // verifica se o ponto está sobre a linha
00134 xybool mtPointInLine(double px, double py, double x1, double y1,double x2, double y2)
00135 {
00136    if ((x1 < px) && (px < x2))
00137       return mtEqual((y2 - y1) / (x2 - x1) * (px - x1) + y1, py);
00138    else
00139       return xyfalse;
00140 }
00141 
00142 // verifica se o ponto está sobre a linha (+ robusto) em pixel
00143 xybool mtPointInLineEx(int px, int py, int x1, int y1, int x2, int y2)
00144 {
00145    // modulo da linha
00146    double sz = mtDistance((double)x1, (double)y1, (double)x2, (double)y2);
00147 
00148    // menor que 1 pixel ? usa pick de ponto
00149    if ( sz <= 1.0 )
00150      return mtPointInsideCircle(px, py, x1, y1, (int)Tol);
00151    
00152    // direcao e normal da linha normalizadas
00153    double dx = (x2 - x1)/sz;
00154    double dy = (y2 - y1)/sz;
00155    double nx = dy;
00156    double ny = -dx;
00157    
00158    // menor distancia do ponto a reta
00159    double dist = (px - x1)*nx + (py - y1)*ny;
00160     
00161    // dentro da tolerancia ?
00162    if (mtEqual(dist,0.0))
00163    {
00164      // projecao na reta
00165      double proj = (px - x1)*dx + (py - y1)*dy;
00166 
00167      // dentro da reta ?
00168      if (proj > 0.0 && proj < sz)
00169        return xytrue;
00170    }   
00171    
00172    return xyfalse;
00173 }
00174 
00175 // verifica se o ponto está sobre a linha (+ robusto) em world
00176 xybool mtPointInLineEx(double px, double py, double x1, double y1,double x2, double y2)
00177 {
00178    // modulo da linha
00179    double sz = mtDistance(x1, y1, x2, y2);
00180 
00181    // direcao e normal da linha normalizadas
00182    double dx = (x2 - x1)/sz;
00183    double dy = (y2 - y1)/sz;
00184    double nx = dy;
00185    double ny = -dx;
00186    
00187    // menor distancia do ponto a reta
00188    double dist = (px - x1)*nx + (py - y1)*ny;
00189     
00190    // dentro da tolerancia ?
00191    if (mtEqual(dist,0))
00192    {
00193      // projecao na reta
00194      double proj = (px - x1)*dx + (py - y1)*dy;
00195 
00196      // dentro da reta ?
00197      if (proj > 0.0 && proj < sz)
00198        return xytrue;
00199    }   
00200    
00201    return xyfalse;
00202 }
00203 
00204 // verifica se o ponto está sobre uma marca
00205 xybool mtPointInMark(int px, int py, int x1, int y1, int tol)
00206 {
00207    // limites de tolerância para a igualdade
00208    int xmn = x1 - tol;
00209    int xmx = x1 + tol;
00210    int ymn = y1 - tol;
00211    int ymx = y1 + tol;
00212 
00213    if ((xmn < px) && (px < xmx) && (ymn < py) && (py < ymx))
00214       return xytrue;
00215    else
00216       return xyfalse;
00217 }
00218 
00219 
00220 // verifica se ponto está dentro um círculo
00221 xybool mtPointInsideCircle (int px, int py, int cx, int cy, int radius)
00222 {
00223    double dist = mtDistance ((double)px, (double)py, (double)cx, (double)cy);
00224 
00225    if ( dist < radius )
00226       return xytrue;
00227 
00228    return xyfalse;
00229 }
00230 
00231 // verifica se ponto está sobre um círculo
00232 xybool mtPointInCircle (int px, int py, int x0, int y0, int x1, int y1)
00233 {
00234    // distância entre os pontos (x0, y0) e (x1, y1), raio do círculo
00235    double radius = mtDistance (x0, y0, x1, y1);
00236 
00237    // distância entre (x0, y0) e (px, py)
00238    double distance = mtDistance (x0, y0, px, py);
00239 
00240    // verifica se a distâncias de (px, py) ao centro do círculo é igual
00241    // ao raio; se for igual o ponto está sobre o círculo
00242    if (mtEqual(distance, radius))
00243       return xytrue;
00244 
00245    return xyfalse;
00246 }
00247 

XY
Tecgraf / PUC-Rio - Computer Graphics Technology Group