Sign in Join
Wiki copytemporary

BGRABitmap tutorial 11/es: what changed

Revision 1 to 2. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
11Esta tutoría muestra como combinar transformaciones.
22
33### Crear un nuevo proyecto
44
55Crea un nuevo proyecto y añade referencia a [[BGRABitmap]], de la misma forma que en el [[BGRABitmap tutorial/es|primer tutorial]].
66
77### Transformación afín de un degradado radial
88
99Aquí se aplica una transformación afín en un gradiente como lo hicimos con las texturas:
1010
1111``` pascal
1212uses BGRAGradientScanner, BGRATransform;
1313
1414procedure TForm1.FormPaint(Sender: TObject);
1515var image: TBGRABitmap;
1616 grad: TBGRAGradientScanner;
1717 affine: TBGRAAffineScannerTransform;
1818begin
1919 image := TBGRABitmap.Create(ClientWidth,ClientHeight, BGRABlack );
2020
2121 grad := TBGRAGradientScanner.Create(BGRA(0,0,255),BGRAWhite,gtRadial,PointF(0,0),PointF(1,0),True,True);
2222
2323 affine := TBGRAAffineScannerTransform.Create(grad);
2424 affine.Scale(150,80);
2525 affine.RotateDeg(-30);
2626 affine.Translate(ClientWidth/2, ClientHeight/2);
2727
2828 image.Fill(affine);
2929
3030 affine.free;
3131 grad.free;
3232
3333 image.Draw(Canvas,0,0,True);
3434 image.free;
3535end;
3636```
3737
3838El gradiente de base es radial, con centro en el origen (0,0), de radio 1.
3939
4040Las transformaciones afines hacen lo siguiente:
4141
4242- Tramo de la pendiente a un tamaño de 150x80
4343- Rotar 30 grados en dirección a la izquierda
4444- Centrar en la forma
4545
4646La instrucción Fill dibuja el resultado en la imagen.
4747
4848### Ejecuta el programa
4949
5050Usted debe obtener un gradiente de elipse azul y blanco.
5151
52-<figure>
53-<img src="BGRATutorial11a.png" title="BGRATutorial11a.png" />
54-<figcaption>BGRATutorial11a.png</figcaption>
55-</figure>
52+![](/wiki-images/a/a9/BGRATutorial11a.png)
5653
5754### Combinar con un giro
5855
5956Podemos agregar otra transformación de esta manera:
6057
6158``` pascal
6259var image: TBGRABitmap;
6360 grad: TBGRAGradientScanner;
6461 affine: TBGRAAffineScannerTransform;
6562 twirl: TBGRATwirlScanner;
6663begin
6764 image := TBGRABitmap.Create(ClientWidth,ClientHeight, BGRABlack );
6865
6966 grad := TBGRAGradientScanner.Create(BGRA(0,0,255),BGRAWhite,gtRadial,PointF(0,0),PointF(1,0),True,True);
7067
7168 affine := TBGRAAffineScannerTransform.Create(grad);
7269 affine.Scale(150,80);
7370 affine.RotateDeg(-30);
7471 affine.Translate(ClientWidth/2, ClientHeight/2);
7572
7673 twirl := TBGRATwirlScanner.Create(affine,Point(ClientWidth div 2, ClientHeight div 2),100);
7774 image.Fill(twirl);
7875 twirl.Free;
7976
8077 affine.free;
8178 grad.free;
8279
8380 image.Draw(Canvas,0,0,True);
8481 image.free;
8582end;
8683```
8784
8885En este sentido, basta con crear una transformación de giro aplicado a la anterior, y rellenar con ella.
8986
9087### Ejecuta el programa
9188
9289Ahora el centro del gradiente está girado.
9390
94-<figure>
95-<img src="BGRATutorial11b.png" title="BGRATutorial11b.png" />
96-<figcaption>BGRATutorial11b.png</figcaption>
97-</figure>
91+![](/wiki-images/b/b0/BGRATutorial11b.png)
9892
9993### Usar un escáner personalizado
10094
10195Es posible que desee crear un generador de gradientes. Aquí está por ejemplo, un gradiente multiplicador:
10296
10397``` pascal
10498type
10599 { TBGRAMultiplyScanner }
106100
107101 TBGRAMultiplyScanner = class(TBGRACustomScanner)
108102 function ScanAt(X, Y: Single): TBGRAPixel; override;
109103 end;
110104
111105{ TBGRAMultiplyScanner }
112106
113107function TBGRAMultiplyScanner.ScanAt(X, Y: Single): TBGRAPixel;
114108 function cycle512(value: integer): integer; inline;
115109 begin
116110 result := value and 511;
117111 if result >= 256 then result := 511-result;
118112 end;
119113
120114var
121115 mul: integer;
122116begin
123117 mul := cycle512(round(x*y));
124118 result := BGRA(mul,mul,mul,255);
125119end;
126120```
127121
128122Se deriva de TBGRACustomScanner para ser utilizados para el rellenado y la función ScanAt se anula. Calcula el producto de las dos coordenadas y hace un ciclo de 512 con él (de 0 a 255 y luego a partir de 255 a 0).
129123
130124Vamos a dibujar en la pantalla con una sencilla transformación afín:
131125
132126``` pascal
133127var image: TBGRABitmap;
134128 grad: TBGRAMultiplyScanner;
135129 affine: TBGRAAffineScannerTransform;
136130begin
137131 image := TBGRABitmap.Create(ClientWidth,ClientHeight, BGRABlack );
138132
139133 grad := TBGRAMultiplyScanner.Create;
140134 affine := TBGRAAffineScannerTransform.Create(grad);
141135 affine.Scale(6,4);
142136 affine.Translate(ClientWidth/2, ClientHeight/2);
143137 image.Fill(affine);
144138 affine.free;
145139 grad.free;
146140
147141 image.Draw(Canvas,0,0,True);
148142 image.free;
149143end;
150144```
151145
152146### Ejecuta el programa
153147
154148Debería verse como esto :
155149
156-<figure>
157-<img src="BGRATutorial11c.png" title="BGRATutorial11c.png" />
158-<figcaption>BGRATutorial11c.png</figcaption>
159-</figure>
150+![](/wiki-images/e/e0/BGRATutorial11c.png)
160151
161152### Que se vea hermoso
162153
163154Añade algunos colores modificando el procedimiento ScanAt del gradiente multiplicador :
164155
165156``` pascal
166157var
167158 mul: integer;
168159begin
169160 mul := round(x*y);
170161 result := BGRA(cycle512(round(x*10)),cycle512(mul),cycle512(round(y*10)),255);
171162end;
172163```
173164
174165Las intensidades de rojo y azul están llenos de un ciclo de las posiciones x e y.
175166
176167Y añade un poco de rotación:
177168
178169``` pascal
179170 affine := TBGRAAffineScannerTransform.Create(grad);
180171 affine.Scale(6,4);
181172 affine.RotateDeg(-30);
182173 affine.Translate(ClientWidth/2, ClientHeight/2);
183174```
184175
185-<figure>
186-<img src="BGRATutorial11d.png" title="BGRATutorial11d.png" />
187-<figcaption>BGRATutorial11d.png</figcaption>
188-</figure>
176+![](/wiki-images/e/e8/BGRATutorial11d.png)
189177
190178[[BGRABitmap tutorial 10/es|Tutoría anterior (mapeo de texturas)]] \| [[BGRABitmap tutorial 12/es|Siguiente tutoría (funciones de texto)]]
191179
192180---
193181*From the Free Pascal wiki, page "BGRABitmap tutorial 11/es", as it stood on 2020-02-09 after a change by Trev, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*
194182Category: Castellano
195183Category: Español

Back to history