Comunidad Game Maker

Ayuda => Desarrollo de Scripts => Mensaje iniciado por: Alfonsos1 en Junio 20, 2010, 05:14:20 AM

Título: DIBUJAR POLIGONO DE 8 LADOS O MENOS
Publicado por: Alfonsos1 en Junio 20, 2010, 05:14:20 AM
Nombre del creador: Alfonsos1

Breve descripci?n de su funci?n: dibuja un poligono de hasta 8 lados

Versi?n GM utilizada:  :GM8:

Argumentos:
Citar
x1
y1
x2
y2
x3
y3
x4
y4
x5
y5
x6
y6
x7
y7
x8
y8
en caso de querer dibujar un poligono de menos de 8 lados dejar los ultimos argumentos con un valor de -1

Codigo de script:
verx[0] = argument0;
verx[1] = argument2;
verx[2] = argument4;
verx[3] = argument6;
verx[4] = argument8;
verx[5] = argument10;
verx[6] = argument12;
verx[7] = argument14;
very[0] = argument1;
very[1] = argument3;
very[2] = argument5;
very[3] = argument7;
very[4] = argument9;
very[5] = argument11;
very[6] = argument13;
very[7] = argument15;

if(verx[0] = max(verx[0],verx[1],verx[2],verx[3],verx[4],verx[5],verx[6],verx[7])) A = 0;
if(verx[1] = max(verx[0],verx[1],verx[2],verx[3],verx[4],verx[5],verx[6],verx[7])) A = 1;
if(verx[2] = max(verx[0],verx[1],verx[2],verx[3],verx[4],verx[5],verx[6],verx[7])) A = 2;
if(verx[3] = max(verx[0],verx[1],verx[2],verx[3],verx[4],verx[5],verx[6],verx[7])) A = 3;
if(verx[4] = max(verx[0],verx[1],verx[2],verx[3],verx[4],verx[5],verx[6],verx[7])) A = 4;
if(verx[5] = max(verx[0],verx[1],verx[2],verx[3],verx[4],verx[5],verx[6],verx[7])) A = 5;
if(verx[6] = max(verx[0],verx[1],verx[2],verx[3],verx[4],verx[5],verx[6],verx[7])) A = 6;
if(verx[7] = max(verx[0],verx[1],verx[2],verx[3],verx[4],verx[5],verx[6],verx[7])) A = 7;

puntos = 8;
if(verx[7] = -1) puntos -= 1;
if(verx[6] = -1) puntos -= 1;
if(verx[5] = -1) puntos -= 1;
if(verx[4] = -1) puntos -= 1;
if(verx[3] = -1) puntos -= 1;

vasio = 0;
while(!vasio)
{
m1 = (very[(A-1+puntos) mod puntos]-very[(A+puntos) mod puntos])/(verx[(A-1+puntos) mod puntos]-verx[(A+puntos) mod puntos]+0.0000000001);
n1 = very[(A-1+puntos) mod puntos]-m1*verx[(A-1+puntos) mod puntos];
if( verx[(A+1+puntos) mod puntos]*m1+n1>very[(A+1+puntos) mod puntos]) h1 = 1;
else h1 = -1;

m2 = (very[(A-1+puntos) mod puntos]-very[(A+1+puntos) mod puntos])/(verx[(A-1+puntos) mod puntos]-verx[(A+1+puntos) mod puntos]+0.0000000001);
n2 = very[(A-1+puntos) mod puntos]-m2*verx[(A-1+puntos) mod puntos];
if(verx[(A+puntos) mod puntos]*m2+n2>very[(A+puntos) mod puntos]) h2 = 1;
else h2 = -1;

m3 = (very[(A+puntos) mod puntos]-very[(A+1+puntos) mod puntos])/(verx[(A+puntos) mod puntos]-verx[(A+1+puntos) mod puntos]+0.0000000001);
n3 = very[(A+puntos) mod puntos]-m3*verx[(A+puntos) mod puntos];
if(verx[(A-1+puntos) mod puntos]*m3+n3>very[(A-1+puntos) mod puntos]) h3 = 1;
else h3 = -1;

vasio = 1;
for(pnt=0;pnt<puntos;pnt+=1)
{
 if(pnt != (A-1+puntos) mod puntos && pnt != (A+puntos) mod puntos && pnt != (A+1+puntos) mod puntos)
 {
  if((verx[pnt]*m1+n1)*h1>=very[pnt]*h1+0.0000001 && (verx[pnt]*m2+n2)*h2>=very[pnt]*h2+0.0000001 && (verx[pnt]*m3+n3)*h3>=very[pnt]*h3+0.0000001)
  {
   vasio = 0;
  }
 }
}
if(!vasio) A = (A+1+puntos) mod puntos;
}

draw_triangle(verx[(A-1+puntos) mod puntos],very[(A-1+puntos) mod puntos],verx[(A+puntos) mod puntos],very[(A+puntos) mod puntos],verx[(A+1+puntos) mod puntos],very[(A+1+puntos) mod puntos],0);

for(ind=A;ind<puntos;ind+=1)
{
verx[ind] = verx[(ind+1) mod puntos];
very[ind] = very[(ind+1) mod puntos];
}
verx[puntos-1]=-1;
very[puntos-1]=-1;

if(puntos>3) poligono(verx[0],very[0],verx[1],very[1],verx[2],very[2],verx[3],very[3],verx[4],very[4],verx[5],very[5],verx[6],very[6],verx[7],very[7])


Ejemplos de uso:

Poligono de 8 lados:
poligono(250,250,200,300,200,275,150,275,150,200,175,225,200,225,225,200);

Poligono de 5 lados:
poligono(200,200,250,250,300,200,300,300,200,300,-1,-1,-1,-1,-1,-1);


IMPORTANTE: devido a que el script hace uso de la recurci?n, el nombre del script deve ser si o si "poligono".
Título: Re: DIBUJAR POLIGONO DE 8 LADOS O MENOS
Publicado por: Ciberman en Octubre 31, 2010, 01:57:50 AM
lo veo m?s complicado de llamar siendo m?s facil hacerlo manualmente con vertex (y m?s personalizable) claro que para quien no sabe es de mucha utilidad