In order for this site to work correctly we need to store a small file (called a cookie) on your computer. Most every site in the world does this, however since the 25th of May 2011, by law we have to get your permission first. Please abandon the forum if you disagree.

Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.

Pintar un rombo o un triángulo

Foro de Xailer profesional en español
Responder
xevi[1]
Mensajes: 39
Registrado: Lun Jun 14, 2010 3:52 pm

Pintar un rombo o un triángulo

Mensaje por xevi[1] »

El caso que ahora me ocupa és la forma en rellenar el interior de un rombo.
Con la clase TCanvas...
Si bien para pintar un cuadrado/rectángulo existe el método FillRect que
dadas unas coordenadas rellena un cuadrado... ¿como hacer esto para un
triángulo???
¿Alguien tiene alguna función hecha???
¿Seria muy complicado, si no existe el método, implementarlo???
Gracias.
Un Saludo,
Xevi.
Avatar de Usuario
xhermita
Mensajes: 177
Registrado: Vie Feb 18, 2011 10:05 pm
Ubicación: Las Palmas de Gran Canaria
Contactar:

Pintar un rombo o un triángulo

Mensaje por xhermita »

Negus el manual deberí­as utilizar "ExtFloodFill" pero por mas que he
intentado hacerte un ejemplo cono consigo que me haga nada, aunque
siempre me devuelve .T. como que lo hizo bien.
Saludos
Pedro Amaro
El 19/12/2013 14:16, Xevi escribió:
> El caso que ahora me ocupa és la forma en rellenar el interior de un rombo.
> Con la clase TCanvas...
> Si bien para pintar un cuadrado/rectángulo existe el método FillRect que
> dadas unas coordenadas rellena un cuadrado... ¿como hacer esto para un
> triángulo???
>
> ¿Alguien tiene alguna función hecha???
> ¿Seria muy complicado, si no existe el método, implementarlo???
>
>
> Gracias.
>
> Un Saludo,
> Xevi.
Pedro Amaro
2PC Service

Xailer / Néfele / MySQL-MariaDB / SQLServer
xevi[1]
Mensajes: 39
Registrado: Lun Jun 14, 2010 3:52 pm

Pintar un rombo o un triángulo

Mensaje por xevi[1] »

Gracias Pedro.
TCanvas:ExtFloodFill
Dado que se le pasan dos coordenadas, solamente... ¿como pinto un
triángulo???
Esto vendrí­a a ser como pintar una lí­nea ¿no???
¿Alguien me puede orientar como utilizar ExtFloodFill ??? para pintar un
triángulo???
Un Saludo,
Xevi.
"Pedro Amaro" <xhermita@hotmail.com> ha escrit al
missatge:52b33d79$[email=2@svctag-j7w3v3j....]2@svctag-j7w3v3j....[/email]
> Negus el manual deberí­as utilizar "ExtFloodFill" pero por mas que he
> intentado hacerte un ejemplo cono consigo que me haga nada, aunque siempre
> me devuelve .T. como que lo hizo bien.
>
> Saludos
> Pedro Amaro
>
> El 19/12/2013 14:16, Xevi escribió:
>> El caso que ahora me ocupa és la forma en rellenar el interior de un
>> rombo.
>> Con la clase TCanvas...
>> Si bien para pintar un cuadrado/rectángulo existe el método FillRect que
>> dadas unas coordenadas rellena un cuadrado... ¿como hacer esto para un
>> triángulo???
>>
>> ¿Alguien tiene alguna función hecha???
>> ¿Seria muy complicado, si no existe el método, implementarlo???
>>
>>
>> Gracias.
>>
>> Un Saludo,
>> Xevi.
>
Avatar de Usuario
xhermita
Mensajes: 177
Registrado: Vie Feb 18, 2011 10:05 pm
Ubicación: Las Palmas de Gran Canaria
Contactar:

Pintar un rombo o un triángulo

Mensaje por xhermita »

Hasta donde yo entiendo tienes que tener el triangulo dibujado a base de
lineas y con ExtFloodFill lo que haces es rellenarlo.
Saludos
Pedro Amaro
El 20/12/2013 14:14, Xevi escribió:
> Gracias Pedro.
>
> TCanvas:ExtFloodFill
>
> Dado que se le pasan dos coordenadas, solamente... ¿como pinto un
> triángulo???
> Esto vendrí­a a ser como pintar una lí­nea ¿no???
>
> ¿Alguien me puede orientar como utilizar ExtFloodFill ??? para pintar un
> triángulo???
>
>
>
> Un Saludo,
> Xevi.
>
>
> "Pedro Amaro" <xhermita@hotmail.com> ha escrit al
> missatge:52b33d79$[email=2@svctag-j7w3v3j....]2@svctag-j7w3v3j....[/email]
>> Negus el manual deberí­as utilizar "ExtFloodFill" pero por mas que he
>> intentado hacerte un ejemplo cono consigo que me haga nada, aunque
>> siempre me devuelve .T. como que lo hizo bien.
>>
>> Saludos
>> Pedro Amaro
>>
>> El 19/12/2013 14:16, Xevi escribió:
>>> El caso que ahora me ocupa és la forma en rellenar el interior de un
>>> rombo.
>>> Con la clase TCanvas...
>>> Si bien para pintar un cuadrado/rectángulo existe el método FillRect que
>>> dadas unas coordenadas rellena un cuadrado... ¿como hacer esto para un
>>> triángulo???
>>>
>>> ¿Alguien tiene alguna función hecha???
>>> ¿Seria muy complicado, si no existe el método, implementarlo???
>>>
>>>
>>> Gracias.
>>>
>>> Un Saludo,
>>> Xevi.
>>
Pedro Amaro
2PC Service

Xailer / Néfele / MySQL-MariaDB / SQLServer
xevi[1]
Mensajes: 39
Registrado: Lun Jun 14, 2010 3:52 pm

Pintar un rombo o un triángulo

Mensaje por xevi[1] »

ExtFloodFill
¿Alguien puede poner un ejemplo de como utilizarlo???
Gracias.
Un Saludo,
Xevi.
"Xevi" <xevicomas_quitaeso@gmail.com> ha escrit al
missatge:52b2ffd3$[email=1@svctag-j7w3v3j....]1@svctag-j7w3v3j....[/email]
> El caso que ahora me ocupa és la forma en rellenar el interior de un
> rombo.
> Con la clase TCanvas...
> Si bien para pintar un cuadrado/rectángulo existe el método FillRect que
> dadas unas coordenadas rellena un cuadrado... ¿como hacer esto para un
> triángulo???
>
> ¿Alguien tiene alguna función hecha???
> ¿Seria muy complicado, si no existe el método, implementarlo???
>
>
> Gracias.
>
> Un Saludo,
> Xevi.
Avatar de Usuario
ignacio
Site Admin
Mensajes: 9441
Registrado: Lun Abr 06, 2015 8:00 pm
Ubicación: Madrid, Spain
Contactar:

Pintar un rombo o un triángulo

Mensaje por ignacio »

Mira esto:
http://msdn.microsoft.com/en-us/library ... sktop/dd16 2814(v=vs.85).aspx
Con unos pocos conocimientos de 'C' lo tienes hecho en minutos.
Un saludo
Ignacio Ortiz de Zúñiga
[OZ Software]
https://www.ozs.es
--
[Equipo de Xailer / Xailer team]
https://www.xailer.com
xevi[1]
Mensajes: 39
Registrado: Lun Jun 14, 2010 3:52 pm

Pintar un rombo o un triángulo

Mensaje por xevi[1] »

Ignacio,
Seguro que es sencillo para quien tenga conocimientos de C,... pero mis
conocimientos son 0.
Por lo que agadeceria cualquier ayuda al respecto.
Un Saludo,
Xevi.
"Ignacio Ortiz de Zúñiga" <nonametoavoidspam@xailer.com> ha escrit al
missatge:52b56303$[email=1@svctag-j7w3v3j....]1@svctag-j7w3v3j....[/email]
> Mira esto:
> ç
> http://msdn.microsoft.com/en-us/library ... sktop/dd16 2814(v=vs.85).aspx
>
> Con unos pocos conocimientos de 'C' lo tienes hecho en
> minutos.
>
> Un saludo
> --
> Ignacio Ortiz de Zúñiga
> [Equipo de Xailer/Xailer team]
> http://www.xailer.com
> http://www.xailer.info
xevi[1]
Mensajes: 39
Registrado: Lun Jun 14, 2010 3:52 pm

Pintar un rombo o un triángulo

Mensaje por xevi[1] »

ReBuscando por Google... cuesta entender lo que voy leyendo, pues que si
codigo C, ejemplos VB...
No se si este código es el que deberia de empezar por entender para hacer un
wrapper...
void polygon(int xc, int yc, int radius, double angle, int sides)
{
int i;
double ang = 360/sides; //Every vertex is about "ang" degrees from each
other
radian = 180/M_PI;
int points_x[7]; //Here i store the calculated vertexs
int points_y[7]; //Here i store the calculated vertexs
/*Here i calculate the vertexs of the polygon*/
for(i=0; i<sides; i++)
{
points_x = xc + ceil(radius * cos(angle/radian));
points_y = yc + ceil(radius * sin(angle/radian));
angle = angle+ang;
}
/*Here i draw the polygon with the know vertexs just calculated*/
for(i=0; i<sides-1; i++)
line(points_x, points_y, points_x[i+1], points_y[i+1]);
line(points_y, points_x, points_x[0], points_y[0]);
}
Un Saludo,
Xevi.
"Xevi" <xevicomas_quitaeso@gmail.com> ha escrit al
missatge:52b5c125$[email=1@svctag-j7w3v3j....]1@svctag-j7w3v3j....[/email]
> Ignacio,
>
> Seguro que es sencillo para quien tenga conocimientos de C,... pero mis
> conocimientos son 0.
> Por lo que agadeceria cualquier ayuda al respecto.
>
>
> Un Saludo,
> Xevi.
>
>
> "Ignacio Ortiz de Zúñiga" <nonametoavoidspam@xailer.com> ha escrit
> al missatge:52b56303$[email=1@svctag-j7w3v3j....]1@svctag-j7w3v3j....[/email]
>> Mira esto:
>> ç
>> http://msdn.microsoft.com/en-us/library ... sktop/dd16 2814(v=vs.85).aspx
>>
>> Con unos pocos conocimientos de 'C' lo tienes hecho en
>> minutos.
>>
>> Un saludo
>> --
>> Ignacio Ortiz de Zúñiga
>> [Equipo de Xailer/Xailer team]
>> http://www.xailer.com
>> http://www.xailer.info
>
Avatar de Usuario
jfgimenez
Site Admin
Mensajes: 5718
Registrado: Lun Abr 06, 2015 8:48 pm
Contactar:

Pintar un rombo o un triángulo

Mensaje por jfgimenez »

Xevi,
pon esto en algún PRG de tu proyecto:
//---------------------------------------------------------- --------------------
CLASS TCanvas FROM XCanvas
METHOD Polygon( aPoints )
ENDCLASS
//---------------------------------------------------------- --------------------
#pragma BEGINDUMP
#include "Windows.h"
#include "Xailer.h"
HB_FUNC_STATIC( TCANVAS_POLYGON )
{
PHB_ITEM Self = hb_stackSelfItem();
HDC hDC = (HDC) XA_ObjGetNL( Self, "hDC" );
PHB_ITEM aPoints = hb_param( 1, HB_IT_ARRAY ), aPoint;
int nPoints, n;
LPPOINT pt;
if( aPoints && ( ( nPoints = hb_arrayLen( aPoints ) ) != 0 ) )
{
pt = hb_xgrab( nPoints * sizeof( POINT ) );
for( n = 0; n < nPoints; n++ )
{
aPoint = hb_arrayGetItemPtr( aPoints, n + 1 );
pt[ n ].x = hb_arrayGetNL( aPoint, 1 );
pt[ n ].y = hb_arrayGetNL( aPoint, 2 );
}
hb_retnl( Polygon( hDC, pt, nPoints ) );
hb_xfree( pt );
}
else
hb_retnl( 0 );
}
#pragma ENDDUMP
//---------------------------------------------------------- --------------------
Con eso, ya lo tienes como un método más de TCanvas, y para usarlo sólo
tienes que pasarle un array de puntos, donde cada punto es un array de 2
elementos (x e y). P.ej.:
::oCanvas:Polygon( { { 100, 0, }, { 200, 100 }, { 100, 200 }, {
0, 100 } } )
Por otro lado, ya que está, vamos a añadirlo a Xailer ;-)
Un saludo,
José F. Giménez
http://www.xailer.com
http://www.xailer.info
José F. Giménez
[Equipo de Xailer / Xailer team]
http://www.xailer.com
http://www.xailer.info
xevi[1]
Mensajes: 39
Registrado: Lun Jun 14, 2010 3:52 pm

Pintar un rombo o un triángulo

Mensaje por xevi[1] »

Jose,
Solo un "pequeño" detalle,...
este añadido de la clase si bien funciona perfectamente y dibuja un rombo,
triángulo...
¿como hacer para que su interior sea opaco??
o sea pintar TODA el área interior (como hace FillRect()), enviando un
parámetro más a la clase...
Polygon( aPoints, lOpaco )
Gracias.
Un Saludo,
Xevi.
"Jose F. Gimenez" <jfgimenezAM]"@wanadoo.es> ha escrit al
missatge:52b7f66f$[email=1@svctag-j7w3v3j....]1@svctag-j7w3v3j....[/email]
> Xevi,
>
> pon esto en algún PRG de tu proyecto:
>
> //---------------------------------------------------------- --------------------
>
> CLASS TCanvas FROM XCanvas
>
> METHOD Polygon( aPoints )
>
> ENDCLASS
>
> //---------------------------------------------------------- --------------------
>
> #pragma BEGINDUMP
>
> #include "Windows.h"
> #include "Xailer.h"
>
> HB_FUNC_STATIC( TCANVAS_POLYGON )
> {
> PHB_ITEM Self = hb_stackSelfItem();
> HDC hDC = (HDC) XA_ObjGetNL( Self, "hDC" );
> PHB_ITEM aPoints = hb_param( 1, HB_IT_ARRAY ), aPoint;
> int nPoints, n;
> LPPOINT pt;
>
> if( aPoints && ( ( nPoints = hb_arrayLen( aPoints ) ) != 0 ) )
> {
> pt = hb_xgrab( nPoints * sizeof( POINT ) );
> for( n = 0; n < nPoints; n++ )
> {
> aPoint = hb_arrayGetItemPtr( aPoints, n + 1 );
> pt[ n ].x = hb_arrayGetNL( aPoint, 1 );
> pt[ n ].y = hb_arrayGetNL( aPoint, 2 );
> }
> hb_retnl( Polygon( hDC, pt, nPoints ) );
> hb_xfree( pt );
> }
> else
> hb_retnl( 0 );
> }
>
> #pragma ENDDUMP
>
> //---------------------------------------------------------- --------------------
>
> Con eso, ya lo tienes como un método más de TCanvas, y para usarlo sólo
> tienes que pasarle un array de puntos, donde cada punto es un array de 2
> elementos (x e y). P.ej.:
>
> ::oCanvas:Polygon( { { 100, 0, }, { 200, 100 }, { 100, 200 }, { 0,
> 100 } } )
>
>
> Por otro lado, ya que está, vamos a añadirlo a Xailer ;-)
>
>
> Un saludo,
>
> José F. Giménez
> http://www.xailer.com
> http://www.xailer.info
Avatar de Usuario
ignacio
Site Admin
Mensajes: 9441
Registrado: Lun Abr 06, 2015 8:00 pm
Ubicación: Madrid, Spain
Contactar:

Pintar un rombo o un triángulo

Mensaje por ignacio »

Buenos dí­as,
Por lo que pude leer en la documentación de MSDN el interior de los puntos se rellenaba con el actual brush. Intenta hacer lo siguiente antes de llamar al método:
SetBkColor( oCanvas:hDC, nColor )
Si esto no te funcionase añade también:
SetbkMode( oCanvas:hDC, OPAQUE )
Saludos
Ignacio Ortiz de Zúñiga
[OZ Software]
https://www.ozs.es
--
[Equipo de Xailer / Xailer team]
https://www.xailer.com
xevi[1]
Mensajes: 39
Registrado: Lun Jun 14, 2010 3:52 pm

Pintar un rombo o un triángulo

Mensaje por xevi[1] »

Ignacio,
He cogido el Sample PrinterInfo de Xailer, para hacer pruebas...
en el evento
METHOD Button5Click( oSender ) CLASS TForm1
....
en la lí­nea 200 he añadido esta sola lí­nea
:Polygon( { { 100, 0, }, { 200, 100 }, { 100, 200 }, { 0, 100 } } )
Y muestra un rombo en las coordenadas especificadas.
Me doy cuenta que lo hace opaco (no transparente) y así­ pues, el interior es
de color blanco.
he cambiado esa lí­nea por estas lí­neas...
SetBkColor( :hDC, clRed )
SetbkMode( :hDC, OPAQUE )
:Polygon( { { 100, 0, }, { 200, 100 }, { 100, 200 }, { 0, 100 } } )
Pero no "cambia" el color del interior, siempre es opaco de color blanco.
Gracias.
Un Saludo,
Xevi.
"Ignacio Ortiz de Zúñiga" <nonametoavoidspam@xailer.com> ha escrit al
missatge:52b8077c$[email=1@svctag-j7w3v3j....]1@svctag-j7w3v3j....[/email]
> Buenos dí­as,
> Por lo que pude leer en la documentación de MSDN el
> interior de los puntos se rellenaba con el actual brush.
> Intenta hacer lo siguiente antes de llamar al método:
>
> SetBkColor( oCanvas:hDC, nColor )
>
> Si esto no te funcionase añade también:
>
> SetbkMode( oCanvas:hDC, OPAQUE )
>
> Saludos
> --
> Ignacio Ortiz de Zúñiga
> [Equipo de Xailer/Xailer team]
> http://www.xailer.com
> http://www.xailer.info
Avatar de Usuario
ignacio
Site Admin
Mensajes: 9441
Registrado: Lun Abr 06, 2015 8:00 pm
Ubicación: Madrid, Spain
Contactar:

Pintar un rombo o un triángulo

Mensaje por ignacio »

Por lo que veo requiere una brocha:
WITH OBJECT TCanvas():NewFromDC( hDC )
hBrush := CreateSolidBrush( clBlue )
SelectObject( :hDC, hBrush )
:Polygon( { {0,0}, {100, 100}, {0, 100} } )
DeleteObject( hBrush )
END WITH
Saludos
Ignacio Ortiz de Zúñiga
[OZ Software]
https://www.ozs.es
--
[Equipo de Xailer / Xailer team]
https://www.xailer.com
xevi[1]
Mensajes: 39
Registrado: Lun Jun 14, 2010 3:52 pm

Pintar un rombo o un triángulo

Mensaje por xevi[1] »

Ignacio
Gracias.
Ahora SI !!!, solo un detallito... he tenido que añadir : en hDC, así­:
WITH OBJECT TCanvas():NewFromDC( :hDC )
hBrush := CreateSolidBrush( clBlue )
SelectObject( :hDC, hBrush )
:Polygon( { {100,0}, {200, 100}, {100, 200}, { 0, 100 } } )
DeleteObject( hBrush )
END WITH
en el Sample ya me "pinta" un rombo de color azul!!! Y quien dice un rombo,
dice un triángulo o una forma cualquiera de ángulos.
Al implementar el método Polygon() en TCanvas, en la próxima actualización
de Xailer será de esa forma o el mismo evento dispondrá de un parámetro para
el color de relleno ???
Puestos con ello... habrá o puede haber color transparente???
Y, más... por que no extender este método a un objeto cualquiera y así­ poder
"pintar" una forma de polí­gono en un Form, Panel...
Muchas Gracias.
Un Saludo,
Xevi.
Responder