 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Caran

Anmeldungsdatum: 11.03.2007 Beiträge: 290 Wohnort: Lörrach
|
Verfasst am: 29.05.2007, 17:42 Titel: Point im RGB-Format |
|
|
Hi Leute,
ich hab da mal 'ne Frage...
Wie kann ich einen Wert (den ich mit Point ermittelt habe) auf drei Variablen (z.B.: r, g, b) aufteilen, sodass jeder Variable ein Farbwert zugeteilt wird.
Grüße Caran |
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 29.05.2007, 18:58 Titel: |
|
|
Ich hatte das mal so gelöst...
Code: |
Farbe=Point(x,y)
R=Fix(Farbe/&H010000) : Farbe -= R*&h010000
G=Fix(Farbe/&H000100) : Farbe -= G*&h000100
B=Fix(Farbe/&H000001) : Farbe -= B*&h000001
'jetzt hat Farbe den wert 0 und ist in den variablen R,G,B aufgeteilt
'am ende könnte man auch einfach B=Farbe machen
|
_________________
 |
|
Nach oben |
|
 |
Caran

Anmeldungsdatum: 11.03.2007 Beiträge: 290 Wohnort: Lörrach
|
Verfasst am: 29.05.2007, 19:56 Titel: |
|
|
Hi Eternal_pain,
da wär ich nich drauf gekommen, danke.MfG Caran |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 30.05.2007, 20:14 Titel: |
|
|
etwas schneller, wenn du das öfter machen musst.
Code: | Farbe = Point(x, y)
R = (Farbe And &HFF0000) shr 16
G = (Farbe And &H00FF00) shr 8
B = (Farbe And &H0000FF) |
_________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 30.05.2007, 20:49 Titel: |
|
|
Eine schöne und einfache Methode, darauf muss man auch erstmal kommen.
Edit:
Hab beide jetzt mal mit Timer getestet und wundere mich etwas das meine Mothode in den meisten fällen etwas schneller war als die andere.... _________________
 |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 31.05.2007, 17:28 Titel: |
|
|
ne, die Routine ohne Division und Multiplikation ist bestimmt 10-15mal schneller. Man kann deine Routine aber noch optimieren, siehe Listing.
Wie immer sind aber Pointeraktionen die schnellste Lösung.
Code: | '-------CPU-Takte zählen
#include once "windows.bi"
Const _COUNTER_LOOP_COUNT_ = 2000
Dim Shared As Ulongint _counter_tsc1_, _counter_tsc2_
Dim Shared As Ulongint _counter_overhead_, counter_cycles
Dim Shared As Uint _counter_loop_counter_
Sub _counter_code1_
Asm
Xor eax, eax
cpuid
rdtsc
mov [_counter_tsc1_], eax
mov [_counter_tsc1_+4], edx
End Asm
End Sub
Sub _counter_code2_
Asm
Xor eax, eax
cpuid
rdtsc
mov [_counter_tsc2_], eax
mov [_counter_tsc2_+4], edx
End Asm
End Sub
#define COUNTER_BEGIN _
_counter_overhead_ = 2000000000 :_
counter_cycles = 2000000000 :_
SetPriorityClass( GetCurrentProcess(), HIGH_PRIORITY_CLASS ) :_
For _counter_loop_counter_ = 1 To _COUNTER_LOOP_COUNT_ :_
_counter_code1_ :_
_counter_code2_ :_
If (_counter_tsc2_ - _counter_tsc1_) < _counter_overhead_ Then :_
_counter_overhead_ = _counter_tsc2_ - _counter_tsc1_ :_
Endif :_
Next :_
For _counter_loop_counter_ = 1 To _COUNTER_LOOP_COUNT_ :_
_counter_code1_
' *** Note the open FOR loop ***
#define COUNTER_END _
_counter_code2_ :_
If (_counter_tsc2_ - _counter_tsc1_) < counter_cycles Then :_
counter_cycles = _counter_tsc2_ - _counter_tsc1_ :_
Endif :_
Next :_
SetPriorityClass( GetCurrentProcess(), NORMAL_PRIORITY_CLASS ) :_
counter_cycles -= _counter_overhead_
'------------CPU-Takte
Dim As Integer R,G,B,Farbe, x= 350, y= 100
Screen 18,32
Pset (x,y),Rgb(100,200,230)
?"von wegen ist schneller .. haha"
Farbe=Point(x,y)
counter_begin
R=Fix(Farbe/&H010000) : Farbe -= R*&h010000
G=Fix(Farbe/&H000100) : Farbe -= G*&h000100
B=Farbe
counter_end
Print "Eternal_pain : ";counter_cycles;" CPU - Takte"
Farbe=Point(x,y)
counter_begin
R = (Farbe And &HFF0000) Shr 16
G = (Farbe And &H00FF00) Shr 8
B = (Farbe And &H0000FF)
counter_end
Print "Volta : ";counter_cycles;" CPU - Takte"
?
?"etwas optimiert sieht es schon besser aus.."
counter_begin
Farbe=Point(x,y)
R=Farbe \ &H010000 : Farbe -= R*&h010000
G=Farbe \ &H000100 : Farbe -= G*&h000100
B=Farbe
counter_end
Print "E_p optimiert : ";counter_cycles;" CPU - Takte"
counter_begin
Farbe=Point(x,y)
R = (Farbe And &HFF0000) Shr 16
G = (Farbe And &H00FF00) Shr 8
B = (Farbe And &H0000FF)
counter_end
Print "Volta : ";counter_cycles;" CPU - Takte"
?
?" .. aber mit etwas Pointertechnik .. unschlagbar."
Dim As Integer pitch
Dim p As Ubyte Ptr
Screeninfo ,,,,pitch
counter_begin
p = Screenptr + (pitch * y) +(x * 4)
R = p[2]
G = p[1]
B = p[0]
counter_end
Print "Volta Pointer: ";counter_cycles;" CPU - Takte"
?
Print R,G,B
Sleep
End |
_________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
Caran

Anmeldungsdatum: 11.03.2007 Beiträge: 290 Wohnort: Lörrach
|
Verfasst am: 01.06.2007, 13:54 Titel: |
|
|
Hey coole Sache, danke an euch alle.
MfG Caran |
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 02.06.2007, 04:33 Titel: |
|
|
Das mit der Pointertechnik ist natürlich hammer,
wenn ich sowas damals gewusst hätte, hätte ich mir vermutlich nicht 'n halben Tag den kopf zerbrochen wie man das machen könnt um dann doch nur auf eine so langsame methode zu kommen  _________________
 |
|
Nach oben |
|
 |
Apfel
Anmeldungsdatum: 01.07.2008 Beiträge: 13
|
Verfasst am: 19.04.2009, 16:51 Titel: Point buffer farblich machen und verwenden. |
|
|
Hallo, ich habe hier ein Code Beispiel. Wo man ein Punkt mit Pfeiltasten steuert kann und die Idee ist es dass mit diesem Punkt mittels Point die Farbe abgefragt wird und im bufer gespeichert wird.
Das klappt auch recht gut.
Code: | ScreenRes 600,600,32
DIM AS String Punkt
DIM AS String Wand
DIM AS Integer x = 300
DIM AS INTEGER y = 300
Dim As Integer bufer
Dim PunktFenster AS ANY Ptr
Dim WandFenster As Any Ptr
Dim FarbAnzeiger As Any Ptr
PunktFenster = ImageCreate(9,9,RGB(0,255,0))
WandFenster = IMAGECREATE(82,29,RGB(0,0,255))
BLOAD Punkt, PunktFenster
BLoad Wand, WandFenster
Do
If MULTIKEY(&h4D) And x < 591 THEN x += 1
IF MULTIKEY(&h4B) AND x > 1 THEN x -= 1
IF MULTIKEY(&h50) AND y < 591 THEN y += 1
IF MULTIKEY(&h48) AND y > 1 THEN y -= 1
ScreenLock
Cls
Put(x,y), PunktFenster, PSet
Put(100,200), WandFenster, PSet
Put(200,100), FarbAnzeiger, PSet
bufer = point(x,y)
Print bufer
FarbAnzeiger = IMAGECREATE(32,32,RGB(255,0,0))
ScreenUnLock
Sleep 3
Loop
Sleep |
Als nächstes wollte ich, das ein kleiner Viereck namens „FarbAnzeiger“ mit Hilfe Point bufer gefärbt wird. Und da habe ich keine Ahnung wie man das macht. Kann mir jemand ein Beispiel zeigen. Danke. |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 19.04.2009, 17:00 Titel: |
|
|
Der Thread ist schon 2 Jahre alt...  _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 19.04.2009, 19:29 Titel: |
|
|
na ja,
Code: | ScreenRes 600,600,32
Dim As Integer x = 300
Dim As Integer y = 300
Dim PunktFenster As Any Ptr
Dim WandFenster As Any Ptr
Dim FarbAnzeiger As Any Ptr
PunktFenster = ImageCreate(9,9,RGB(0,255,0))
WandFenster = ImageCreate(82,29,RGB(0,0,255))
FarbAnzeiger = ImageCreate(32,32)
Do
If MultiKey(&h4D) And x < 591 Then x += 1
If MultiKey(&h4B) And x > 1 Then x -= 1
If MultiKey(&h50) And y < 591 Then y += 1
If MultiKey(&h48) And y > 1 Then y -= 1
ScreenLock
Cls
Put(100,200), WandFenster, PSet
'eine ausgefüllte Box in das Image "FarbAnzeiger" zeichnen
'Line FarbAnzeiger, (0,0)-(32,32), Point(x,y), BF 'und
'Put(200,100), FarbAnzeiger, PSet
'oder direkt zeichen
Line (200,100)-(232,132), Point(x,y), BF
Put(x,y), PunktFenster, PSet
ScreenUnLock
Sleep 1
Loop Until InKey=Chr(27)
|
_________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
Verfasst am: 19.04.2009, 19:32 Titel: |
|
|
Da frage ich mich spontan: Wo ist eigentlich eternal_pain geblieben? |
|
Nach oben |
|
 |
Apfel
Anmeldungsdatum: 01.07.2008 Beiträge: 13
|
Verfasst am: 19.04.2009, 19:41 Titel: |
|
|
Geeeeeenau so habs ich mir vorgestellt, echt danke Volta.  |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|