![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вывода битмапа по маске и под углом [D7, XP]
Evgnevius © (2009-12-01 18:56:00)Подскажите, пожалуйста, как это делать, а то OpenGL для меня - тёмный лес, однако нужно именно с её помощью, так как очень важна скорость. С помощью средств GDI всё у меня получается прекрасно, однако тормозит. Помогите, кто знает как.
Evgnevius (2009-12-01 22:39:00) [41]вместо них используйте
Bmp.Canvas.Pixels[X, Y]
Andy BitOff (2009-12-01 22:37:00) [42]А это - PComp_GetPixel, PComp_PutPixel
Evgnevius (2009-12-01 22:36:00) [43]а, и вот ещё:
procedure CL_DecartToPhase_E(var Angle, Radius: Extended; X0, Y0, X, Y: Extended); stdcall;
begin
Radius := Sqrt(Sqr(X - X0) + Sqr(Y - Y0));
if Radius <> 0 then Angle := ArcCos((X - X0) / Radius) else
begin
Angle := 0;
Exit;
end;
if Y <= Y0 then Angle := 2 * Pi - Angle;
end;
Evgnevius (2009-12-01 22:34:00) [44]А вот ниже я привёл специфические функции, использованные в приведённой выше процедуре
type
CL_TColStructure = record
Color: TColor;
ColPart, GradPart: Real;
end;
CL_TColConstruction = array of CL_TColStructure;
procedure CL_RotateXY(var NewX, NewY: Integer; X, Y, X0, Y0: Integer; Angle: Real; R: Real = -1); stdcall;
var
A: Real;
begin
if R = -1 then R := Sqrt(Sqr(X - X0) + Sqr(Y - Y0));
if R <> 0 then
begin
A := ArcCos((X - X0) / R);
if Y > Y0 then
A := 2 * Pi - A;
A := A + Angle;
NewX := Round(X0 + R * Cos(A));
NewY := Round(Y0 + R * Sin(A));
end;
end;
var
A, A1, R: Extended;
function CL_GetSector(A0, CX, CY, X, Y: Extended; S: Word): Integer; stdcall;
begin
CL_DecartToPhase_E(A, R, CX, CY, X, Y);
A1 := A - A0;
if A1 >= 0 then A1 := A1 - Trunc(A1 / TwoPi) * TwoPi else A1 := A1 - (Trunc(A1 / TwoPi) - 1) * TwoPi;
Result := Trunc(A1 * S / TwoPi) + 1;
end;
function SimpleLinear(Cols: CL_TColConstruction; Len, Poz: Int64): TColor; stdcall;
var
L, N, P, TS: Integer;
S: Extended;
begin
L := Length(Cols);
S := Len / (L - 1);
if Poz > Len then Poz := Len;
N := Trunc(Poz / S);
P := Round(Poz - N * S);
TS := Trunc(S);
if P > TS then P := TS;
Result := Linear(Cols[N].Color, Cols[N + 1].Color, TS, P);
end;
function Linear(BC, EC: TColor; Len, Poz: Int64): TColor; stdcall;
begin
if Len = 0 then
begin
Result := BC;
Exit;
end;
if Poz < 0 then
begin
Result := BC;
Exit;
end else
if Poz > Len then
begin
Result := EC;
Exit;
end;
CL_GetRGB(BC, R1, G1, B1);
CL_GetRGB(EC, R2, G2, B2);
Rh := ((R2 - R1) * Poz) div Len;
Gh := ((G2 - G1) * Poz) div Len;
Bh := ((B2 - B1) * Poz) div Len;
R := R1 + Rh;
B := B1 + Bh;
G := G1 + Gh;
Result := RGB(R, G, B);
end;
Andy BitOff (2009-12-01 22:28:00) [45]> antonn © (01.12.09 21:29) [2]
=)
> Evgnevius © (01.12.09 18:56) [0]
Ага, покажи.
Evgnevius (2009-12-01 22:28:00) [46]
procedure DrawBar(Bmp: PBmp; Cols: CL_TColConstruction; XC, YC, Side: Integer; Angle: Extended); stdcall;
var
I, J, W2, X, Y, K, L, XI, YJ: Integer;
Poz, Len: Int64;
Tmp: TBmp;
begin
Tmp := TBmp.Create;
Tmp.Assign(Bmp^);
with Bmp^ do
begin
K := 2;
Side := Side * K;
XC := XC * K;
YC := YC * K;
Len := Side * K * 10;
W2 := Side div 2;
L := Length(Cols) - 1;
for I := 0 to Side do
for J := 0 to Side do
begin
CL_RotateXY(X, Y, I + XC - W2, J + YC - W2, XC, YC, Angle);
case CL_GetSector(Pi / 4, W2, W2, I, J, 4) of
2, 4: Poz := 40 * Abs(W2 - I);
1, 3: Poz := 40 * Abs(W2 - J);
end;
XI := X div K;
YJ := Y div K;
Cols[L].Color := PComp_GetPixel(@Tmp, XI, YJ);
PComp_PutPixel(Bmp, XI, YJ, SimpleLinear(Cols, Len, Poz));
end;
end;
Tmp.Free;
end;
antonn (2009-12-01 21:29:00) [47]
> С помощью средств GDI всё у меня получается прекрасно, однако
> тормозит.
покажи код
Evgnevius (2009-12-01 20:39:00) [48]Само наличие маски не обязательно, хотя создать чёрно-белую маску с градиентом для меня не проблема - главное, чтобы часть точек битмапа выводилась с заданной прозрачностью по отношению к фону.