Está en la página 1de 10

ENTIDADES Y SISTEMAS DE COORDENADAS

por Reinaldo Togores Fernndez <rtogores@mundivia.es> En nuestro artculo anterior, proponamos un programa para la conversin de polilneas 3D en polilneas 2D. Dicho programa posea una limitacin: slo operaba sobre polilneas 3D contenidas en el plano XY o en planos paralelos a l. El motivo de esta limitacin reside en la diferente manera en que se expresan las coordenadas de los vrtices de las polilneas 3D y 2D. En las primeras, los vrtices se expresan en coordenadas referidas al Sistema de Coordenadas Universal (SCU). En las segundas las coordenadas estaran expresadas en el Sistema de Coordenadas de Objeto (SCO) de cada entidad particular. Ambos sistemas slo coincidiran en caso de que el SCO sea idntico al SCU. An cuando este anlisis tena en cuenta slo las polilneas clsicas, lo mismo vale para las polilneas optimizadas de la versin 14. Como prometimos entonces, en este segundo artculo abordamos la problemtica de aplicar dicha conversin a polilneas 3D coplanares situadas en cualquier posicin en el espacio.

I. SISTEMAS DE COORDENADAS:
Comenzaremos por una breve discusin de los sistemas de coordenadas implicados. Examinemos los datos utilizados por AutoCAD para definir dos entidades 2D, en este caso crculos, con el centro en el mismo punto del espacio, contenido uno de ellos (que llamaremos A) en el plano XY del SCU y el otro (B) en un plano paralelo al plano XY de un Sistema de Coordenadas Personales (SCP) definido a partir de un giro de 45 en torno al eje Y Universal.
Lista de entidad Crculo A:
( Nombre de Entidad Tipo de Entidad Identificador Subclase Espacio Capa Subclase Centro Radio Vector Normal (-1 . <Entity name: 25e0558>) (0 . "CIRCLE") (5 . "2B") (100 . "AcDbEntity") (67 . 0) (8 . "0") (100 . "AcDbCircle") (10 10.0 10.0 0.0) (40 . 5.0) (210 0.0 0.0 1.0) )

Lista de entidad Crculo B:


( (-1 . <Entity name: 25e0560>) (0 . "CIRCLE") (5 . "2C") (100 . "AcDbEntity") (67 . 0) (8 . "0") (100 . "AcDbCircle") (10 10.0 -7.07107 7.07107) (40 . 5.0) (210 0.707107 0.0 0.707107) )

De la lista de asociacin identificada con el cdigo 10 obtenemos con (cdr (assoc 10 lista_entidad)) la informacin que corresponde a las coordenadas del centro del crculo. a) Crculo A: b) Crculo B: X = 10.0 X = 10.0 Y = 10.0 Y = -7.07107 Z = 0.0 Z = 7.07107 1

Pero este centro que genera dos series de valores XYZ diferentes es en realidad el mismo punto. Ms an, si investigamos el valor de sus coordenadas utilizando el comando ID obtendramos: c) En el SCU: d) En el SCP 1 : X = 10.0000 X = 7.0711 Y = 10.0000 Y = 10.0000 Z = 0.0000 Z = 7.0711

El resultado es harto sorprendente: Tres valores distintos (a-c, b y d) para un mismo punto del espacio. La explicacin reside en que los tres valores resultan de los tres sistemas diferentes en que dichas coordenadas se expresan: 1. Sistema de Coordenadas Universales (SCU): es el sistema "de referencia", en funcin del cual se definen todos los dems. Este sistema es siempre el mismo, por lo que los valores medidos con respecto a l permanecen constantes cuando se pasa a otros sistemas. Es el valor que obtenemos en respuesta al comando ID estando activo el SCU. 2. Sistema de coordenadas Personales (SCP): es el sistema de trabajo. El usuario puede especificar en cada momento el SCP mas adecuado a las tareas de dibujo que realiza. Todos los puntos que se transmiten a los comandos de AutoCAD, incluidos los devueltos por funciones externas y rutinas de AutoLISP, estn en el sistema SCP actual (a menos que el usuario los preceda de un * en la solicitud Comando). Los valores que obtuvimos a partir del comando ID son fcilmente explicables teniendo en cuenta el giro de 45 en torno al eje Y de nuestro SCP (resultando el valor de X e Y = 10 x cos 45). 3. Sistema de Coordenadas de Objeto (SCO): en este sistema, que hace referencia al propio objeto, se expresan los valores de los puntos en la lista de entidad (grupos DXF 10 al 37) devuelta por la funcin ENTGET.

II. VECTOR NORMAL Y DEFINICIN DEL SCO:


Observemos el otro campo en que difieren los registros de entidad de ambos crculos:
Vector Normal: (210 0.0 0.0 1.0) (210 0.707107 0.0 0.707107)

El cdigo 210 identifica el vector unitario normal, un vector 3D de longitud igual a la unidad que describe (salvo excepciones que ms adelante sealaremos) el eje Z del SCO. Para una direccin dada del eje Z o extrusin, hay un nmero infinito de sistemas de coordenadas, definidas mediante la traslacin del origen en el espacio 3D y la rotacin de los ejes X e Y en torno al eje Z. Sin embargo, para una direccin del eje Z, hay un nico SCO que se define a partir de los siguientes criterios: Su origen coincide con el origen del SCU. La orientacin de los ejes X e Y dentro del plano XY se calculan de una manera que es descrita en la documentacin de AutoCAD como arbitraria pero consistente, mediante el llamado Algoritmo de Eje Arbitrario, cuya discusin hara demasiado extensa esta exposicin.

Estos dos criterios explican que el SCO no coincida necesariamente con el SCP vigente en el momento de dibujarse la entidad. Y de ah los valores discordantes que pueden obtenerse para los puntos de una entidad segn se investiguen con comandos como ID y LIST o provengan de la lectura de la lista de entidad del objeto que se obtiene a partir de la funcin ENTGET, an cuando la lectura de esos valores se realice estando vigente el mismo SCP en que fue dibujada originalmente

El mismo SCP utilizado anteriormente para el dibujo del crculo B 2

la entidad. Obviamente, ser necesario convertir siempre a coordenadas del SCO los valores de los puntos que se pasen a las funciones ENTMOD o ENTMAKE para la modificacin de estas entidades o para la creacin de otras nuevas de las mismas caractersticas. En algunos casos el SCO coincidir con el SCU. Este es el caso de las entidades 3D, es decir, las entidades que pueden dibujarse en planos no paralelos al plano XY del SCP actual. Estas entidades incluyen lneas, puntos, 3Dcaras, polilneas y vrtices 3D, mallas y vrtices de mallas 3D y splines. En todos estos casos, los valores XYZ estarn dados con referencia al SCU. No sucede lo mismo con las Entidades 2D (crculo, arco, slido 2D, trazo, texto, atributo y definicin de atributo, forma, insercin de bloque, polilnea 2D, vrtice 2D) que slo pueden dibujarse en el plano XY del SCP actual o en planos paralelos al mismo. Sus coordenadas se expresan siempre en valores referidos al SCO. 2 Al referirnos ms arriba al significado del cdigo 210 lo describamos como vector normal que permite definir la direccin Z del SCO. El vector normal que describira el SCU estara dado por la lista de tres nmeros reales (0.0,0.0,1.0). Pero el dato de la lista asociada al cdigo 210 no nos permite siempre determinar si el SCO y el SCU coinciden. Ser necesario tener en cuenta una serie de excepciones en que el valor asociado a este cdigo sera mejor descrito como vector de extrusin. En general, las entidades 3D no pueden tener Altura de Objeto. Se dan dos excepciones a esta regla: la lnea y el punto. En ambas entidades este vector no representa el sistema de coordenadas que definen su posicin en el espacio, sino la direccin del vector normal del SCP en que dichas entidades fueron creadas y que sirve para determinar la direccin en el espacio en que se producir su extrusin al establecerse un valor diferente de cero para su Altura de Objeto. Aunque no es susceptible de ser extruda, tambin presenta una anomala de este tipo la entidad SPLINE cuando la misma es coplanar. Cuando en la lista de entidad no aparece este cdigo, se sobreentiende que sus coordenadas estn referidas al SCU.

III. TRANSFORMACIN DE COORDENADAS ENTRE SISTEMAS


Para la conversin entre sistemas de coordenadas AutoLISP dispone de la funcin TRANS: (trans pto orig dest [desp]) En el caso que nos ocupa, la conversin se hara desde el SCU (ya que nos proponemos transformar una entidad 3D) al SCO que correspondera al plano que contiene los vrtices de la 3DPOL. La funcin TRANS admite como primer argumento pto un punto o vector de desplazamiento (lista de tres nmeros reales), un segundo argumento orig que indica el sistema de coordenadas al que se refieren los valores de pto, y un tercer argumento dest que especifica el sistema de coordenadas al que se transformarn los valores de pto. Un cuarto argumento opcional desp indica, si es distinto de cero que se trata de un vector en lugar de un punto. En el caso que nos ocupa. La funcin trans se aplicara a las coordenadas de cada vrtice (dato asociado al cdigo 10 de la lista de entidad) y el sistema de coordenadas de origen siempre sera, segn hemos explicado ms arriba, el SCU. El problema estara en definir cul sera el SCO que correspondera a la nueva entidad Polilnea 2D que pretendemos construir. Analicemos para ello las formas de especificar los sistemas de coordenadas que acepta la funcin TRANS.

Un caso especial lo constituyen las acotaciones, entidades complejas en las que los valores de algunas coordenadas (las que corresponden a las entidades PUNTO utilizadas para sealar los puntos de definicin o defpoints) estn referidos al SCU y los valores de otras coordenadas (de los textos, etc.) al SCO. Por otra parte las ventanas grficas, a pesar de su naturaleza bidimensional, siempre se definen a partir de coordenadas en el SCU. 3

Sistema de Coordenadas: Universal SCU Personal SCP Pantalla SCV E. Papel SCVEP Objeto SCO

Especificacin: 0 1 (SCP actual) 2 (actual) 3 (slo en combinacin con el cdigo 2) Un nombre de entidad (asociado al cdigo 1 en la lista de entidad) Un vector de extrusin (vector unitario normal 3D)

Como no tenemos an una entidad a la que podamos recurrir para identificar el SCO empleando el primer procedimiento, no habr otra va que la de acometer el clculo del vector normal al plano que contiene la polilnea original. Como se trata de una polilnea 3D, lo primero que tendremos que hacer ser asegurarnos que todos sus vrtices se encuentran en el mismo plano. De no ser as, la conversin sera imposible. El procedimiento a seguir sera: Extraer de la entidad seleccionada la lista de sus vrtices. Extraer de dicha lista de vrtices tres que no sean colineales. Comprobar que cada uno de los vrtices restantes se encuentre situado en el plano definido por los tres vrtices seleccionados en el paso anterior, es decir que sean coplanares. Si la condicin anterior se cumple, calcular el vector normal al plano y proceder a la conversin.

Dichos procedimientos se abordarn como funciones de librera de uso general, susceptibles de ser incorporadas a cualquier programa.

IV. DESCRIPCIN DEL PROGRAMA


FUNCIN extpt: EXTRACCIN DE LA LISTA DE VRTICES. Prepara una lista de puntos a partir de las listas de entidad "POLYLINE". Debe ser llamada desde una funcin que compruebe que se trata de una polilnea (2D o 3D) y obtenga lista de entidad que debe pasar a esta funcin como argumento. Establece un bucle que termina al encontrar la entidad SEQEND. Devuelve la lista de valores asociados al cdigo 10 de cada vrtice. Utiliza la variable local tmplst. (defun extpt ( lista_ / tmplst ) (while (/= (cdr (assoc 0 (setq lista_ (entget (entnext (cdr (assoc -1 lista_)))) ) ) ) "SEQEND" ) (setq tmplst (cons (cdr (assoc 10 lista_)) tmplst)) ) (setq tmplst (reverse tmplst)) ) 4

FUNCIN colineal: COMPROBACIN DE LA COLINEALIDAD. El algoritmo empleado para determinar la condicin de colinealidad parte de la consideracin de las propiedades de los vectores determinados por tres puntos no coincidentes. En un sistema tridimensional de coordenadas rectangulares podemos representar los vectores unitarios desde el origen a los puntos (1,0,0), (0,1,0) y (0,0,1) por i, j y k. Cualquier vector en el espacio puede ser representado en funcin de estos vectores unitarios. De esta manera, el vector desde el origen al punto A(a,b,c) ser:

OA = A = ai + bj + ck
Los vectores ai, bj, y ck son los componentes x, y, z, del vector A. La longitud del vector A puede obtenerse a partir de las longitudes de los lados de los tringulos rectngulos OCA y ODC (Fig. 1).

Figura 1

Segn el teorema de Pitgoras tenemos que (OA)2 = (OC)2 + (CA)2 = (OD)2 + (DC)2 + (CA)2 = a2 + b2 + c2. De aqu que la longitud de A sea:

d =

(x2 x1)2 + (y2 y1)2 + (z2 z1)2

Generalizando el caso, un vector entre cualesquiera dos puntos del espacio, P1(x1,y1,z1) y P2(x2,y2,z2) tendra los componentes (x2-x1)i, (y2-y1)j, (z2-z1)k y se representara mediante la expresin (Fig. 2):

Figura 2

P1P2 = (x2-x1)i+ (y2-y1)j+ (z2-z1)k Y su longitud, la distancia entre P1 y P2, sera:

A =

a2 + b2 + c2

El criterio que nos permitir detectar la colinealidad de los tres puntos examinados se deriva de la formulacin del producto escalar de dos vectores:

A B = A B cos
Donde es el ngulo entre los vectores si se trazaran desde un origen comn. Los puntos seran colineales cuando cos = 1 en:

cos =

A B A B

El producto AB se obtendr mediante:

A B = a1 b1 + a2 b2 + a3 b3
De ah que si se cumple que:

a1 b1 + a2 b2 + a3 b3 a12 + a2 2 + a3 2 b12 + b2 2 + b3 2

= 0

podemos afirmar que los vectores A y B son colineales. El programa toma los tres primeros puntos de la lista que recibe como argumento y determina los valores de los coeficientes a1, a2 y a3 del primer vector y los coeficientes b1, b2 y b3 del segundo, sustituyendo dichos valores en la ecuacin anterior. Si la condicin es cierta devuelve T y si es falsa nil. (defun colineal ( ptlist / ) (setq p1 (car ptlist) p2 (cadr ptlist) p3 (caddr ptlist) a1 (- (car p2)(car p1)) a2 (- (cadr p2)(cadr p1)) a3 (- (caddr p2)(caddr p1)) b1 (- (car p3)(car p1)) b2 (- (cadr p3)(cadr p1)) b3 (- (caddr p3)(caddr p1))

;;Vector A = p1->p2

;;Vector B = p1->p3

) (if (equal (abs (/ (float(+ (* a1 b1)(* a2 b2)(* a3 b3))) (* (sqrt (float (+ (expt a1 2) (expt a2 2) (expt a3 2)))) 6

) T nil

) ) 1 0.00000001

(sqrt (float (+ (expt b1 2)(expt b2 2)(expt b3 2))))

Slo cabra observar que la igualdad se comprueba mediante la funcin EQUAL, que permite establecer un pequeo margen de error teniendo en cuenta el redondeo de las cifras en las operaciones efectuadas con nmeros reales. FUNCIN trio: SELECCIN DE TRES VRTICES NO COLINEALES. Esta funcin recorre la lista de vrtices de tres en tres hasta encontrar aqullos que pasados a la funcin colineal antes descrita obtengan nil como resultado. En el caso de que la lista incluya solamente dos vrtices, o que todos los vrtices fueran colineales (lo que implica que sern tambin coplanares), se construir un vrtice de manera arbitraria con el objetivo de poder definir uno de los infinitos planos que contienen a dichos vrtices. Cualquier punto del espacio sera vlido. En este caso hemos optado por incrementar en la unidad el valor de X del ltimo vrtice. ;;Funcin trio (defun trio (ptlist / tmplst) (setq tmplst ptlist) (cond ((= (length tmplst) 2) (setq p1 (car tmplst) p2 (cadr tmplst) p3 (list (1+ (car (last tmplst))) (cadr (last tmplst)) (caddr (last tmplst)) ) ) ) ((= (length tmplst) 3) (setq p1 (car tmplst) p2 (cadr tmplst) p3 (last tmplst) ) )

;;Si slo hay dos vrtices,

;;se construye uno arbitrario.

(t (while (and (colineal tmplst) (> (length tmplst) 3)) (setq tmplst (cdr tmplst)) ) )

;;mientras sean ms de tres ;;y sean colineales

;;Si todos son colineales, 7

;;se modifica el tercer vrtice (if (colineal (list p1 p2 p3)) (setq p3 (list (1+ (car p3)) (cadr p3) (caddr p3))) )

FUNCION plano: COMPROBACIN DE LA COPLANARIDAD: De los puntos incluidos en la lista la funcin trio ha seleccionado los tres primeros vrtices no colineales. A partir de ellos se determinar la frmula del lugar geomtrico del plano. Para hacerlo tendremos en cuenta que un vector perpendicular a dos lados del tringulo definido por dichos tres vrtices ser el vector normal al plano que contiene el tringulo en cuestin. Para encontrar este vector planteamos que: P1P2 = (x2-x1)i+(y2-y1)j+(z2-z1)k P1P3 = (x3-x1)i+(y3-y1)j+(z3-z1)k N = Ai + Bj + Ck El problema consistira en hallar los coeficientes A, B y C de manera que N fuera perpendicular a los otros vectores. As que: N P1P2 = (x2-x1)A+(y2-y1)B+(z2-z1)C = 0 N P1P3 = (x3-x1)A+(y3-y1)B+(z3-z1)C = 0 Para simplificar el sistema, asignamos el valor de C = 1. Una vez determinados los coeficientes A, B y C, se puede establecer la ecuacin del plano: Ax + By + Cz + D = 0 Cualquier punto cuyas coordenadas XYZ satisfagan dicha ecuacin pertenecer al plano considerado. (defun plano ( ptlist / tmplst resultado) ;;Se obtienen P1, P2 y P3 (trio ptlist) (setq A ;;Hallando el coeficiente A (/ (float ((* (- (caddr p3)(caddr p1))(- (cadr p2)(cadr p1))) (* (- (caddr p2)(caddr p1))(- (cadr p3)(cadr p1))) ) ) (float ((* (- (car p2)(car p1))(- (cadr p3)(cadr p1))) (* (- (car p3)(car p1))(- (cadr p2)(cadr p1))) ) ) ) B (/ (float ((* ((* () ;;Hallando el coeficiente B

(caddr p3)(caddr p1))((caddr p2)(caddr p1))(-

(car p2)(car p1))) (car p3)(car p1))) 8

) (float ((* (- (car p3)(car p1))(- (cadr p2)(cadr p1))) (* (- (cadr p3)(cadr p1))(- (car p2)(car p1))) ) ) ;;Hallando el coeficiente D:

D ((+ (* A (car p1)) (* B (cadr p1)) (caddr p1) ) )

;;Ahora se comprueban todos los puntos ;;de la lista original ;;contra la ecuacin del plano (setq resultado T tmplst ptlist) (repeat (length tmplst) (if (equal (+ (* A (car (car tmplst))) (* B (cadr (car tmplst))) (caddr (car tmplst)) D ) 0 0.00000001 ) ( ) (setq resultado nil) ) (setq tmplst (cdr tmplst)) ) resultado ;;La funcin devuelve cierto "T" o falso "nil"

FUNCIN normal: DETERMINACIN DEL VECTOR UNITARIO NORMAL. Una ecuacin del tipo Ax + By + Cz + D = 0 representa un plano perpendicular al vector N = Ai + Bj + Ck. De ah que una vez conocidos los coeficientes A y B necesarios para determinar la ecuacin del plano. Para obtener el vector unitario habr que dividir dichos coeficientes por la longitud del vector que respondera a la relacin que vimos ms arriba, obtenida a partir del teorema de Pitgoras:

A =

a2 + b2 + c2

(defun normal ( A B / ) ;;Determinar el vector normal unitario (list (/ A (sqrt (+ (expt A 2) (expt B 2) (expt 1 2))) ) (/ B (sqrt (+ (expt A 2) (expt B 2) (expt 1 2))) ) (/ 1 (sqrt (+ (expt A 2) (expt B 2) (expt 1 2))) ) ) ) FUNCIN test: PRUEBA DE LAS FUNCIONES PROPUESTAS. Para no hacer ms extenso este artculo, considerando ya haber abusado ms de la cuenta de la benevolencia de nuestros lectores, acabaremos integrando las funciones elaboradas a una pequea funcin de prueba. Esta funcin informara sobre la coplanaridad de cualquier polilnea seleccionada, y de ser coplanar, suministrara los valores del vector unitario normal. Si se trata de una polilnea 2D, pueden comprobarse estos valores con los asociados al cdigo 210 de la lista de entidad. En un prximo artculo aplicaremos estas funciones a la transformacin de polilneas 3D en polilneas 2D cuando las primeras no resultaran paralelas al plano XY del SCU. (defun c:test () (if (plano (extpt (entget (car (entsel))))) (progn (alert "Los vrtices de esta polilnea \nson coplanares") (setq vector_unitario (normal A B)) (alert (strcat "El vector normal unitario es: \n (" (rtos (car vector_unitario)) " " (rtos (cadr vector_unitario)) " " (rtos (caddr vector_unitario)) ")" ) ) ) (alert "Los vrtices de esta polilnea \nNO son coplanares") ) ) Reinaldo Togores Fernndez, Arquitecto Profesor asociado de Tcnicas de Expresin Grfica, Escuela Tcnica Superior de Ingenieros de Caminos, Canales y Puertos, Universidad de Cantabria Instructor de CAD del Instituto de Formacin y Estudios Sociales. Pgina WEB personal: http://personales.mundivia.es/personales/rtogores/

10

También podría gustarte