Clase Paint, Empalmar Arcos Con Segmentos Y Rellenar Con Fill


Objetivo: Clase Paint, Empalmar Arcos Con Segmentos Y Rellenar Con Fill
Hola amigos,

después de un tiempo sin escribir en el foro, de nuevo estoy por aquí con una duda. En un drawing area estoy dibujando una serie de segmentos de línea y de arcos concatenados, de modo que forman un path o ruta. Después hago Paint.Stroke o Paint.Fill. El problema es que cuando dibujo un arco, el punto inicial de ese arco no queda soldado con el segmento o arco que se hubiera dibujado previamente. Si hacéis zoom dinámico y os aproximás a los vértices del ejemplo que adjunto, veréis lo que digo. Sólo el vértice 2 empalma correctamente, porque sale de arco y entra en segmento. El resto no están soldados. Incluso si os acercáis mucho mucho se empieza a ver que los extremos de las dos líneas cambian de posición relativa de un paso de zoom al siguiente.

Si se trata de Paint.Fill el problema tiene aun más consecuencias. Podéis alternar con los radio button para verlo.

Gracias.

Pablo


Empalmararcosconlineas-0.0.tar.gz
Descripción:  
Descargar
Nombre del archivo: Empalmararcosconlineas-0.0.tar.gz
Tamaño: 6.12 KB
Descargado: 64 veces
Empalmararcosconlineas-0.0.tar.gz
Descripción:  
Descargar
Nombre del archivo: Empalmararcosconlineas-0.0.tar.gz
Tamaño: 6.12 KB
Descargado: 64 veces
Empalmararcosconlineas-0.0.tar.gz
Descripción:  
Descargar
Nombre del archivo: Empalmararcosconlineas-0.0.tar.gz
Tamaño: 6.12 KB
Descargado: 64 veces

Perfil MP  
Objetivo: Re: Clase Paint, Empalmar Arcos Con Segmentos Y Rellenar Con Fill
Hola Alaplancha.

Si lo dibujases a mano, ¿ como explicarías el problema ?.
¿ El segmento es más corto ?.
¿ El arco no ha comenzado donde debía comenzar ?.
¿ Es realmente el final del segmento el comienzo del ángulo?
¿ Puedes ver esos valores de alguna forma si son los que tu quieres para comprobar el correcto funcionamiento ?.

Lamento no ser de mucha ayuda. Es un tema que me gusta.

Puede que sea un problema de precisión. El que peor queda es el 1º.

Saludos

Objetivo: Re: Clase Paint, Empalmar Arcos Con Segmentos Y Rellenar Con Fill
He probado una cosa, produce un efecto raro.

¿ Cómo es que tienes tanto al final del primer bucle como del segundo bucle las opciones de Fill o Stroke ?.

Esto es lo que he probado.
Deja al final del ultimo bucle esto activo:

If rdbStroke.Value Then Paint.Stroke

Comenta los otros.

Ahora haz un zoom dinámico al punto 0, hasta que llegues bien cerca, los segmentos no están unidos y además se mueven al hacer el zoom,
quedando peor la unión.


Aclaro. Es el mismo efecto, si se tienen descomentadas las lineas que dije antes. ¿ Puede ser un problema del zoom ?
Ya nos dirás como es que tienes varias lineas repes para el Fill o Sroke

última edición por Shell el Domingo, 22 Febrero 2015, 01:24; editado 4 veces
Objetivo: Re: Clase Paint, Empalmar Arcos Con Segmentos Y Rellenar Con Fill
Hola Shell,

muchas gracias por tu respuesta. Creo que puede ser un problema de precisión interna de gambas. Adjunto un croquis de la figura del ejemplo que quiero dibujar:

03

Tenemos a la izquierda un arco de 180º y radio 5, y a la derecha un arco de 140º y radio 3. Los dos segmentos no son tangentes a los arcos, y esto está pensado a propósito en el ejemplo para que se vea más fácilmente el punto de unión. Que la unión entre arco y segmento sea quebrada no influye para nada en el problema, sólo quiere decir que la tangente a la izquierda y la tangente a la derecha del punto de union no son la misma tangente. Pero quebrado o no, el caso es que segmento y arco están soldados, pues las coordenadas de sus extremos corresponden al mismo punto. Pero gambas no los representa soldados. Adjunto también dos imágenes con zooms consecutivos. Las coordenadas almacenadas en la matriz no han cambiado, y sin embargo la posición relativa de los extremos de arco y segmento cambia.

01
02

Me preguntabas por qué están duplicados los Paint.Stroke y Paint.Fill, y tienes totalmente razón. Hay una primera parte en la que pinto la figura geométrica (con su path, Stroke/Fill) y una segunda parte en la que pinto los números (con sus paths, Stroke/Fill). En realidad puedo suprimir los primeros.

Hace ya unas semanas que ando con este problema y no le encuentro solución. Como decías, debe de ser un problema de precisión. De hecho, si cambio la línea 104 que dice:

If Contorno[Cont, 0] = 2 Then Paint.Arc(x1, y1, r, ang1, arco)


Por las siguientes lineas:

If Contorno[Cont, 0] = 2 Then
Paint.Arc(x1, y1, r, ang1, arco)
Print Paint.X / Escala + OrigenSx, OrigenSy - Paint.Y / Escala ' Cambio del sistema del coordenadas D (dot) al sistema U (universal)
Endif


vemos que los valores que imprime son ligeramente distintos a los de la matriz Contorno, y no sólo distintos sino que además son variables, lo cual explicaría las imágenes 01 y 02 que adjunto).

¿Posible solución? No querría llegar a utilizar Paint.CurveTo del ejemplo 8 que viene con el ejemplo Paint de gambas. Recurrir a una curva bezier para pintar un arco me parece exagerado

Saludos

Perfil MP  
Objetivo: Re: Clase Paint, Empalmar Arcos Con Segmentos Y Rellenar Con Fill
Hola Alaplancha.

Es una buena pregunta. Esperemos un poco a los compañeros a ver si pueden orientarte y en caso que no podamos,
ayudarte a que puedas preguntar esto en el foro de la comunidad internacional de gambas. Merece la pena.

Todo depende de la prisa que tengas con esta pregunta.

Nuestro administrador estuvo en su día haciendo unos ejemplos de animaciones básicas, usando valores enteros y reales y los resultados,
eran distintos. Lo que demuestra que puede haber cierto problema de precisión. No creo que podamos llegar a tanta usando Paint.

Aun así. Se supone que tu le dices a gambas. Comienzas desde un punto. Traza un segmento. Comienza desde el origen y tiene un final.
Si, vuelves a dibujar otro segmento, debe comenzar donde acabo el primer segmento. No debería partirse. Puede que ocurran efectos
raros con la precisión.

Uno de los problemas que vemos en tu ejemplo solo al iniciar, es que ya el punto 1, esta quebrada la recta.
No es necesario ni hacer zoom para poder verlo.

No se hasta que nivel le podemos exigir al DrawingArea y sus valores.

¿ Probaste a hacer algo parecido con números enteros ?


Saludos

Objetivo: Re: Clase Paint, Empalmar Arcos Con Segmentos Y Rellenar Con Fill
Hola de nuevo Shell, y de nuevo gracias por tu tiempo e interés,

espero que esto no llegue a ser un problema internacional ya tiene el mundo muchos problemas.

No tengo urgencias de tiempo, es sólo que estaba haciendo un programilla para mí mismo y me encontré con este problemilla.

La clase Paint utiliza precisión Float, creo, ya que miré en la documentación y Paint.X, Paint.Y, Paint.LineTo, Paint.Arc, etc. manejan parámetros de tipo Float. De todos modos he probado a dibujar por si acaso haciendo Int() en los argumentos de cualquier llamada a Paint.LineTo o Paint.Arc y nada, el problema continúa.

El asunto es que si sólo fuese una poligonal de segmentos de línea todo saldría bien, ya que Paint.MoveTo ( X As Float, Y As Float ) añade un segmento tomando como origen las coordenadas donde nos quedamos anteriormente (Paint.X, Paint.Y) y como destino los argumentos que le pasamos X, Y. En cambio el procedimiento Paint.Arc no es algo así como Paint.ArcTo, es decir, que no comienza en donde nos quedamos anteriormente (Paint.X, Paint.Y). El arco no sabemos nunca dónde comienza, aunque sí sabemos donde termina, ya que al hacer Paint.Arc las coordenadas del final del arco quedan almacenadas en Paint.X y Paint.Y. Lo cual quiere decir que si después de un arco dibujamos un segmento, sí que quedan bien soldados (punto 2 del dibujo ejemplo).

Segmento --> Segmento Bien, se sueldan
Segmento --> Arco Mal, no se sueldan (Punto 1)
Arco --> Segmento Bien, se sueldan (Punto 2)
Arco --> Arco Mal, no se sueldan

Si meto un Paint.Closepath al final, otro desastre, me une los dos extremos del último arco.

En fin, ya empiezo a ver arcos y flechas por todas partes, y no es un ataque de hiperactividad de Cupido, cielos.

Saludos

última edición por Alaplancha el Domingo, 22 Febrero 2015, 17:35; editado 1 vez
Perfil MP  
Objetivo: Re: Clase Paint, Empalmar Arcos Con Segmentos Y Rellenar Con Fill
Hola de nuevo, amigos,

sigo sin encontrar solución para este problema. Adjunto una nueva versión en la que trazo cuatro pequeñas líneas de segmento de recta (segmentos) para cerrar arcos con segmentos en los cuatro vértices. Para hallar las coordenadas del punto de inicio de cada arco, hago una primera pasada "dibujando" los arcos a la inversa, y obteniendo las coordenadas Paint.X, Paint.Y.

También he añadido por consola unos Print para saber las coordenadas de esas pequeñas cuatro líneas de sutura.

Todo ha sido inútil. Cuando activo el radiobutton de Fill sigue pintando mal el relleno.

no sé si hacer alguna ofrenda o encomendarme a los dioses, pero esa es otra, tengo mis dudas entre Apolo, Ra o Ea

Saludos


Empalmararcosconlineas-0.0.1.tar.gz
Descripción:  
Descargar
Nombre del archivo: Empalmararcosconlineas-0.0.1.tar.gz
Tamaño: 127.94 KB
Descargado: 65 veces
Empalmararcosconlineas-0.0.1.tar.gz
Descripción:  
Descargar
Nombre del archivo: Empalmararcosconlineas-0.0.1.tar.gz
Tamaño: 127.94 KB
Descargado: 65 veces
Empalmararcosconlineas-0.0.1.tar.gz
Descripción:  
Descargar
Nombre del archivo: Empalmararcosconlineas-0.0.1.tar.gz
Tamaño: 127.94 KB
Descargado: 65 veces

Perfil MP  
Objetivo: Re: Clase Paint, Empalmar Arcos Con Segmentos Y Rellenar Con Fill
Hola Alaplancha

Creo que tiene que ser un bug, pero desconozco si es provocado por gambas o directamente en Cairo, que es la librería que usa gambas para la clase Paint.

Posiblemente puedas recibir más ayuda de Benoit si planteas la pregunta en la lista de correo de gambas, es posible que entre los usuarios de este foro no haya nadie que pueda ofrecer una solución, ni tan siquiera una explicación. El ejemplo que has subido es válido para demostrar el fallo y será de gran ayuda a los desarrolladores para una posible solución.

Saludos

Perfil MP  
Objetivo: Re: Clase Paint, Empalmar Arcos Con Segmentos Y Rellenar Con Fill
Hola Jesús,

gracias a ti también por la respuesta. Voy a intentar escribir en la lista de correo de gambas y con lo que contesten volveré después aquí y os cuento.

Saludos

Perfil MP  

Página 1 de 1


  
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas
No puede adjuntar archivos
Puede descargar archivos
No puede publicar eventos en el calendario

   

Está utilizando la versión (Lo-Fi). Para ver la versión completa del foro, haga clic aquí.

Powered by Icy Phoenix based on phpBB
Design by DiDiDaDo

Página generada en:: 0.1613s (PHP: -42% SQL: 142%)
Consultas SQL: 27 - Debug off - GZIP Activado