Discussion:
Arcos de circulos decentes
(demasiado antiguo para responder)
Eduardo
2006-05-20 17:09:52 UTC
Permalink
Les hago una introduccion a mi problema:

Tengo que dibujar una serie de segmentos y arcos de circulo, como se debe
hacer un zoom en zonas de interes (puede ser 50x), el radio de los arcos
puede tomar valores grandes, ademas de que los puntos inicial y final de la
mayoria de los elementos caen fuera de la ventana.
Como las rectas pueden empalmarse con los arcos, ser tangentes etc,etc...
obliga a tener una cierta precision, una rutina asi debe no puede usar
argumentos en grados, deberia ser un float ,un entero en milesimas de grado
o PuntoInicial-PuntoFinal-Radio-CoordCentro.

De las librerias graficas (16bit) que he encontrado, para dibujar arco de
circulo todas utilizan en su llamada un numero entero de grados para los
angulos inicial y final.
Este detalle hace que solo sirva para dibujar arcos de radio pequeño, uno de
radio 256 pixels ya tiene un error de 4 pixels.

La version 'precisa' de estas rutinas deberia ser del estilo de la API Arc y
ArcTo de Windows
BOOL Arc(
HDC hdc, // handle to device context
int nLeftRect, // x-coordinate of bounding rectangle's upper-left corner
int nTopRect, // y-coordinate of bounding rectangle's upper-left corner
int nRightRect, // x-coordinate of bounding rectangle's lower-right
corner
int nBottomRect, // y-coordinate of bounding rectangle's lower-right
corner
int nXStartArc, // first radial ending point
int nYStartArc, // first radial ending point
int nXEndArc, // second radial ending point
int nYEndArc // second radial ending point
);
Si bien en Windows 95/98 tiene la limitaciones en cuanto al tamaño del
rectangulo, me resultan suficientes.

Tambien busque sobre el algoritno de Bresenham para circulos, y solo
encontre ejemplos para dibujar circulos completos.


Despues de todo esto viene la pregunta evidente: Alguien conoce alguna
libreria en C (16bit) que dibuje arcos con mas precision ?


Eduardo.





Inviato da X-Privat.Org - Registrazione gratuita http://www.x-privat.org/join.php
Pedro Maicas
2006-05-20 20:49:20 UTC
Permalink
Post by Eduardo
Despues de todo esto viene la pregunta evidente: Alguien conoce alguna
libreria en C (16bit) que dibuje arcos con mas precision ?
¿ No acabarías antes si lo haces tu mismo ?

Ya sabes .. x2+y2=r2, x=r*cos(a) , ....

La única pega es que tienes que elegir el "paso"
apropiado para no calcular puntos de más o de menos,
pero es facil tomar la decision, según el angulo
sea mayor o menor de 45 grados incrementas y o x de
uno en uno (pixels).

y los angulos, en un double, en radianes.

Saludos :-) -Pedro-

http://www.maicas.net/

e-mail en www.maicas.net
Eduardo
2006-05-20 23:40:54 UTC
Permalink
Primero gracias por responder.
No es que al problema no le encuentre solucion, hay muchas, la que propones
es la que usan todos los programas de CAD que conozco, descomponen los arcos
en una poligonal donde el grado de aproximacion se declara previamente.

Tambien se puede escribir una rutina que use un algoritmo tipo Bresenham,
pero para arcos, no circulo completo (que abundan), si queremos que dibuje
bien tiene sus refinamientos, pero no es imposible.
Logicamente, nada mejor que una libreria escrita por otro que ya lo
contemple.

Otra variante es no utlizar C, por ejemplo en la instruccion CIRCLE del
viejo y noble
QuickBasic/PowerBasic los angulos inicial y final son en radianes.
Es mas, el programa que ahora quiero hacer en C ya lo he escrito hace 12
años en QuickBasic y ha sido mas util y agil de lo podia suponer. Pero ahora
le quiero hacer unos cuantos cambios y agregados, y quiero reescribirlo en
C.

Muchos pensaran: que sentido tiene dibujar un arco con un algoritmo que use
operaciones con enteros en lugar de punto flotante? si con la velocidad de
las maquinas actuales presentacion es instantanea?
Es solo una cuestion de gustos, en el primer caso el algoritmo utilizado es
el 'correcto' mientras que el segundo es solo un algoritmo que 'funciona'.

Saludos.
Eduardo.
Post by Pedro Maicas
Post by Eduardo
Despues de todo esto viene la pregunta evidente: Alguien conoce alguna
libreria en C (16bit) que dibuje arcos con mas precision ?
¿ No acabarías antes si lo haces tu mismo ?
Ya sabes .. x2+y2=r2, x=r*cos(a) , ....
La única pega es que tienes que elegir el "paso"
apropiado para no calcular puntos de más o de menos,
pero es facil tomar la decision, según el angulo
sea mayor o menor de 45 grados incrementas y o x de
uno en uno (pixels).
y los angulos, en un double, en radianes.
Saludos :-) -Pedro-
http://www.maicas.net/
e-mail en www.maicas.net
Inviato da X-Privat.Org - Registrazione gratuita http://www.x-privat.org/join.php
Loading...