| Autor |
Beitrag |
Tweafis
      
Beiträge: 647
WinXP + fbsd
Delphi 5 Prof
|
Verfasst: Di 01.07.03 20:38
Mit folgendem code zeichne ich z.Z. einen Verlauf:
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; 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
      
Beiträge: 896
Win XP, Suse 8.1
Delphi 4/7/8 alles prof
|
Verfasst: 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 
      
Beiträge: 647
WinXP + fbsd
Delphi 5 Prof
|
Verfasst: 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 
      
Beiträge: 647
WinXP + fbsd
Delphi 5 Prof
|
Verfasst: Mi 02.07.03 17:08
Wegen dem Zuweisen bei Scanline:
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
      
Beiträge: 896
Win XP, Suse 8.1
Delphi 4/7/8 alles prof
|
Verfasst: 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 
_________________ mfg.
mâximôv
|
|
Tweafis 
      
Beiträge: 647
WinXP + fbsd
Delphi 5 Prof
|
Verfasst: 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
      
Beiträge: 896
Win XP, Suse 8.1
Delphi 4/7/8 alles prof
|
Verfasst: 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 
      
Beiträge: 647
WinXP + fbsd
Delphi 5 Prof
|
Verfasst: Mi 02.07.03 20:33
Ich hab das jetzt mal so probiert:
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 2) or (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 
      
Beiträge: 647
WinXP + fbsd
Delphi 5 Prof
|
Verfasst: 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  |
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 :.
|
|