Dibujar sector circular

Publicado por Clamud, Abril 11, 2016, 08:13:21 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Clamud

Autor: yo
Descripción: Dibuja un sector circular o "queso partido"
Versión: GM8 en adelante, también podría funcionar en versiones previas

Código:
[gml]
///dibujar_sector( x,y,r, a1,a2,a3, contorno );
/*                 0 1 2  3  4  5   6
DIBUJAR UN SECTOR CIRULAR
Dibuja un sector circular con vertice en (x,y), el vertice
es el centro del circulo, con radio r. El area dibujada va
desde el angulo 1 (a1) hasta el angulo 2 (a2), en el sentido
contrario a las manecillas del reloj, en incrementos iguales
al angulo 3 (a3). Si se intercambian los valores de a1 y a2
el sector resultante es el conjugado del primero.

Argumentos
    x,y: vertice del sector
    r: radio
    a1: angulo inicial
    a2: angulo final
    a3: angulo incremento (precision)
    contorno: dibujar solo contorno o llenar poligono
   
Devuelve: nada
*/
var xx, yy, r, a1, a2, a3;
xx = argument0; //vertice
yy = argument1;
r  = argument2; //radio

a1 = argument3; //angulo inicial
a2 = argument4; //angulo final
while( a1 > a2 ) a2 += 360; //evitar sectores mayores
while( a2-a1 > 360 ) a1 += 360; // a 360 grados

if( argument5 == 0 ) a3 = 10; //la precision debe
else a3 = abs(argument5); // ser mayor a cero

//iniciar primitivas (contorno o lleno)
if( argument6 ) draw_primitive_begin( pr_linestrip );
else draw_primitive_begin( pr_trianglefan );

draw_vertex( xx, yy ); //primer vertice
while( a2 >= a1 ) //hacer un barrido desde a2 hasta a1
{
    draw_vertex(
    xx + lengthdir_x(r,a2),
    yy + lengthdir_y(r,a2) );
    a2 -= a3;
}
draw_vertex( //vertice en a1
xx + lengthdir_x(r,a1),
yy + lengthdir_y(r,a1) );

if( argument6 ) draw_vertex( xx, yy ); //vertice final
draw_primitive_end();
[/gml]

correojon

Buen script, pero creo que es más sencillo hacerlo con un for:
//Hasta aquí igual
draw_vertex(xx, yy);
var i;
for (i=a1; i<=a2; i+= a3) draw_vertex(xx + lengthdir_x(r, i), yy + lengthdir_y(r, i));
if (argument6) draw_vertex(xx, yy);
//Desde aquí igual

Clamud

Sí, es una buena alternativa, hace tiempo que escribí el script, supongo que decidí usar un while para ahorrarme el var i  :P
En los dos casos se debe escribir el draw_vertex después del ciclo.
También es preferible que el barrido se haga desde a2 hasta a1, porque en ese punto a2 es mayor que a1, entonces los vértices se agregan en el sentido de las manecillas del reloj, y no hay problema si se usa d3d_set_culling(true).

Powered by EzPortal
SMF spam blocked by CleanTalk