FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
||||
|
||||
¿Cómo pintar un círculo matemáticamente?
saludos!
miren colegas, el problema es que necesito pintar un círculo matemáticamente, sin usar el método Ellipse del Canvas ya que con este método si el Pen.Width = 1 e intento ir "cerrando el radio" y repintar un nuevo círculo quedan pixeles sin pintar, mi objetivo es lograr un Degradado Radial parecido al de PhotoShop, pero lo que necesito primeramente es logarar que no ocurra lo que acabo de explicar, si uso la fórmula matemática del círculo: R^2 = (X - H)^2 + (Y - K)^2, y despejo para halla a que valor de X le corresponde en Y según el radio, me sucede lo siguiente:
nuevamente existen pixeles que no lograr cerrar el arco completamente, espero que me hallan entendido y que me puedan responder. mil gracias de antemano, saludos! aeff! |
#2
|
|||
|
|||
hola, creo que te has hecho un lio. Te dejo el codigo, y te recomiendo que lo entiendas
Última edición por coso fecha: 03-01-2009 a las 19:33:41. |
#3
|
||||
|
||||
saludos, bueno, ¿me puedes explicar el ejemplo del button 2?, ¿por que es seno y coseno? si en la fórmula del círculo no veo esto,
** nota: no tengo conocimientos fuertes de matemática, por esto es que paso tanto trabajo** mil gracias de antemano colega! saludos! aeff! |
#4
|
|||
|
|||
A ver...es trigonometria: en un triangulo rectangulo (con un angulo de 90 grados o PI/2 radiantes)...
sino de angulo (phi) = lado opuesto (y) / hipotenusa (r)=> y = r*sin(phi) . Para desplazarlo al centro que tu quieras, y = cy + r*sin(phi) cosino de angulo (phi) = lado adyacente (x) / hipotenusa (r) => x = r * cos(phi). Para desplazarlo al centro, x = cx + r*sin(phi) para dibujar el circulo, entonces, vas encontrando las coordenadas x,y manteniendo fija la r, recorriendo 2*PI radianes (360º) "fabricando" los triangulos rectangulos ya que estamos, prueba :
Última edición por coso fecha: 03-01-2009 a las 23:30:17. |
#5
|
|||
|
|||
Hola
Yo te explico, disculpame que me meta. x + r*cos(phi)) esto es el valor de X más la proyección de r sobre ese mismo eje de coordenadas, y + r*sin(phi)) es el valor de y más el valor de r proyectado sobre el otro eje. En resumen, te da las coordenadas de un punto (i,j), son valores enteros por eso usa trunc para tomar solamente la parte entera de las ecuaciones anteriores. Está usando coordenadas polares me parece si mal no recuerdo Mirá aquí Saludos Disculpame coso |
#6
|
|||
|
|||
Cita:
Cita:
|
#7
|
||||
|
||||
ñoooooo! ahora si que veo lo linda que es la matemática, nunca me inmaginé como aplicar de esta forma las razones trigonometricas seno y coseno, mil gracias a todos por su ayuda,
por último, ¿como puedo hacer este círculo con relleno y que no se demore? porque usando este método de hallar lado opuesto y lado adyacente hacemos un recorrido hasta 360º de 0.001 en 0.001, y esto provoca que si voy disminuyendo el radio y vuelvo a pintar el círculo de esta forma nuevamente se producirá el ciclo hasta 360º , inmagínense que haga un Degradado Radial con un círculo que tenga como radio 800px, ¿cuanto tardará???.. espero que puedan ayudar nuevamente, mil gracias de antemano! AEff! |
#8
|
||||
|
||||
Lo que puedes hacer es pensarlo al reves...
Tienes un cirulo de 800px de diámetro. Por lo tanto entra dentro de un cuadrado de 800px con centro en (x,y). Lo que puede hacer es ir leyendo cada pixel y ver si está dentro del círuculo. - averiguas el valor del radio para (x,y). --- para esto utilizas r=sqrt(x²+y²). - si el radio es menor o igual a 400, está dentro del círculo. --- luego pudes decidir qué color le corresponde según el valor del radio. --- (radio(1)= rojo puro, radio(400)=azul puro, radio(200)= 50%rojo+50%azul, ...) - si es mayor, lo descartas. De esta manera la cantidad de iteraciones es 800x800=64000 (y solo en algunas se pinta) Última edición por duilioisola fecha: 04-01-2009 a las 14:57:26. |
#9
|
||||
|
||||
Como recomendación extra, sería útil que en vez de usar Pixels[] emplearas ScanLine(). El acceso es mucho más rápido.
Tal vez sea un poquito más complicado y requiera unas cuantas lineas más de código, pero se gana mucho en perfomance. En otras ocasiones se habló de scanline, e incluso hay código con ejemplos de uso. Recomiendo una búsqueda con dicho término. Saludos, |
#10
|
||||
|
||||
miren, la solución que encontré, ¿que opinan?, para no calentarme mucho la cabeza:
ahora, añado un TImage y un Button y en el evento OnCLick del button coloco esto:
¿bueno, que opinan? saludos! aeff! |
#11
|
|||
|
|||
hombre, personalmente lo haria de otra manera, segun para que quiero utilizarlo, pero si a ti te va bien, perfecto
|
#12
|
||||
|
||||
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Un Falso NYT Circulo el 12 de Noviembre | RONPABLO | La Taberna | 0 | 13-11-2008 23:23:00 |
Círculo sin relleno | bosterito | Gráficos | 2 | 01-02-2007 22:41:02 |
cómo recortar (en circulo) un formulario en delphi? | rls | Gráficos | 2 | 02-06-2006 09:15:14 |
Como pintar la fila de un DBGrid | Gustavo Gowdak | OOP | 2 | 04-05-2006 21:34:04 |
El círculo | delphi.com.ar | Humor | 11 | 28-04-2004 21:22:42 |
|