Comunidad Game Maker

Ayuda => Desarrollo de Scripts => Mensaje iniciado por: Alfonsos1 en Noviembre 23, 2009, 11:03:33 PM

Título: Intercepci?n entre una recta y una circunferencia
Publicado por: Alfonsos1 en Noviembre 23, 2009, 11:03:33 PM
Nombre del creador: Alfonsos1

Breve descripci?n de su funci?n: Determina los puntos de intercepcion de una recta y una circunferencia, en otras palabras determina x1, y1, x2, y2.

Versi?n GM utilizada:  :GM7: Lite

Argumentos:
argument0: cordenada x del centro de la circunferencia
argument1: cordenada y del centro de la circunferencia
argument2: radio de la circunferencia
argument3: coeficiente angular de la recta
argument4: termino independiente de la recta


Codigo del script:

xCENTRO = argument0;//Cordenadas del centro de la circunferencia
yCENTRO = argument1;
RADIO = argument2;//Radio de la circunferencia

m = argument3;//Coeficiente angular de la recta
n = argument4;//Termino independiente de la recta

//La ecuacion de una circunferencia es: (x-xCENTRO)*(x-xCENTRO)+(y-yCENTRO)*(y-yCENTRO)=RADIO*RADIO
//Acuntinuacion simplemente les mostrare los calculos que hice, no son nesesario
//(x-xCENTRO)*(x-xCENTRO) + (y-yCENTRO)*(y-yCENTRO) = RADIO*RADIO
//x*x-2*xCENTRO*x+xCENTRO*xCENTRO + y*y-2*yCENTRO*y+yCENTRO*yCENTRO = RADIO*RADIO
//x*x-2*xCENTRO*x+xCENTRO*xCENTRO + (m*x+n)*(m*x+n)-2*yCENTRO*(m*x+n)+yCENTRO*yCENTRO = RADIO*RADIO
//x*x-2*xCENTRO*x+xCENTRO*xCENTRO + m*m*x*x+2*m*x*n+n*n-2*yCENTRO*m*x-2*yCENTRO*n+yCENTRO*yCENTRO = RADIO*RADIO
//x*x+m*m*x*x -2*xCENTRO*x+2*m*x*n-2*yCENTRO*m*x +xCENTRO*xCENTRO+n*n-2*yCENTRO*n+yCENTRO*yCENTRO-RADIO*RADIO = 0
//(1+m*m)x*x + (-2*xCENTRO+2*m*n-2*yCENTRO*m)*x + (xCENTRO*xCENTRO+n*n-2*yCENTRO*n+yCENTRO*yCENTRO-RADIO*RADIO) = 0

//Allamos A, B y C por separado para que no quede muy larga la cuanta final

A=1+m*m;
B=-2*xCENTRO+2*m*n-2*yCENTRO*m;
C=xCENTRO*xCENTRO+n*n-2*yCENTRO*n+yCENTRO*yCENTRO-RADIO*RADIO;

//Resolvemos la ecuacion de segundo grado
//Tiene dos solucciones porque en este caso la recta tiene dos intercepciones con la circunferencia
x1 = (-B+sqrt(B*B-4*A*C))/(2*A);
x2 = (-B+-sqrt(B*B-4*A*C))/(2*A);
//Allamos las y en funcion de las x con la ecuacion de la recta
y1 = m*x1+n;
y2 = m*x2+n;


Les dejo un ejemplo de como funciona. En el ejemplo tu mueves un "Bicho" cuando este colisiona con el vorde da la pantalla circular es llevado al punto opuesto de la pantalla.
Tambien tiene incluido un peque?o scrips que determina el coeficiente angular y el termino independiente de una recta a partir de dos puntos.
Título: Re: Intercepci?n entre una recta y una circunferencia
Publicado por: Ciberman en Diciembre 25, 2009, 05:01:22 PM
no entiendo todo eso de matem?tica. pero lo que tiene el ejemplo se podr?a hacer:


//argument0 x circ.
//argument1 y circ.
//argument2 radio de la circunferencia.
if point_distance(x,y,argument0,argument1)>argument2
{
x=lengthdir_x(argument2,point_direction(argument0,argument1,x,y)-180)
y=lengthdir_y(argument2,point_direction(argument0,argument1,x,y)-180)
}

Título: Re: Intercepci?n entre una recta y una circunferencia
Publicado por: Alfonsos1 en Diciembre 25, 2009, 06:14:38 PM
Ciberman ese script lo que hace es llevarlo denuevo al centro, talves si pusieras

x=lengthdir_x(argument2*2,point_direction(argument0,argument1,x,y)-180)
y=lengthdir_y(argument2*2,point_direction(argument0,argument1,x,y)-180)

creo que funcionaria...

detodos modos no hice el script para que funcione el ejemplo, sino que hize el ejemplo para mostrar el script.

una ves que se ejecuta el scrpt con los argumentos correctos este le da un valor a las variables x1 y1 x2 y2 que vendrian a ser las cordenadas de las intercepciones de la recta y la circunferencia
Título: Re: Intercepci?n entre una recta y una circunferencia
Publicado por: KrakenHimoto en Diciembre 25, 2009, 08:13:01 PM
Si se supone que es una recta de largo infinito, se da la direcci?n de la recta y se sabe que la recta pasa por el centro de la circunferencia se puede hacer:

//argument0 x circ.
//argument1 y circ.
//argument2 radio de la circunferencia.
//argument3 direcci?n angular de la recta.

x1=argument0+lengthdir_x(argument2,argument3)
y1=argument1+lengthdir_y(argument2,argument3)
x2=argument0+lengthdir_x(argument2,argument3+180)
y2=argument1+lengthdir_y(argument2,argument3+180)


Lo que nose si es si el script que hiciste vos alfonsos sirve para rectas que no pasan por el centro de una circunferencia, ah? si ser?a ?til.
Título: Re: Intercepci?n entre una recta y una circunferencia
Publicado por: Alfonsos1 en Diciembre 26, 2009, 04:48:17 PM
pues si se aplica para rectas que no pasan por el centro, siempre y cuando se cruzen la recta y la circunferencia.

mi script no es mas que un sistema de ecuaciones:

parto de la ecuacion de la circunferencia:
(x-xCENTRO)*(x-xCENTRO) + (y-yCENTRO)*(y-yCENTRO) = RADIO*RADIO

la desarrollo:
x*x-2*xCENTRO*x+xCENTRO*xCENTRO + y*y-2*yCENTRO*y+yCENTRO*yCENTRO = RADIO*RADIO

remplazo las "y" por (m*x+n), ya que segun la ecuacion de la recta son lo mismo:
//x*x-2*xCENTRO*x+xCENTRO*xCENTRO + (m*x+n)*(m*x+n)-2*yCENTRO*(m*x+n)+yCENTRO*yCENTRO = RADIO*RADIO

la desarrollo:
x*x-2*xCENTRO*x+xCENTRO*xCENTRO + m*m*x*x+2*m*x*n+n*n-2*yCENTRO*m*x-2*yCENTRO*n+yCENTRO*yCENTRO = RADIO*RADIO

la igualo a 0:
x*x+m*m*x*x -2*xCENTRO*x+2*m*x*n-2*yCENTRO*m*x +xCENTRO*xCENTRO+n*n-2*yCENTRO*n+yCENTRO*yCENTRO-RADIO*RADIO = 0

saco factor comun de modo que quede de la forma A*x*x + B*x + C:
(1+m*m)x*x + (-2*xCENTRO+2*m*n-2*yCENTRO*m)*x + (xCENTRO*xCENTRO+n*n-2*yCENTRO*n+yCENTRO*yCENTRO-RADIO*RADIO) = 0

aqui tenemos una ecuacion de segundo grado que se resuelbe con la formula:
(-B+-sqrt(B*B-4*A*C))/(2*A)