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