Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вывода битмапа по маске и под углом [D7, XP]


Страницы:   1 2 3

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]

Само наличие маски не обязательно, хотя создать чёрно-белую маску с градиентом для меня не проблема - главное, чтобы часть точек битмапа выводилась с заданной прозрачностью по отношению к фону.


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо