Función Circle/Line colision en VB.NET

Todo aquello que no está relacionado con Gemix Studio ni con la programación DIV en general.

Función Circle/Line colision en VB.NET

Postby erkosone » Tue Sep 25, 2012 7:04 pm

Pero esto aquí por si se me pierde, es bastante interesante.. si quereis traducirla a gemix adelante, yo lo haré también el breve..

Source Code (vb.net) [ Download ] [ Hide ]
  • Private Function FindLineCircleIntersections(ByVal cx As _
  •     Single, ByVal cy As Single, ByVal radius As Single, _
  •     ByVal x1 As Single, ByVal y1 As Single, ByVal x2 As _
  •     Single, ByVal y2 As Single, ByRef ix1 As Single, ByRef _
  •     iy1 As Single, ByRef ix2 As Single, ByRef iy2 As _
  •     Single) As Integer
  •     Dim dx As Single
  •     Dim dy As Single
  •     Dim A As Single
  •     Dim B As Single
  •     Dim C As Single
  •     Dim det As Single
  •     Dim t As Single
  •  
  •     dx = x2 - x1
  •     dy = y2 - y1
  •  
  •     A = dx * dx + dy * dy
  •     B = 2 * (dx * (x1 - cx) + dy * (y1 - cy))
  •     C = (x1 - cx) * (x1 - cx) + (y1 - cy) * (y1 - cy) - _
  •         radius * radius
  •  
  •     det = B * B - 4 * A * C
  •     If (A <= 0.0000001) Or (det < 0) Then
  •         ' No real solutions.
  •         Return 0
  •     ElseIf det = 0 Then
  •         ' One solution.
  •         t = -B / (2 * A)
  •         ix1 = x1 + t * dx
  •         iy1 = y1 + t * dy
  •         Return 1
  •     Else
  •         ' Two solutions.
  •         t = (-B + Sqrt(det)) / (2 * A)
  •         ix1 = x1 + t * dx
  •         iy1 = y1 + t * dy
  •         t = (-B - Sqrt(det)) / (2 * A)
  •         ix2 = x1 + t * dx
  •         iy2 = y1 + t * dy
  •         Return 2
  •     End If
  • End Function


Si devuelve 0 no hay colisión, si devuelve 1 hay colisión, si devuelve 2 hay "solapamiento" --> eso vale para seguir aplicando las leyes físicas pertinentes hasta conseguir que retorne 1 y en ese moemento es cuando se debe producir el calculo del rebote del circulo con la linea.
User avatar
erkosone
 
Posts: 10654
Joined: Tue Feb 24, 2009 2:13 pm
Location: Barcelona.

Re: Función Circle/Line colision en VB.NET

Postby erkosone » Wed Sep 26, 2012 9:29 am

Traducido a gemix: "ojo hay que modificar las 4 ultimos argumentos que van por referencia, devuelve los puntos de intersección."


Source Code (Gemix) [ Download ] [ Hide ]
  • /*
  • The FindLineCircleIntersections function calculates the points of intersection between a line and a circle.
  • It takes as parameters a circle's center point and radius, and two points on the line. It uses ByRef parameters to return the coordinates of the points of intersection.
  • The function returns the number of points of intersection (0, 1, or 2).
  • To fund the points of intersection, the code considers the line as generated by the equations:
  •  
  •     X(t) = x1 + (x2 - x1) * t
  •     Y(t) = y1 + (y2 - y1) * t
  • Where t ranges from 0 to 1 to draw the line segment.
  •  
  • The code plugs these equations into the equation for a circle:
  •  
  •     (X - Cx)^2 + (Y - Cy)^2 = radius^2
  • It then solves for t by using the quadratic formula. The result is 0, 1, or 2 values for t. It plugs those values back into the equations for the line to get the points of intersection.
  • */
  • function int BallVsLine(float cx, float cy, float radius_, float x1, float y1, float x2, float y2, float ix1, float iy1, float ix2, float iy2); // los 4 ultimos parametros deben ser por referencia.. arreglarlo.. guardan los puntos de intersección..
  • private
  •         float dx;
  •         float dy;
  •         float A;
  •         float B;
  •         float C;
  •         float det;
  •         float t;
  • begin
  •         dx = x2 - x1;
  •         dy = y2 - y1;
  •         A = dx * dx + dy * dy;
  •         B = 2 * (dx * (x1 - cx) + dy * (y1 - cy));
  •         C = (x1 - cx) * (x1 - cx) + (y1 - cy) * (y1 - cy) - radius * radius;
  •         det = B * B - 4 * A * C;
  •         If ( (A <= 0.0000001) Or (det < 0) )
  •                 Return (0);
  •         end
  •        
  •     If (det == 0)
  •                 t = -B / (2 * A);
  •         ix1 = x1 + t * dx;
  •         iy1 = y1 + t * dy;
  •         Return (1);
  •                 else
  •                         t = (-B + Sqrt(det)) / (2 * A);
  •                         ix1 = x1 + t * dx;
  •                         iy1 = y1 + t * dy;
  •                         t = (-B - Sqrt(det)) / (2 * A);
  •                         ix2 = x1 + t * dx;
  •                         iy2 = y1 + t * dy;
  •                         Return (2);
  •         End
  • end


No está probada.. en gemix las matematicas son un poco especiales y tengo que mirar que funcione bien esta traducción todavía, en cuanto sepa algo lo comento.
User avatar
erkosone
 
Posts: 10654
Joined: Tue Feb 24, 2009 2:13 pm
Location: Barcelona.

Re: Función Circle/Line colision en VB.NET

Postby kozka » Wed Sep 26, 2012 9:52 am

ahi ahi dale caña , que va por buen camino , afer si se consigue unas fisicas bistosas.
User avatar
kozka
 
Posts: 2111
Joined: Sun Feb 01, 2009 9:36 pm

Re: Función Circle/Line colision en VB.NET

Postby erkosone » Wed Sep 26, 2012 12:13 pm

Pues físicas no se.. pero los algoritmos de colisión entre shapes ya los voy teniendo todos :D

Tenemos ya en código gemix:
- Point2Line()
- Point2Circle()

- Circle2Point()
- Circle2Line()
- Circle2Circle()

- Line2point()
- Line2Circle()
- Line2Line()

Y las derivadas de las básicas que son para objetos de nivel 1 como el triangulo:
- Triangle2point()
- Triangle2Circle()
- Triangle2Line()
- Triangle2Triangle()

Y las derivadas de nivel 2 que forman polígonos están por venir por que me falta un solo dato mas que es cuando un polígono se encuentra dentro de otro polígono.. en cuanto lo saque tendrémos:
- Poligon2point()
- Poligon2Line()
- Poligon2Circle()
- Poligon2Poligon()


Y cuando este todo esto solo hará falta crear un sistema de entidades.. y ale.. luego ya las formulas físicas aplicadas al gestor de entidades y no a los procesos.. que eso es un completo error.. tiene que ir todo por arrays de items.. esto será bastante complicado por que en gemix no creo que podamos hacerlo.. hará falta una lib que cree instancias de un nuevo 'objeto real' o 'clase' la cual tenga ya por defecto todas las variables publicas necesarias y los metodos getter y setter necesarios para saber que tipo de objeto es, donde está su centro y donde están sus vertices.. y apartir de ahi montar el motor de física.


Ya estoy comprendiendo bastante bien como funciona esto.. en gemix mismo va a ser muy complicado hacerlo bien.. quizá a base de typedef´s haciendo arrays de objetos pueda hacerse, pero puede quedar algo bastante pesado.. por que ahora mismo los calculos son demasiado pesados, tengo primero que montarme una dll para gemix y portar toda la librería cmath.h de C++
User avatar
erkosone
 
Posts: 10654
Joined: Tue Feb 24, 2009 2:13 pm
Location: Barcelona.

Re: Función Circle/Line colision en VB.NET

Postby SimulatorOne » Wed Sep 26, 2012 12:46 pm

pide consejos a cictec y gino. quizas te pudan ayudar
User avatar
SimulatorOne
 
Posts: 6626
Joined: Tue Nov 17, 2009 2:52 pm
Location: Barcelona

Re: Función Circle/Line colision en VB.NET

Postby GINO » Wed Sep 26, 2012 1:18 pm

Si los parámetros son ByRef en vb deberías ponerlos como punteros en Gemix. De lo contrario no vas a poder cambiarles el valor a las variables que pases como parámetros a la función.
User avatar
GINO
 
Posts: 2823
Joined: Thu Jul 31, 2008 10:25 pm

Re: Función Circle/Line colision en VB.NET

Postby erkosone » Wed Sep 26, 2012 1:56 pm

lo se lo se.. está anotado en la función que he colgado en gemix.. la he colgado por si alguien quería usarla ya.
User avatar
erkosone
 
Posts: 10654
Joined: Tue Feb 24, 2009 2:13 pm
Location: Barcelona.

Re: Función Circle/Line colision en VB.NET

Postby erkosone » Wed Sep 26, 2012 2:01 pm

SimulatorOne wrote:pide consejos a cictec y gino. quizas te pudan ayudar


Para pedir consejos primero tengo que comprender todo el proceso a bajo nivel y en ese punto ya preguntaría como implementar cosas muy concretas, todavía tengo mucho que estudiar y muchas cosas que hacer para tenerlo todo listo y poder empezar con el gestor de objetos.

Creo que las primeras dudas que se me presentan es sobre como crear de una forma eficiente los arrays dinámicos de objetos.. esto tengo que mirarmelo muy muy a fondo por que es lo mas importante, el uso de listas enlazadas dinámicas.. y creo que ya solo para eso hace falta otra dll XD.. hay tela por delante.. pero en ello estoy.. con el tiempo y una caña.. lo que doy cuenta de que cada vez asimilo las cosas mas rápido, esto me gusta :D
User avatar
erkosone
 
Posts: 10654
Joined: Tue Feb 24, 2009 2:13 pm
Location: Barcelona.


Return to Offtopic

Who is online

Users browsing this forum: No registered users and 5 guests

cron