Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Centrar ellipse en TImage (https://www.clubdelphi.com/foros/showthread.php?t=94471)

ecfisa 26-02-2020 17:48:23

Hola.

A ver, si tenes una imágen de 10 x 10 y dibujas un círculo de 15 x 15 es seguro que no se va a enmarcar en el primero. Lo normal es que el lienzo donde dibujas, sea superior a la imágen que intentas dibujar. De allí la verificación del if ... then y el consiguiente mensaje.

Pero todo eso si interpreté bién lo que estas buscando hacer...

Saludos :)

compuin 26-02-2020 17:50:56

Pues ni reduciendole las dimensiones al elipse me funciona

ecfisa 26-02-2020 18:06:26

1 Archivos Adjunto(s)
Hola.

Funciona correcto en mi caso.

Lamento no tener Delphi 7 pero despues de haberlo usado por cerca de dos décadas te puedo asegurar que el código funcionará en esa versión también.

Lo mas que puedo hacer es adjuntarte el código funcionando en Delphi 10.3 para que puedas extraer de allí lo que te sirva.

Solo crea una carpeta y extraé el comprimido allí.

Saludos :)

Neftali [Germán.Estévez] 26-02-2020 21:01:39

1 Archivos Adjunto(s)
Cita:

Empezado por compuin (Mensaje 535932)
Gracias Neftali
No se si sirva de algo pero estoy utilizando Borland Delphi 7, asi que algunas instrucciones no me estan funcionando adecuadamente


Es muy similar, lo único que cambian son las units.
Este que te adjunto está en Delphi7 y funciona.

compuin 26-02-2020 21:04:35

Hola neptali,

Ya probe el ejemplo que me enviastes para D7 pero este no queda circular y sus bordes quedan pegados a los bordes del TImage

:confused:

compuin 26-02-2020 21:10:44


Neftali [Germán.Estévez] 26-02-2020 23:03:27

1 Archivos Adjunto(s)
Cita:

Empezado por compuin (Mensaje 535957)
Hola neptali,

Ya probe el ejemplo que me enviastes para D7 pero este no queda circular y sus bordes quedan pegados a los bordes del TImage

Vaya, pensé que eso era lo que querías. :(:(:(
Con unas pequeñas modificaciones en los puntos de dibujo debería centrarse.

NOTA:el código del ejemplo de puede optimizar para eliminar operaciones repetidas.

compuin 27-02-2020 00:07:37

Ya lo intente no tuve exito

ecfisa 27-02-2020 00:26:12

Hola.
Cita:

Empezado por compuin (Mensaje 535963)
Ya lo intente no tuve exito

Adjunta el código que te dá problemas tál como lo compilas.

Saludos :)

compuin 27-02-2020 01:15:29

Este mensaje era del elipse antes de recibir el ultim codigo que me enviastes

Esta perfecto dibuja un circulo centrado en el TImage

Que debo modificar para hacerlo mas pequeno y que me deje espacio entre los bordes superiores e inferiores del TImage sin perder la circunferencia, es decir, reducir el diametro del circulo ?


Neftali [Germán.Estévez] 27-02-2020 08:29:12

Cita:

Empezado por compuin (Mensaje 535965)
Que debo modificar para hacerlo mas pequeno y que me deje espacio entre los bordes superiores e inferiores del TImage sin perder la circunferencia, es decir, reducir el diametro del circulo ?


La imagen que has colocado no se ve.
Si necesitas un margen en el círculo, sólo debes sumarselo a las 2 primeras Coordenadas (x1, y1) y restárselo a las 2 segundas (x2, y2).

compuin 27-02-2020 12:29:45

Cita:

Empezado por Neftali [Germán.Estévez] (Mensaje 535967)
La imagen que has colocado no se ve.
Si necesitas un margen en el círculo, sólo debes sumarselo a las 2 primeras Coordenadas (x1, y1) y restárselo a las 2 segundas (x2, y2).

Necesito hacer el círculo más pequeño y que no toque los bordes del TImage. Sumando logro eso?

Neftali [Germán.Estévez] 27-02-2020 14:40:49

Cita:

Empezado por compuin (Mensaje 535968)
Necesito hacer el círculo más pequeño y que no toque los bordes del TImage. Sumando logro eso?


Cita:

Empezado por Neftali [Germán.Estévez] (Mensaje 535967)
...debes sumarselo a las 2 primeras Coordenadas (x1, y1) y restárselo a las 2 segundas (x2, y2).


La misma cantidad.
Sumar a las 2 primeras, restar a las 2 segundas.

compuin 27-02-2020 14:48:08

Cita:

Empezado por Neftali [Germán.Estévez] (Mensaje 535972)
La misma cantidad.
Sumar a las 2 primeras, restar a las 2 segundas.


Donde consigo esas coordenadas (x1,x2 y y1,y2) ?

ecfisa 27-02-2020 17:09:01

Hola.
Cita:

Empezado por compuin (Mensaje 535973)
Donde consigo esas coordenadas (x1,x2 y y1,y2) ?

Cita:

Empezado por ecfisa (Mensaje 535942)
Código Delphi [-]
procedure CenterEllipse(Img: TImage; x1,y1,x2,y2: Integer; aColor: TColor);
var
  C,R: TPoint;
begin
  C.X := (Img.Picture.Width) div 2;
  C.Y := (Img.Picture.Height) div 2;
  R.X := (x2-x1) div 2 ;
  R.Y := (y2-y1) div 2;
  Img.Canvas.Pen.Color := aColor;
  Img.Canvas.Ellipse(C.X - R.X,  C.Y - R.Y, C.X + R.X, C.Y + R.Y);
end;

Saludos :)

compuin 27-02-2020 17:10:36

Hola

Pero estoy usando este codigo que es el que me ha funcionado mejor a mi necesidad

Código Delphi [-]
    FormMain.Wheel.Top := 10;
    FormMain.Wheel.left:= 250;
    FormMain.Wheel.Height:= 700;
    FormMain.Wheel.Width:= 1000;

 //   Ellipse(FormMain.Wheel.Canvas.Handle, 17, 17, 674, 674);

    Windows.Ellipse(FormMain.Wheel.Canvas.Handle,
                    Max((FormMain.Wheel.Width - FormMain.Wheel.Height) div 2, 0),
                    Max((FormMain.Wheel.Height - FormMain.Wheel.Width) div 2, 0),
                    -Max((FormMain.Wheel.Width - FormMain.Wheel.Height) div 2, 0) + FormMain.Wheel.Width,
                    -Max((FormMain.Wheel.Height - FormMain.Wheel.Width) div 2, 0) + FormMain.Wheel.Height);

Como lo ajusto aqui ?

ecfisa 27-02-2020 17:37:53

Hola.
Cita:

Empezado por compuin (Mensaje 535980)
Hola

Pero estoy usando este codigo que es el que me ha funcionado mejor a mi necesidad

Código Delphi [-]
 //   Ellipse(FormMain.Wheel.Canvas.Handle, 17, 17, 674, 674);  // <===== !!!!

Como lo ajusto aqui ?

Te marqué en ese código la línea donde encuentras x1, y1, x2 e y2 (son los valores que se reciben en los parámetros de la función Ellipse)


Saludos :)

compuin 27-02-2020 17:42:10

Ahora me confundi

Esta linea genera un circulo que no esta centrado

La segunda parte del codigo genera el circulo centrado pero tocando los bordes de; TImage

Necesito un circulo centrado mas pequeno, y eso no lo hace la linea que me indicas

ecfisa 27-02-2020 18:20:39

Hola.

A ver, modifico un poco un ejemplo a ver si podes lograr lo que estas buscando.
Código Delphi [-]
...
implementation 

procedure CenterEllipse(Img: TImage; x1,y1,x2,y2: Integer; aColor: TColor);
var
  C,R: TPoint;
begin
  C.X := (Img.Picture.Width) div 2;
  C.Y := (Img.Picture.Height) div 2;
  R.X := (x2-x1) div 2 ;
  R.Y := (y2-y1) div 2;
  if (C.X-R.X < 0) or (C.Y-R.Y < 0) or
     (C.X+R.X > Img.Picture.Width) or (C.Y+R.Y >Img.Picture.Height) then
    raise Exception.Create('Elipse fuera de rango');
  Img.Canvas.Brush.Style := bsClear;
  Img.Canvas.Pen.Color := aColor;
  Img.Canvas.Ellipse(C.X - R.X,  C.Y - R.Y, C.X + R.X, C.Y + R.Y);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  // Cargar imagen en blanco
  Image1.Picture.LoadFromFile('Blank.bmp');
  // Ajustar el ancho y el alto del TImage a la imágen
  Image1.Width  := Image1.Picture.Width;
  Image1.Height := Image1.Picture.Height;
  // color verde
  Self.Color  := clMoneyGreen;
end;


procedure TForm1.Button1Click(Sender: TObject);
var
  i,x : Integer;
begin
  x := 10;
  for i := 0 to 50 do
  begin
    CenterEllipse(Image1, x, x, x*2, x*2, clBlack);
    Inc(x, 10);
  end;
end;

Este es el resultado, todos centrados.


Saludos :)

Nota: Delphi 7 soporta raise Exception (raise command)

compuin 27-02-2020 18:47:27

Lo probare y te dejare saber

Muchas gracias


La franja horaria es GMT +2. Ahora son las 01:55:32.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi