Vous êtes sur la page 1sur 14

Regiones

Una regin puede encapsular formas bsicas, trayectos y otras regiones. La novedad del objeto Region es que no se limita a aadir sus componentes (de hecho carece de mtodos Addxxxx) sino que los combina segn una relacin entre sus puntos establecida por el usuario. Veremos los diferentes mtodos de combinacin de formas con un sencillo ejemplo:

Private Sub Regiones()

Dim Lienzo As Graphics = Me.CreateGraphics

Dim Trayecto1 As New GraphicsPath() Trayecto1.AddEllipse(DameRec(New Point(250, 250), 200, 200))

Dim Trayecto2 As New GraphicsPath() Trayecto2.AddEllipse(DameRec(New Point(350, 250), 200, 200))

Dim Regin As New Region(Trayecto1)Creamos un objeto Region compuesto por las formas encapsuladas en el GraphicsPath Trayecto1

Regin.Exclude(Trayecto2)Al aadir el GraphicsPth Trayecto2 Regin.Union(Trayecto2)indicamos cmo combinamos el contenido Regin.Intersect(Trayecto2)del nuevo GraphicsPath Trayecto2 con Trayecto1 Regin.Complement(Trayecto2)seleccionando uno de estos 5 mtodos

Regin.Xor(Trayecto2)

Regin.MakeEmpty() Regin.MakeInfinite()

Finalmente plasmamos el dibujo resultante mediante el mtodo FillRegion del objeto Graphics pasndole como parmetros una brocha y la regin recin creada Lienzo.FillRegion(Brushes.LightSkyBlue, Regin)

Mediante el mtodo DrawPath del objeto Graphics dibujamos las formas encapsuladas en los GraphicPath Trayecto1 y Trayecto2 para apreciar mejor el comportamiento de las diferentes opciones de combinacin del objeto Region Lienzo.DrawPath(Pens.Black, Trayecto1) Lienzo.DrawPath(Pens.Black, Trayecto2)

Trayecto1.Dispose() Trayecto2.Dispose() Lienzo.Dispose()

End Sub

Private Function DameRec(ByVal Punto As Point, ByVal EjeX As Integer, ByVal EjeY As Integer) As Rectangle

Dim MiPunto As Point = New Point(Punto.X - EjeX / 2, Punto.Y - EjeY / 2)

Devuelve un rectngulo a partir del punto central y sus dos ejes horizontal (EjeX) y vertical (ejeY)

Return New Rectangle(MiPunto, New Size(EjeX, EjeY)) End Function

Se trata de pintar un crculo y aadir otro a su derecha segn los cinco mtodos de combinacin de formas. Segn qu lnea seleccionemos de las cinco sealizadas con un asterisco, el resultado es el siguiente:

RG.Union(P2) El crculo nuevo (el de la derecha) se une formando una regin compuesta por todos los puntos que pertenercen a cualquiera de las dos formas. Sea x un punto cualquiera de la regin resultante, P1 el crculo inicial (el de la izquierda) y P2 el que se aade (el de la derecha), entonces:

RG.Intersect(P2) La regin resultante contiene slo los puntos que pertenecen a las dos formas:

RG.Xor(P2) La regin final contiene los puntos que no comparten las dos formas. Es el opuesto a Intersect

RG.Exclude(P2) La regin final contiene todos los puntos pertenecientes a la forma inicial salvo los que pertenecen a la nueva forma aadida, pertenezcan o no a la forma inicial:

RG.Complement(P2) Es el opuesto a Exclude. Se colorean los puntos que pertenecen a la forma aadida salvo los pertenecientes a la forma inicial, pertenezcan o no a la forma aadida:

Intersect es el mtodo creador de lo que en ingls se llama Clip. El efecto obtenido es el recorte de una imagen. Se define una regin igual a la superficie ocupada por la imagen y otra incluida en ella pero de rea menor y transparente. Al intersectar las dos regiones, desaparecen los puntos que no pertenecen a las dos regiones, y como la

ms pequea es transparente, permite ver la imagen, que queda recortada dentro de aqulla. He aqu un ejemplo:

Private Sub PedazoDeTarta () Dim Lienzo As Graphics = Me.CreateGraphics Dim Brocha As TextureBrush = New TextureBrush(PictureBox1.Image) Dim Regin As Region = New Region(New Rectangle(0, 0, Me.ClientSize.Width, Me.ClientSize.Height))La regin abarca todo el rea cliente

Dim Trayecto As New GraphicsPath() Dim Radio As Integer = 200 Dim Centro As Point = New Point(Me.ClientSize.Width / 2, Me.ClientSize.Height / 2) Trayecto.AddPie(DameCuadrado(Centro, Radio), 0, 90 * 3)

AddPie aade un arco cuyos extremos estn unidos al punto central del crculo Sus parmetros coinciden con los del arco Trayecto.StartFigure() Trayecto.AddPie(DameCuadrado(New Point(Centro.X + 20, Centro.Y - 20), Radio), 90 * 3, 90)

Regin.Intersect(Trayecto)Aqu est el punto clave: la interseccin

Lienzo.FillRegion(Brocha, Regin)

Brocha.Dispose()

End Sub

Private Function DameCuadrado(ByVal Punto As Point, ByVal Radio As Integer) As Rectangle Devuelve un cuadrado a partir del punto central y el radio Dim Punto As Point = New Point(Punto.X - Radio, Punto.Y - Radio) Return New Rectangle(Punto, New Size(Radio * 2, Radio * 2)) End Function

El resultado es la hija de Cipri distribuida dentro de una tarta:

Este mtodo, sin embargo, no siempre es capaz de crear un clip. Supongamos este grfico, formado superponiendo la versin circular de nuestro PathGradientBrush sobre las tuberas que pintamos con el LinearGradientBrush:

Queremos hacer pasar las tuberas azules sobre el crculo, y mantener todo lo dems intacto. Intntelo el lector con Intersect: nosotros no lo hemos conseguido. Para nuestra fortuna, VSNET ha venido en nuestra ayuda: el mtodo SetClips del objeto Graphics crea una regin que recortar las regiones que se combinen con ella. Aplicndolo a nuestro ejemplo, hemos creado una regin, marcada en el grfico con trazo amarillo, que ocupa la superficie cubierta por los tubos azules:

Del mismo modo que dos regiones pueden combinarse de las cinco maneras diferentes arriba indicadas, la regin que se aplique al clip tambin puede combinarse con l de cualquiera de esas cinco maneras. Elegiremos, por tanto, la interseccin. El truco consiste en volver a pintar todas las tuberas sobre el clip. Al haber elegido la interseccin, El clip permite que se pinte slo lo que cabe dentro de l, que hemos procurado que coincida con las tuberas azules. He aqu el cdigo y el resultado:

Private Sub ClipTuberas()Aqu arranca el ejemplo

Dim Lienzo As Graphics = Me.CreateGraphics Dim Tamao As Size = New Size(300, 150)

'Primero pintamos los tubos CreaMosaico(Lienzo, Tamao)

'Hay 7 tubos ms una franja de otro. Esa franja es MargenY Dim MargenY As Decimal = Me.ClientSize.Height * 2 / 70 / 2

'Punto central y radio del crculo Dim Punto As Point = New Point(Me.ClientSize.Width / 2, Me.ClientSize.Height / 2) Dim Radio As Decimal = Me.ClientSize.Height / 2 - MargenY PintaCrculo(Punto, Radio) 'Dibujamos el crculo

'Definimos los rectngulos que forman los tubos azules y estn sealados en el grfico con trazo amarillo Dim ClipRegion As Region = BarrasCrculo(MargenY, Me.ClientSize.Height / (7 - (7 / 2) / 70))

Lienzo.SetClip(ClipRegion, CombineMode.Intersect) Setclip toma dos parmetros: la regin que se combina con la regin que hace de clip y el modo de combinacin, enumeracin CombineMode

'Tras esta lnea,todo lo que dibujemos ser invisible 'salvo lo que ocupe la superficie definida por la regin 'pasada como argumento a SetClip

'Pintamos otra vez el mosaico,

'pero ahora slo son visibles los tubos azules CreaMosaico(Lienzo, Tamao)

End Sub

Private Sub CreaMosaico(ByVal Lienzo As Graphics, ByVal Tamao As Size) Dim i, j As Short For i = 0 To Me.ClientSize.Width \ Tamao.Width For j = 0 To Me.ClientSize.Height \ Tamao.Height PintaMosaico(Lienzo, New Point(i * Tamao.Width, j * Tamao.Height), Tamao) Next Next End Sub

Private Sub PintaCrculo(ByVal Punto As Point, ByVal Radio As Decimal)Comentado ms arriba Dim Lienzo As Graphics = Me.CreateGraphics Dim Trayecto As GraphicsPath = New GraphicsPath()

Trayecto.AddEllipse(DameRec(Punto, Radio, Radio)) Dim Brocha As PathGradientBrush = New PathGradientBrush(Trayecto) Brocha.CenterPoint = New PointF(Punto.X, Punto.Y) Dim c As Color = Color.Brown

Dim z As Short = 15

Dim Posiciones(z) As Single : Dim Colores(z) As Color

Posiciones(0) = 0.0F : Colores(0) = Color.Firebrick Posiciones(1) = 0.15F : Colores(1) = Color.Firebrick Posiciones(2) = 0.25F : Colores(2) = Color.Goldenrod Posiciones(3) = 0.35F : Colores(3) = Color.Firebrick Posiciones(4) = 0.525F : Colores(4) = Color.Brown Posiciones(5) = 0.6F : Colores(5) = Color.Goldenrod Posiciones(6) = 0.66F : Colores(6) = Color.Brown Posiciones(7) = 0.775F : Colores(7) = Color.Brown Posiciones(8) = 0.825F : Colores(8) = Color.Goldenrod Posiciones(9) = 0.85F : Colores(9) = Color.Brown Posiciones(10) = 0.935F : Colores(10) = Color.DarkRed Posiciones(11) = 0.95F : Colores(11) = Color.Goldenrod Posiciones(12) = 0.965F : Colores(12) = Color.DarkRed Posiciones(13) = 0.985F : Colores(13) = Color.DarkRed Posiciones(14) = 0.995F : Colores(14) = Color.Goldenrod Posiciones(z) = 1.0F : Colores(z) = Color.Goldenrod

Dim Mezcla As New ColorBlend() Mezcla.Colors = Colores Mezcla.Positions = Posiciones Brocha.InterpolationColors = Mezcla

Dim Regin As Region = New Region(Trayecto) Lienzo.FillRegion(Brocha, Regin)

Brocha.Dispose() Lienzo.Dispose()

End Sub

Private Function BarrasCrculo(ByVal MargenY As Decimal, ByVal AnchoBarra As Decimal) As Region Crea la regin que servir de clip y coincide con la sealada con trazos amarillos Dim i As Short Dim Trayecto As New GraphicsPath() For i = 1 To Me.ClientSize.Height \ AnchoBarra - 1 Step 2 Trayecto.AddRectangle(New Rectangle(0, MargenY + i * AnchoBarra, _ Me.ClientSize.Width, AnchoBarra)) Next

Return New Region(Trayecto) End Function

Vous aimerez peut-être aussi