van saldos que hacer estructura ejemplo cuentas contabilidad comprobacion como balanza ajustado java line

java - saldos - cuentas de la balanza de comprobacion



La comprobación es un punto(x, y) entre dos puntos dibujados en una línea recta (6)

Creo que lo mas simple es

// is BC inline with AC or visa-versa public static boolean inLine(Point A, Point B, Point C) { // if AC is horizontal if (A.x == C.x) return B.x == C.x; // if AC is vertical. if (A.y == C.y) return B.y == C.y; // match the gradients return (A.x - C.x)*(A.y - C.y) == (C.x - B.x)*(C.y - B.y); }

Puede calcular el gradiente tomando la diferencia en los valores de x dividida por la diferencia en los valores de y.

Nota: hay una prueba diferente para ver si aparece C en la línea entre A y B si lo dibuja en una pantalla. Las matemáticas asumen que A, B, C son puntos infinitamente pequeños. En realidad muy pequeño al error de representación.

He trazado una línea entre dos puntos A (x, y) --- B (x, y) Ahora tengo un tercer punto C (x, y). Quiero saber que si C se encuentra en la línea que se traza entre A y B. Quiero hacerlo en lenguaje java. He encontrado un par de respuestas similares a esto. Pero, todos tenemos algunos problemas y nadie es perfecto.


Creo que todos los métodos aquí tienen un escollo, ya que no están tratando con los errores de redondeo tan rigurosamente como podrían. Básicamente, los métodos descritos le indicarán si su punto está lo suficientemente cerca de la línea utilizando un algoritmo sencillo y será más o menos preciso.

¿Por qué la precisión es importante? Porque es el mismo problema que presenta op. Para un programa de computadora no hay tal cosa como un punto en una línea, solo hay un punto dentro de una épsilon de una línea y lo que ese épsilon necesita documentarse.

Vamos a ilustrar el problema. Usando el algoritmo de comparación de distancia:

Digamos que un segmento va de (0, 0) a (0, 2000), estamos utilizando flotadores en nuestra aplicación (que tienen alrededor de 7 decimales de precisión) y comprobamos si un punto en (1E-6, 1000) es en la línea o no.

La distancia desde cualquier extremo del segmento al punto es 1000.0000000005 o 1000 + 5E-10, y, por lo tanto, la diferencia con la adición de la distancia desde y hacia el punto es alrededor de 1E-9. Pero ninguno de esos valores se puede almacenar en un flotador con suficiente precisión y el método devolverá true .

Si usamos un método más preciso como calcular la distancia al punto más cercano en la línea, devuelve un valor que un flotador tiene suficiente precisión para almacenar y podríamos devolver falso según el épsilon aceptable.

Utilicé flotadores en el ejemplo, pero lo mismo se aplica a cualquier tipo de punto flotante, como el doble.

Una solución es usar BigDecimal y el método que desee si incurrir en el rendimiento y el impacto de la memoria no es un problema.

Un método más preciso que la comparación de distancias para puntos flotantes y, lo que es más importante, una precisión constante , aunque a un costo computacional más alto, es calcular la distancia al punto más cercano en la línea.

Distancia más corta entre un punto y un segmento de línea

Parece que estoy dividiendo los pelos pero tuve que lidiar con este problema antes. Es un problema cuando se encadenan operaciones geométricas. Si no controla con qué tipo de pérdida de precisión está lidiando, eventualmente se encontrará con errores difíciles que lo forzarán a razonar rigurosamente sobre el código para corregirlos.


Las respuestas anteriores son innecesariamente complicadas. El más simple es el siguiente.

  1. Si (x-x1) / (x2-x1) = (y-y1) / (y2-y1) = alfa (una constante), entonces el punto C (x, y) estará en la línea entre los pts 1 y 2 .

  2. Si alfa <0.0, entonces C es exterior al punto 1.

  3. Si alfa> 1.0, entonces C es exterior al punto 2.
  4. Finalmente, si alfa = [0,1.0], entonces C es interior a 1 y 2.

Espero que esta respuesta ayude.


Una forma fácil de hacer eso creo que sería la verificación del ángulo formado por los 3 puntos. Si el ángulo ACB es de 180 grados (o cerca de él, dependiendo de la precisión que desee), el punto C se encuentra entre A y B.


¡ATENCIÓN! Sólo para matemáticas

Puedes probar esta fórmula. Ponga sus coordenadas A(x1, y1) y B(x2, y2) en la fórmula, luego obtendrá algo como

y = k*x + b; // k and b - numbers

Entonces, cualquier punto que satisfaga esta ecuación, estará en su línea. Para verificar que C(x, y) esté entre A(x1, y1) y B(x2, y2) , verifique esto: (x1<x<x2 && y1<y<y2) || (x1>x>x2 && y1>y>y2) (x1<x<x2 && y1<y<y2) || (x1>x>x2 && y1>y>y2) .

Ejemplo

A(2,3) B(6,5)

La ecuación de línea:

(y - 3)/(5 - 3) = (x - 2)/(6 - 2) (y - 3)/2 = (x - 2)/4 4*(y - 3) = 2*(x - 2) 4y - 12 = 2x - 4 4y = 2x + 8 y = 1/2 * x + 2; // equation of line. k = 1/2, b = 2;

Vamos a comprobar si C(4,4) encuentra en esta línea.

2<4<6 & 3<4<5 // C between A and B

Ahora pon las coordenadas C a la ecuación:

4 = 1/2 * 4 + 2 4 = 2 + 2 // equal, C is on line AB

PD: como escribió @paxdiablo, debes verificar si la línea es horizontal o vertical antes de calcular. Sólo revisa

y1 == y2 || x1 == x2


if (distance(A, C) + distance(B, C) == distance(A, B)) return true; // C is on the line. return false; // C is not on the line.

o solo:

return distance(A, C) + distance(B, C) == distance(A, B);

La forma en que funciona esto es bastante simple. Si C se encuentra en la línea AB , obtendrás el siguiente escenario:

A-C------B

y, independientemente de dónde se encuentre en esa línea, dist(AC) + dist(CB) == dist(AB) . Para cualquier otro caso, tiene un triángulo de alguna descripción y ''dist (AC) + dist (CB)> dist (AB)'':

A-----B / / / / C

De hecho, esto incluso funciona si C se encuentra en la línea extrapolada:

C---A-------B

Siempre que las distancias se mantengan sin firmar. La distancia dist(AB) se puede calcular como:

___________________________ / 2 2 V (A.x - B.x) + (A.y - B.y)

Tenga en cuenta las limitaciones inherentes (precisión limitada) de las operaciones de punto flotante. Es posible que deba optar por una prueba "lo suficientemente cerca" (por ejemplo, menos de una parte por millón de error) para garantizar el correcto funcionamiento de la igualdad.