Noviembre 23, 2009, 11:03:33 PM Ultima modificación: Diciembre 26, 2009, 04:52:23 PM por Alfonsos1
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.

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)
}

Cita de: CGM 2008CGM: Un poco mas serios, mejores Juegos.
Bienvenid@ a CGM. Recomenzamos desde cero, con un reglamento mas estricto, mejor definido y con mas ganas que nunca de hacer juegos con calidad comercial. El que avisa no es traidor: Leete las reglas si no quieres llevarte un capon makero.
Mercilessly!!
Plug-In para animaciones: http://ciberman.net/tweenline/

#2 Diciembre 25, 2009, 06:14:38 PM Ultima modificación: Diciembre 25, 2009, 06:16:55 PM por Alfonsos1
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

#3 Diciembre 25, 2009, 08:13:01 PM Ultima modificación: Diciembre 26, 2009, 06:37:49 PM por KrakenHimoto
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.

#4 Diciembre 26, 2009, 04:48:17 PM Ultima modificación: Diciembre 26, 2009, 04:54:07 PM por Alfonsos1
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)