Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Dibujar Circunferencia

Iniciado por nike42, 23 de Agosto de 2013, 01:42:16 PM

« anterior - próximo »

nike42

Buenas, soy programador y me he topado con esta estupenda libreria y he empezado a utilizarla. Hasta ahora todo de maravilla sin embargo me he encontrado con un detalle, quisiera dibujar una circunferencia rellena pero no completa, al estilo de una torta cortada como esta:

he tratado de utilizar la funcion DRAW_Circle precargando una circunferencia tal como dice la documentacion, pero no hace mas que dibujarme una circunferencia completa, tambien crei que el parametro segment me daria lo que quiero, pero al cambiar los valores para ese parametro veo que nada cambia, quizas lo utilize mal o no se para que sirve xD. Bueno mi duda es esa, se puede hacer una circunferencia a medio dibujar, con alguna funcion precargada de la libreria o debo programarla yo mismo?

[EX3]

Buenas, nike42.

Cita de: nike42 en 23 de Agosto de 2013, 01:42:16 PM
he tratado de utilizar la funcion DRAW_Circle precargando una circunferencia tal como dice la documentacion, pero no hace mas que dibujarme una circunferencia completa, tambien crei que el parametro segment me daria lo que quiero, pero al cambiar los valores para ese parametro veo que nada cambia, quizas lo utilize mal o no se para que sirve xD.
Si miraste la documentación habrás leído para que sirve el parámetro Segment de la función de precalculado de circunferencias:
CitarSegment
Long. Define un valor de longitud para dibujar la circunferencia por medio de segmentos. Si el valor es 0 la circunferencia se dibujara por medio de píxeles.
(...)
Comentarios
Dado que el calculo de los parámetros de la circunferencia y su dibujo son procesos lentos para sistema de dibujo primero se calculan y se almacenan los parámetros en memoria para luego ser usados directamente en la función DRAW_Circle. Se recomienda para no perder mucho rendimiento calcular las circunferencias con un valor definido para el parámetro Segment. De esta forma perderá calidad la circunferencia pero le costara menos trabajo dibujarla y perder menos velocidad.
Resumidamente, puedes dibujar circunferencias pixel a pixel o bien mediante segmentos que formen el trazado de la circunferencia. Segment indica la longitud de los segmentos que dibujaran el trazado de la circunferencia.

Por lo demás, DRAW_Circle solo permite dibujar circunferencias, no permite dibujar tartas que es lo que estas buscando para dibujar la gráfica de arriba.

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

Manu343726


avalontm

ami también me interesa dibujar algo parecido así.

si alguien encuentra el modo de hacerlo por favor que lo comente :3

Darago_malaga

#4
No existe la funcion Draw_arc ? En c ya existia una funcion arc(); que dibujaba arcos..

http://msdn.microsoft.com/en-us/library/ms142028.aspx

Hechelion

Cita de: Darago_malaga en 26 de Agosto de 2013, 11:56:42 PM
No existe la funcion Draw_arc ? En c ya existia una funcion arc(); que dibujaba arcos..

Pobre Ex3, ese fue el medio palo  :..

Sobre el tema, hasta donde sé, no hay nada para dibujar arcos en la librería, así tocaría implementarlo. Y hablando de eso, ¿Qué sería mejor? ¿dibujar el arco en cada pasada mediante segmentos? o ¿crearlos en una superficie una vez y luego dibujarlo desde ahí?

[EX3]

Cita de: Darago_malaga en 26 de Agosto de 2013, 11:56:42 PM
No existe la funcion Draw_arc ? En c ya existia una funcion arc(); que dibujaba arcos..

http://msdn.microsoft.com/en-us/library/ms142028.aspx
Creo a esta librería le falta muchas cosas molonas o de posible utilidad  0:-)  No, nunca vi necesario implementar un DRAW_Arc (y en su día tampoco creo que hubiera sabido implementarlo). Pensé que con poder dibujar puntos, lineas, cajas y circunferencias seria suficiente para cubrir las primitivas de dibujo.

Cita de: Hechelion en 27 de Agosto de 2013, 01:25:57 AM
¿Qué sería mejor? ¿dibujar el arco en cada pasada mediante segmentos? o ¿crearlos en una superficie una vez y luego dibujarlo desde ahí?
Si el arco o figura en cuestion no va a modificarse despues, pintarlo en una textura mediante un RenderTarget para luego dibujar simplemente la textura, seria lo más optimo.

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

Darago_malaga

#7
Tendria que ser una cosa mas o menos asi, no lo he probado porque lo he hecho con el movil y esta en pseudo c, asi que habra que adaptarlo.

Dibujar una arco en la posicion posX,posY de la pantalla con un radio dado que va desde un angulo inicial a un angulo final.


Draw_Arc(int posX, int posY, int radio, int angulo_ini, int angulo_fin)
{

      //dibujamos el semicirculo
      for( int valor=angulo_ini; valor<angulo_fin; valor++)
      {
             Draw_line(posX+cos(valor)*radio , posY+sin(valor)*radio , posX+cos(valor+1)*radio , posY+sin(valor+1)*radio );
       }

        //dibujamos las lineas que cierran el semicirculo y forman la tarta
        Draw_line(posX, posY, posX+cos(angulo_ini)*radio , posY+sin(angulo_ini)*radio );
        Draw_line(posX, posY, posX+cos(angulo_fin)*radio , posY+sin(angulo_fin)*radio );

}


Roberth

#8
Hola a todos.

Aprovechando el tema sobre Dibujar Circunferencia para no abrir otro post con el mismo nombre serían tan amable revisar o de colocar un fracmento de código para dibujarlas, ya que he querido hacelas pero no encuentro la manera como. Este es el código que estoy usando con Visual Basic .NET de VS2010 y Framework 4:



   Inherits System.Windows.Forms.Form

Private Graphics As dx_lib32.dx_GFX_Class ' Instancia del objeto grafico de dx_lib32.
Private Render As Boolean ' Controla el bucle de renderizado.
        Private TextFont As Integer ' Identificador de la fuente.
        Public circulos As Integer

    Private Sub Form1_Load(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles MyBase.Load
Me.Show() ' Forzamos al formulario a mostrarse.
Graphics = New dx_lib32.dx_GFX_Class ' Creamos la instancia del objeto grafico.
Render = Graphics.Init(Me.Handle.ToInt32, 640, 480, 32, True) ' Inicializamos el objeto grafico y el modo de video.
        TextFont = Graphics.FONT_LoadSystemFont("Lucida Console", 12, True, False, False, False)
        circulos = Graphics.PRECAL_NewCircle(50, 50, 25, 0, &HFF0000FF, False, &HFF0000FF)

Do While Render
    Graphics.DRAW_Text(TextFont, "Hola mundo!", 0, 0, 0, &HFFFFFFFF, dx_lib32.Text_Align.Align_Left)
            Graphics.DRAW_Circle(circulos, 0)
            Graphics.Frame() ' Renderizamos la escena.
        Loop
    End Sub

    Public Function NewCircle(X As Long, Y As Long, Radio As Long, Segment As Long, Color As Long, Optional Fill As Boolean = False, Optional FillColor As Long = False) As Long
        circulos = NewCircle(50, 50, 25, 0, &HFF0000FF, False, &HFF0000FF)
    End Function

    Private Sub Form1_FormClosed(ByVal eventSender As System.Object, ByVal eventArgs As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
        Graphics.PRECAL_DeleteCircle(circulos)
        Graphics.FONT_UnloadSystemFont(TextFont)
        Render = False ' Termina el bucle de renderizado.
        Graphics.Terminate() ' Terminamos la ejecucion de la clase grafica y liberamos los recursos utilizados.
        Graphics = Nothing ' Destruimos la instancia del objeto grafico.
    End Sub


Saludos.

[EX3]

#9
@Darago_malaga, estaba pensando en lo referente al dibujarlo con relleno, que es donde quizás le veía un poco de miga, pero revisando el código de la función PRECAL_NewCircle parece que no habría problema en formar el polígono que daría forma y relleno a la figura ya que la información para dibujar el contorno/borde es la misma que uso para generar dicho polígono :)

@Roberth, prefiero que abráis un nuevo post para cada duda en vez de anidarlas dentro de otros aunque el tema sea similar (que no cobramos dinero por abrir nuevos post :P). De todas formas, salvo el código de tu función NewCircle, que provocaría un desbordamiento de pila al llamarse a si mismo recursivamente, no veo donde tienes el problema para dibujar la circunferencia que defines. El código es correcto tal y como lo tienes. Si la duda es otra abre un nuevo hilo para explicarla mejor.

Salu2...

P.D.: ¿Tienes que usar colores chillones y negrita en todo el texto de tus mensajes? Se hace muy incomodo de leer :-/
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

Darago_malaga

Si lo quieres rellenar con hacer un fill(); en un punto que este dentro de la figura vale.

Por ejemplo:

fill(( posX
   +(posX+cos(angulo_ini)*radio)
   +(posX+cos(angulo_ini+1)*radio)
    )/3 ,
    ( posY
   +(posY+sin(angulo_ini)*radio)
   +(posY+sin(angulo_ini+1)*radio)
    )/3 );


Ese punto seguro que esta dentro de la figura.

[EX3]

#11
Cita de: Darago_malaga en 27 de Agosto de 2013, 04:57:18 PM
Si lo quieres rellenar con hacer un fill(); en un punto que este dentro de la figura vale.
No es tan sencillo como hacer un relleno. Recuerda que dx_lib32 trabaja con Direct3D. Aquí las primitivas las dibujas mediante vértices, aristas, triángulos y polígonos, de ahí que el relleno se tenga que hacer mediante triángulos o polígonos según la forma que dibujes.

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

Roberth

Gracias [EX3]

Revisaré detenidamente el código.

P.D.: Pensaba que se vein mejor y más vistosos los colores en el texto.  :D






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.