Autor Beitrag
Tweafis
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 647

WinXP + fbsd
Delphi 5 Prof
BeitragVerfasst: Di 01.07.03 20:38 
Mit folgendem code zeichne ich z.Z. einen Verlauf:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
    while rx < GradLen do begin
      awinkel := 0;
      repeat
        ar := round(sr+uspsr*rx);
        ag := round(sg+uspsg*rx);
        ab := round(sb+uspsb*rx);

        ax := round(GradRect.Left+GradLen+(cos(degtorad(awinkel)) * rx));
        ay := round(GradRect.Top+GradLen+(sin(degtorad(awinkel)) * rx));

        Pixels[ax,ay] := RGB(ar, ag, ab);
        awinkel := awinkel+0.2// Diese Zeile, s.u.
      until awinkel >= 360;
      rx := rx+1;
    end;



(Die berechnungen sind ja egal, es geht ja um die Lücken)
Aber das so extrem Langsam... Ich muss die Inkrementierung von awinkel jedoch realtiv zu rx machen, je größer rx (je weiter außen), desto kleiner muss das (?) Inkrement sein. also am Anfang reicht 5, später 0.1. Hab schon ausprobiert, find aber nicht raus wie ich das berechnen soll :(.

GradRect ist das Rechteck in dem der Verlauf stattfindet, GradLen hier der Radius. Ist auch alles richgit berechnet (von der Größe her), nur es gibt halt lücken wenn ich die Inkrementierung von awinkel zu groß, geschwindigkeitsreduktion, wenn ich zu langsam stelle...

Mir reicht auch nur ein Ansatz :)

_________________
.: Es wird der Tag kommen, an dem wir es nicht mehr ändern können :.
maximus
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 896

Win XP, Suse 8.1
Delphi 4/7/8 alles prof
BeitragVerfasst: Di 01.07.03 22:29 
Ein ansatz wäre: Du mahlst das gesammte rechteck, zeile für zeile, und berechnest den verlauf aus dem abstand zum mittelpunkt. So würde keine pixel frei bleiben.

PS: mit scanLine würde es sau schnell werden.

_________________
mfg.
mâximôv
Tweafis Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 647

WinXP + fbsd
Delphi 5 Prof
BeitragVerfasst: Mi 02.07.03 16:44 
Soweit ich weiß kann man mit Scanline doch nicht zuweisen, oder?

Werde dann mal machen, aber ich weiß jetzt nicht genau wie ich z.B. rausfinde welchen winkel und radius z.b. 5,5 von 17,19 hat... Außerdem soll es ja nur da zeichnen wo auch wirklich der Kreis ist...

_________________
.: Es wird der Tag kommen, an dem wir es nicht mehr ändern können :.
Tweafis Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 647

WinXP + fbsd
Delphi 5 Prof
BeitragVerfasst: Mi 02.07.03 17:08 
Wegen dem Zuweisen bei Scanline:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
procedure TForm1.PBClick(Sender: TObject);
var
  x,y: Integer;
  Bmap: TBitmap;
  P: PByteArray;
begin
  BMap := TBitmap.Create;
  BMap.Height := PB.Height;
  BMap.Width := PB.Width;

  try
    for y := 0 to PB.Height-1 do begin
     P := BMap.ScanLine[y];
      for x := 0 to PB.Width-1 do
        P[x] := RGB(random(255),random(255),random(255));
    end;

    PB.Canvas.CopyRect(BMap.Canvas.ClipRect, Bmap.Canvas, PB.ClientRect);
  finally
    BMap.Free;
  end;
end;


PB ist eine Paintbox.

wenn ich beim zuweisen P[x] durch BMap.Canvas.Pixels[x,y] ersetze funktioniert es...

_________________
.: Es wird der Tag kommen, an dem wir es nicht mehr ändern können :.
maximus
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 896

Win XP, Suse 8.1
Delphi 4/7/8 alles prof
BeitragVerfasst: Mi 02.07.03 17:10 
Doch...mit scanLine hast du vollen, direkten zugriff auf den speicher (beachte byte per pixel etc).

Wenn du nur im kreis zeichnen willst, dann zeich nur wenn abstand zum mittelpunk kleiner, als dein gewünschter radius ist.

den radius kannst du easy mit pythagoras ermitteln:

p := aktuelle-pos;
m := mittel-pos;

r := SQRT((m.x-p.x)*(m.x-p.x) + (m.y-p.y)*(m.y-p.y));

mit dem winkel musste du halt'n bisschen basteln -> RAD -> Quadranten etc.

viel glück


PS: seh grad dein neues posting: Du hast ja ein byte array, deine pixel haben aber 3 oder 4 byte! Also bytes per pixel ermitteln (steht irgendwo) und dann jede farb-komponente in ein eigenes byte mahlen :wink:

_________________
mfg.
mâximôv
Tweafis Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 647

WinXP + fbsd
Delphi 5 Prof
BeitragVerfasst: Mi 02.07.03 17:24 
Hey, thx :)

funzt echt gut, geht v.a. viel schneller :)
Aber das mit Scanline geht irgendwie garnicht...

muss ich da direkt die Bytes reinschreiben und nicht ein TColor???

_________________
.: Es wird der Tag kommen, an dem wir es nicht mehr ändern können :.
maximus
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 896

Win XP, Suse 8.1
Delphi 4/7/8 alles prof
BeitragVerfasst: Mi 02.07.03 17:51 
Îm prizip JA...genau.

Wenn du 32 bit pro pixel hast (also 4 byte), dann könntest du auch ein Array od DWord nehmen und die Tcolors direkt rein tun (theoretisch).

irgendwo bekommst das PixelFormat -> Bmap.PixelFormat

_________________
mfg.
mâximôv
Tweafis Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 647

WinXP + fbsd
Delphi 5 Prof
BeitragVerfasst: Mi 02.07.03 20:33 
Ich hab das jetzt mal so probiert:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
procedure TForm1.FormShow(Sender: TObject);
var
  x,y: Integer;
  ABMP: TBitmap;
  P: PByteArray;
  r,g,b: Byte;

begin
  ABMP := TBitmap.Create;
  ABMP.Width := 100;
  ABMP.Height := 100;
  for y := 0 to ABMP.Height-1 do begin
    P := ABMP.ScanLine[y];
    for x := 0 to ABMP.Width-1 do begin
      r:=255; g:=50; b:=10;
      P[x]:=r or (g shl 2or (b shl 4);
    end;
  end;
  Canvas.Draw(0,0,ABMP);
  ABMP.Free;
end;


Geht aber auch net :(

Hab auch schon mit shl 1 und shl 2 probiert :(

_________________
.: Es wird der Tag kommen, an dem wir es nicht mehr ändern können :.
Tweafis Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 647

WinXP + fbsd
Delphi 5 Prof
BeitragVerfasst: Fr 04.07.03 23:05 
maximus hat folgendes geschrieben:
Doch...mit scanLine hast du vollen, direkten zugriff auf den speicher (beachte byte per pixel etc).

Wenn du nur im kreis zeichnen willst, dann zeich nur wenn abstand zum mittelpunk kleiner, als dein gewünschter radius ist.

den radius kannst du easy mit pythagoras ermitteln:

p := aktuelle-pos;
m := mittel-pos;

r := SQRT((m.x-p.x)*(m.x-p.x) + (m.y-p.y)*(m.y-p.y));

mit dem winkel musste du halt'n bisschen basteln -> RAD -> Quadranten etc.

viel glück


PS: seh grad dein neues posting: Du hast ja ein byte array, deine pixel haben aber 3 oder 4 byte! Also bytes per pixel ermitteln (steht irgendwo) und dann jede farb-komponente in ein eigenes byte mahlen :wink:


Falls mir noch jemand sagen kann wie man auch den winkel rausbekommt wäre das sehr nett. Ich muss das ganze ja auch mit ellipsen machen. Irgendeine Idee deswegen?

_________________
.: Es wird der Tag kommen, an dem wir es nicht mehr ändern können :.