Comunidad de diseño web y desarrollo en internet online

cómo calculo el área de polígonos irregulares

Citar            
MensajeEscrito el 19 Ago 2005 11:33 pm
hola amigos de clab
estoy metiendo información en una base de datos sobre dimensiones de parcelas, entre otras cosas debo calcular su Area. Si fueran polígonos regulares o tuvieran medidas geométricas básicas, la cosa sería sencilla,
triángulo A=b*h/2
rectángulo A=b*h
cuadrado A=l*l
paralelogramo etc


la cosa es que quiero que el cálculo se haga automáticamente y :twisted: no logro hacer :twisted: de que el programa reconozca automáticamete de qué figura se trata y más complicado aún cuando se trata de parcelas con lados totalmente distintos, ejemplo un lote de lado norte 13 m, de lado sur 11.48, lado este 19 m y lado oeste 21.4

una ayudita...



gracias

Por cusiri

341 de clabLevel

2 tutoriales

Genero:Masculino  

Trinidad - Beni - Bolivia

firefox
Citar            
MensajeEscrito el 19 Ago 2005 11:43 pm
obviamente debes calcular el area por partes es decir debes idear una formula que calcule el area de cualquier figura de por lo menos 3 lados.

pudieses tomar por ejemplo

norte y sur, las restas y calculas ese rectangulo usando como lado faltante la mayor entre oeste y este.

luego lo que te sobro de la resta norte sur lo calculas en otro rectangulo

y luego calculas las areas de los triangulos restantes que son medidas conocidas.

como las medidas siempre las tomas que comienzan en 0, te deberian quedar figuras parecidas a un trapecio.

espero no estar muy errado en esto jejeje

Saludos 8)

Por Prozac

SWAT Team

1546 de clabLevel

1 tutorial

Genero:Masculino   SWAT

donde se regresa el viento

firefox
Citar            
MensajeEscrito el 19 Ago 2005 11:48 pm
gracias, hmmmm...
eso lo hago en un papel y es la forma manual de hacerlo. pero...
yo quiero algo que no importe las medidas que introduzca salga calculada el área.

algo así como en arcview cuando se dibuja un polígono calcula el área el solito

Por cusiri

341 de clabLevel

2 tutoriales

Genero:Masculino  

Trinidad - Beni - Bolivia

firefox
Citar            
MensajeEscrito el 19 Ago 2005 11:51 pm
bueno, lo que tienes es que programarlo!!

bueno me altere un poco :shock: ahorita no te puedo ayudar mas

como en 2 o 3 horas si estoy mas libre

Saludos

Por Prozac

SWAT Team

1546 de clabLevel

1 tutorial

Genero:Masculino   SWAT

donde se regresa el viento

firefox
Citar            
MensajeEscrito el 25 Ago 2005 03:12 am
:? ... tambien existe una formula para calcular areas triangulo usando el perimetro, ....el algoritmo es Area=raiz cuadrada de(p*(p-a)*(p-b)*(p-c)) donde p es el semiperimetro(perimetro entre dos) y a,b y c los lados. puedes definir algunos algoritmos dependiendo del numero de lados, supongo que tienes las coordenadas de los puntos no? :wink:

No se si me xplico, si es cuadrado que utilise los vertices a,b,c + a,c,d, como dos triangulos y la suma de sus areas es lo que te interesa, pero si son 5 lados, utilizas 3 triagulos el abc, el ace y cde,..no se yo creo que por ahi tambien te puede salir, amenos que tengas la ecuacion y encuentres el area bajo la curva :lol: :lol:

P.D. Orale se me hace raro que alguien mencione el arcview.. es chido, con el voy a hacer mi tesis.

Por hijadecaissa

35 de clabLevel



Genero:Femenino  

msie
Citar            
MensajeEscrito el 25 Ago 2005 03:16 am
creo que la pregunta mas importante aqui es el numero de lados de la figura que tan variable es??

de 3 a 4, de 3 a 8, eso ayudaria mucho a resolver esto

Por Prozac

SWAT Team

1546 de clabLevel

1 tutorial

Genero:Masculino   SWAT

donde se regresa el viento

firefox
Citar            
MensajeEscrito el 25 Ago 2005 03:32 am
si es para parcelas reales..creanme que varia mucho.. ok me presentoun poco, soy pasante de ingeneira geomatica(topografa con satelites...) y por lo que he trabajado puede ser desde un simple triangulo a las figuras mas obtusas, y programas como arcview y autocad te dan areas de un solo click... pero aun no se bien como lo hacen

Por hijadecaissa

35 de clabLevel



Genero:Femenino  

msie
Citar            
MensajeEscrito el 25 Ago 2005 07:43 pm
alguna vez hice ese programa en la universidad, segun me acuerdo se puede hacer con el teorema de trapecios aunque yo lo hice fue con coordenadas, eso si te sirve para poligonos regulares, irregulares, convexos y concavos

Por hackjasl

72 de clabLevel



 

firefox
Citar            
MensajeEscrito el 26 Ago 2005 04:12 am
hola y qué gusto hijadecaissa

pues son parcelas de propiedades urbanas (terrenos donde se construyen casas y vive la gente.......)

bueno en realidad no es tanto los lados, pueden ser 4 el problema es que cuando no son figuras con forma definida (cuadrado, rectang, etc) me varía mucho. una figura de cuatro lados totalmente distintos........ a ver a ver mientras escribo esto se me está ocurriendo algo.....
ya les cuento......

Por cusiri

341 de clabLevel

2 tutoriales

Genero:Masculino  

Trinidad - Beni - Bolivia

firefox
Citar            
MensajeEscrito el 26 Ago 2005 07:00 am
bueno, yo kreo que el mayor problema reside en indicarle al prg que parte del poligono es la de dentro y cual es la de fuera, aun asi... explikanos un poko mas como haces los poligonos, si los dibujas a mano, en tiempo de ejecucion, si hay un orden en la creacion de puntos...

una idea para hacerlo en plan "super-mega-cutre" si y solo si los poligonos no son nada grandes, es que cojas un MC de 1x1 pixels, lo muevas por la pantalla y cadavez que colisione (hitTest) con el poligono le sumas uno a cierta variable

Al menos en dibujo tecnico el area la calculabamos a base de dividir el poligono en triangulos, pero klaro, porque sabiamos que triangulos hacer!

Con esto se me ocurren dos ideas :
1.- si eres tu quien dibuja las parcelas, dibujes MC que sean triangulos, despues con un for los recores y vas sumando las areas
2.- si es el usuario quien lo dibuja entonces es sencillo, cuando haya pulsado 3 veces ya tendra un triangulo, pues de ahi sacas su area, en la siguiente hay dos opciones, o pulsa dentro del triangulo (el area seria mas pekeña y por tanto se resta] o pulsa fuera del triangulo, el area se suma, para hacer esto facil (ya que con mates podrias saber si estas dentro o fuera del triangulo, a la vez que va señalando puntos, vas crando un MC, con esto, asi puedes controlar con hitTest donde pulso....,

**Aclaracion ** con cada pulsacion nueva, lo que haces es añadir un punto al poligono, y por tanto un triangulo a lo que ya existia, a menos que sea muy retorcido el dibujo, creo que no fallaria

Por _CONEJO

BOFH

7639 de clabLevel

17 tutoriales
21 articulos

 

firefox
Citar            
MensajeEscrito el 27 Ago 2005 03:17 am
gracias ICEM4N, es una buena idea la que propones, el detalle es el siguiente:

tengo la base de datos con campos de texto para introducir valores (números)
la cosa es que me estaba complicando queriendo hacer las posibilidades infinitas osea polígonos n lados, pero voy a seguir nomás las normas catastrales y poner solo cuatro campos para introducir las dimensiones norte, sur, este, y oeste

ya hice la comparación, cuando solo haya 3 valores y uno vacío se trata de un triángulo, cuando se introduzcan 4 valores se compara si dos de ellos (ej norte y sur) son iguales y los otros dos iguales entre si, entonces tengo un rectángulo. Cuando varíen entonces aplicaré las odiadas fórmulas de integrales que acabo de encontrar entre mis apuntes de cuando hace muuuchoooo tiempo llevé cálculo en la U

cuando lo complete posteo el código

Por cusiri

341 de clabLevel

2 tutoriales

Genero:Masculino  

Trinidad - Beni - Bolivia

firefox
Citar            
MensajeEscrito el 27 Ago 2005 09:28 am
Code or Die Trying ...

Código :


var escucha:Object = new Object();
var ar:Array = new Array();
var aT:Number = 0;

escucha.onMouseDown = function () {
   ar.push(new Array(_root._xmouse,_root._ymouse));
   var l:Number = ar.length;
   if(l>=3){
      if(_root.area.hitTest(_root._xmouse,_root._ymouse,true)){
         aT -= areaTriangulo(ar[l-1][0],ar[l-1][1],ar[l-2][0],ar[l-2][1],ar[l-3][0],ar[l-3][1]);
      } else { 
         aT += areaTriangulo(ar[l-1][0],ar[l-1][1],ar[l-2][0],ar[l-2][1],ar[l-3][0],ar[l-3][1]);
      };
      _root.createEmptyMovieClip ("area", 1);
       _root.area.beginFill (0x0000FF, 50);
         _root.area.lineStyle (1, 0xFF00FF, 100);
      _root.area.moveTo(ar[0][0],ar[0][1]);
      for(var i:Number = 1;i<l;i++) {
          _root.area.lineTo (ar[i][0],ar[i][1]);
      };
      _root.area.lineTo(ar[0][0],ar[0][1]);
       endFill();
   };
   trace("El area seleccionada es de : "+aT+" pixeles cuadrados");
};


Mouse.addListener(escucha);

function distancia(xa,ya,xb,yb) {
   return Math.sqrt(Math.pow(xa-xb,2)+Math.pow(ya-yb,2));
};

function areaTriangulo(xa,ya,xb,yb,xc,yc) {
   var a:Number = distancia(xa,ya,xb,yb);
   var b:Number = distancia(xb,yb,xc,yc);
   var c:Number = distancia(xc,yc,xa,ya)
   var p:Number = (a+b+c)/2;
   return Math.sqrt(p*(p-a)*(p-b)*(p-c));
};



Copien y Peguen en Flash, despues vayan pinchando, el script vabien con las medidas correctas hasta que se crucen dos lineas..., pero para poligonos irregulares "sin agujeros"[viva esa topologia!!] funciona bien

Por _CONEJO

BOFH

7639 de clabLevel

17 tutoriales
21 articulos

 

firefox
Citar            
MensajeEscrito el 10 Oct 2008 01:15 am
En realidad la respuesta es simple pero tienes que poner atención y seguir el procedimiento que te voy a a dar, es algo de jugar a la geometría elemental y aceptar el reto:

traza una figura con los lados de las medidas que te dan o a escala...
Luego para que no pienses que se va a volver una figura inestable, traza la diagonal de un vertice a otro quele sea opuesto, si la figura es de cuatro lados el resultado seran dos triangulos, ( de acuerdo)...
ya lo estas haciendo. El truco de trazar la diagonal es para darle estabilidad a la estructura, por que con unas maderas puedes construir una maqueta y comprobar que estos poligo9nos son inestables, los dos triangulos obtenidos serviran para definir estas areas de figuras irregulkares y comportamiento irregular en las estructuras como la respèctiva mitad de un cuadrilatero mas regular que el primero, (el que dio origen a tu problema).
ya estas??????
ahora traza la altura pewrpendicular a la diagonal del cuadrlatero original, (para cada triangulo obenido).
bien tienes dos triangulos con sus bases y alturas definidas.
ya¡¡¡¡¡
ahorate voy a revelar el secreto.
ya te diste cuenta de lo que paso.
el area que quieres medir es igual a = diagonal x (altura 1 + ALTURA2) /2
en realidad tienes dos posibles poligonos regulares generados poor uno irregular.
entendiste???????
dependiendo de que vertice elijas para estabilizar tu estructura.
si son parcelas como tu dices. Pues se trata de areas establles entonces el anterior procedimiento aplica con mas razón.
recuerda tienes que generar los dos poligonos de cuatro lados.
espero que almenos lo intentes.
Tiene que ver con tres paralelas.
cualquier duda estoy para servirte

Por Marco Antonio Hernandez R

1 de clabLevel



 

msie
Citar            
MensajeEscrito el 10 Oct 2008 01:19 am
para un poligono de cinco lados debes dividir uno por la mitad y trazar desde ahi, para el vertice entree los dos lados y el tercero adyacente....
si fuera un poligono regular sería como el parteaguas de la casita, y tendrias dos poligonos de cuatroi lados, como en le ccaso anterior
y en un poligono de seis tambien es sencillo solo tomas tres lados y construyes el cuarto tomando los vertices opuestos de tres y tres...

Por Marco Antonio Hernandez R

1 de clabLevel



 

msie
Citar            
MensajeEscrito el 28 May 2010 07:45 pm
Hola, excelente foro. Gracias por compartir.
Tengo un problema con los Array.
Seguí las indicaciones de _conejo (un capo!!) y anda excelente, pero ahora quisiera saber si se puede validar un área ingresada y dibujar otro polígono.
De hecho, ya lo tengo realizado (lo de la validación y de dibujar otro polígono) pero al quere colorear el siguiente polígono resulta que me borra el anterior.
por lo que vi mi problema está en la generación del Array... tengo:

var ar:Array = new Array();
for (j=1; j<=_root.clics.text; j++) {
ar.push(new Array(posicionXalmacenada, posicionYalmacenada));

lo que quisiera es que genere un nuevo Array (llamado "ar" en el ejemplo) de modo que quede ar_1, ar_2... a_rn tantas veces como areas dibujé... se entiende?
gracias!

Por panchod

5 de clabLevel



 

msie7
Citar            
MensajeEscrito el 12 May 2014 06:22 pm
Bueno, el codigo es muy facil de implementar, sin embargo por falta de tiempo solo te paso la formula :)
El proceso se basa en el calculo por Determinantes en Matrices, que si deseas para 2D seria una matriz de 2xN, y si es en 3D seia de 3xN.
Hagamoslo para 2D. Viendo un poco de teoria:

Sea A1 , A2 , A3 , ........, An un polígono de “n” lados cuyos vértices nombrados en sentido antihorario, tiene como coordenadas :

A1: x1,y1
A2: x2,y2
A3: x3,y3
A4: x4,y4
.......
An: xn,yn

Entonces el area S esta dada por:

Llamada también formula determinante de Gauss

Debes de tener en cuenta que la primera coordenada se repite al final de la matriz

Pero como calculas la determiante, pues facil, solo debes de multiplicar y sumar de manera intercalada, tanto para la izquierda como para la derecha, luego estos dos valores los restas, el resultado de esta operacion es la determiante.

veamos un ejemplo:

A: x=10, y=-10
B: x=5, y=9
C: x=8, y=5
D: x=10, y=0
E: x=12, y=-5

Entonces, creamos la matriz:
A: 10 10
B: 5 9
C: 8 5
D: 10 0
E: 12 -5
A: 10 10

Fijate que el vertice A se ha repetido al final de la lista.
Ahora multiplicamos de manera cruzada tanto por la izquierda como por la derecha

Izq=10*9+5*5+8*0+10*(-5)+10*10=165
Der=10*5+9*8+5*10+0*12+(-5)*10=122

Iisto!!, entonces la determiante sera:

Det=165-122=43

Por lo tanto el area es:

Area=S=43/2=21.5

Ojo!!!! si el area te sale negativo, no te asustes, el motivo es porque no pusiste la lista de coordenadas en sentido antihorario, para corregirlo simplemente no consideres el sigo, en todo caso dicho signo te servira para "detectar" en que sentido se han tomado los vertices, esto es util por ejemplo para determinar los angulos internos del poligono.

Espero te sirva.....

Si tengo tiempo te paso el codigo....

Por gask

0 de clabLevel



 

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.