Deutsch
Forum

XPSE: Linie auf Bitmap zeichnen

 
- Seite 1 -



Andreas
Koch
Hallo zusammen,

es gibt mal wieder ein Problem, bei dem ich nicht weiterkomme. Es geht darum, das Zeichnen eines Graphen auf eine Bitmap zu beschleunigen. Dabei geht es erst einmal nur um aneinander hängende Linien und ich würde das Ganze gerne mit XPSE angehen.
Dabei stehe ich nun vor zwei Problemen.

1. XPSE kennt nur den Befehl Setpixel, Frage: kennt jemand einen API-Befehl, mit dem man eine Linie zeichnen kann? Einstellungsmöglichkeiten von Farbe, Start- und Endpunkt sowie Linienstärke wären nötig.
2. XPSE zeichnet grundsätzlich erst einmal nur auf dem Hauptfenster. Kann man das Zeichnen irgendwie auf eine Bitmap umleiten?

Zu 1.: das kann ich mir wahrscheinlich auch noch selbst basteln, der API-Befehl würde das Ganze nur vereinfachen.

Zu 2. habe ich versucht, mir etwas aus der nProc drawhPicRotated zu ziehen, was diese Funktion zu haben scheint, klappt aber nicht so ganz....
KompilierenMarkierenSeparieren
 {$cleq}
 $I Pixels.Inc
Window 0,0 - %Maxx, %Maxy
var hPic&=create("hNewPic",400,400,$FF)
StartPaint hPic&
UseFont "Arial",30,0,1,0,0
textcolor $FFFF,-1
drawtext 5,0,"XProfan.Com"
textcolor $AA,-1
drawtext 5,0,"XProfan"
EndPaint
DrawPic hPic&,0,0,0

nproc Test

    Parameters hPic&
    long hDCBits=CreateCompatibleDC(hDC)
    selectObject(hDCBits, hPic&)

    WhileLoop 50

        SetPixel(hDCBits,50+&loop,50,0)

    EndWhile

EndProc

Test(hPic&)
DrawPic hPic&,500,0,0
WaitInput

Wäre prima, wenn ihr mir da weiterhelfen könntet.

Schönen Gruß

Andreas Koch
 
05.09.2012  
 



« Dieser Beitrag wurde als Lösung gekennzeichnet. »

- Seite 2 -


Sagen wir einfach weil da etwas "geschludert" wurde.

(habe die Stellen im Code markiert)
KompilierenMarkierenSeparieren
 {$cleq}
Window 0,0 - %Maxx, %Maxy
var hPic&=create("hNewPic",400,400,$FF)
StartPaint hPic&
UseFont "Arial",30,0,1,0,0
textcolor $FFFF,-1
drawtext 5,0,"XProfan.Com"
textcolor $AA,-1
drawtext 5,0,"XProfan"
EndPaint
DrawPic hPic&,0,0;0// <-- statt DrawPic hPic&,0,0,0
Test(hPic&)
DrawPic hPic&,500,0;0// <-- statt DrawPic hPic&,500,0,0
WaitInput

nproc Test

    Parameters hPic&
    long hDCBits=CreateCompatibleDC(hDC)
    selectObject(hDCBits, hPic&)

    WhileLoop 50

        SetPixel(hDCBits,50+&loop,50,0)

    EndWhile

    deleteDC(hDCBits)// <-- vergessen, eigentlicher Knackpunkt

EndProc



5 kB
Hochgeladen:05.09.2012
Ladeanzahl106
Herunterladen
 
05.09.2012  
 



 
- Seite 1 -


Was macht ihr denn hier?! Alles viel einfacher!

Ein Rechteck: [...] 

Auf hWnd zeichen einfach so:
KompilierenMarkierenSeparieren
nProc test

    rectangle(hDC,10,10,100,100)

endproc


Linie oder Kurven gewünscht? Dann einfach Linien oder Kurvenfunktionen nutzen!

Alle beschrieben und einfach aufzurufen: [...] 

Danach geht ne Linie von 20,30 nach 100,100 so:
KompilierenMarkierenSeparieren
nProc test

    MoveToEx(hDC,20,30,0)
    LineTo(hDC,100,100)

endproc


In nProcs stehen quasi alle APIs bereit -

da kann es einem ja an garnichts fehlen.

Einzelnes Pixel setzen?
KompilierenMarkierenSeparieren
nProc test

    setPixel(hDC,10,20,rgb(50,60,70))
    ...
 
05.09.2012  
 




Andreas
Koch
Das sieht jetzt so aus, als könnte ich das direkt benutzen. Schönen Dank schon mal.

Ich möchte aber wirklich nur sehr ungern auf dem Hauptfenster malen, eigentlich gar nicht. Kann man das nicht irgendwie umleiten? Ich habe da dieses hdc im Verdacht, weiß aber nicht wirklich etwas damit anzufangen, siehe erster Beitrag.

PS: Was bedeutet das DC eigentlich in lang?
 
05.09.2012  
 



DeviceContext ( [...]  )

Du kannst genau so gut auf einem "hPic" malen -

das ginge dann z.B. so:
KompilierenMarkierenSeparieren
nProc test

    parameters aufDiesemHPic&//siehe create("hNewPic",... in XProfan-Hilfe
    var dc&=createCompatibleDC(hDC)// hDC ist von XProfan, siehe XProfan-Hilfe
    selectObject(dc&, aufDiesemHPic&)
    //rummalen

    whileLoop 1000

        setPixel(dc&,rnd(100),rnd(100),rnd($FFFFFF))

    wend

    //dc wieder entfernen da nicht mehr notwendig
    deleteDC(dc&)
    //fertig auf hPic rumgemalt

endproc

 
05.09.2012  
 



Nachtrag: Gib auch ne pixels.inc [...]  für Beispiele schneller Grafik- Effekte

und eine hPic.inc auch für fortgeschrittenes Rumbildereihen: [...] 

und schau auch mal hier rein: [...] 
 
05.09.2012  
 



 
- Seite 2 -



funkheld
Hmm.., was du meinst sind ja auch wieder die langsamen internen Grafik-Windowsbefehle(API):
MoveToEx(hDC,20,30,0)
LineTo(hDC,100,100)
Für ein flotte Grafik taugen die nichts.

Es geht doch direkt viel schneller mit (DirectX) und/oder mit XPIA(ASM) ohne diese fertigen langsamen Move und LineTo.

Gruss
 
05.09.2012  
 



LineTo etc. ist alles GDI ( [...]  ) -

sind alles hochoptimierte Funktionen die Du wohl selbst (egal wo mit) nicht schneller

programmieren kannst. Natürlich kannst Du eine Linie auch per DX zeichnen aber das

ist ja eine komplett andere Nummer ähnlich wie als wenn Du eine Linie per OpenGL

zeichest. Bei letzteren beiden Beispielen wirst Du aber auch mindestens einmal eine

Linie anweisen müssen. Siehe hierzu die oglui [...]  samt oglhelper.inc.

Was nun performanter ist hängt streng genommen zu sehr vom jeweiligen Anwendungs/

Einzelfall ab und ganz pauschal kann man nicht sagen das man mit DX eine

Linie schneller auf den Schirm bekommt als mit der GDI alleine schon wegen

der enormen Vorbereitungsmassnahmen die für DX oder OGL notwendig sind

bevor man überhaupt was zeichnen kann.
 
05.09.2012  
 



Nachtrag: Mein nicht so schneller Computer zeichnet damit 100.000 Linien in weniger als 1 Sekunde (953ms) :
KompilierenMarkierenSeparieren


Was ich jetzt nicht unbedingt "langsame interne Grafik-Windowsbefehle(API)" nennen würde

aber Du hast schon Recht damit das es einen auch nicht "vom Hocker haut".

16 kB
Hochgeladen:05.09.2012
Ladeanzahl200
Herunterladen
 
05.09.2012  
 




Andreas
Koch
Das mit der pixels.inc und Anhang hatte ich schon rausgefunden und auch in meinem Beispielcode oben eingebaut. Wenn ich das richtig sehe, habe ich sogar die Umleitung mit createcompatibledc richtig gemacht. Trotzdem malt der nicht richtig.

PS: DirectX hört sich zwar auch cool an, aber hey Leute, vor einem Jahr hatte ich das Wort "Profan" noch nie gehört, so schnell bin ich nicht.
Wenn mir das was bringt, mache ich das aber auch noch.
Vorher wollte ich aber eigentlich noch OpenGL ausloten. Vielleicht reicht das für meine Bedürfnisse aus.
 
05.09.2012  
 



Ich weiß zwar nicht was genau Du vor hast aber zu "Trotzdem malt der nicht richtig."
kann ich nur sagen "Zeig mal her, der Fehler liegt wo anders...".

Andreas Koch (05.09.12)

aber hey Leute, vor einem Jahr hatte ich das Wort "Profan" noch nie gehört, so schnell bin ich nicht.


Willkommen!
 
05.09.2012  
 




Andreas
Koch
Ich hab in meinem ersten Beitrag einen Beispielcode, wo auf eine Bitmap eigentlich eine schwarze Linie gemalt werden sollte. Die vermiss ich irgendwie....
 
05.09.2012  
 



Sagen wir einfach weil da etwas "geschludert" wurde.

(habe die Stellen im Code markiert)
KompilierenMarkierenSeparieren
 {$cleq}
Window 0,0 - %Maxx, %Maxy
var hPic&=create("hNewPic",400,400,$FF)
StartPaint hPic&
UseFont "Arial",30,0,1,0,0
textcolor $FFFF,-1
drawtext 5,0,"XProfan.Com"
textcolor $AA,-1
drawtext 5,0,"XProfan"
EndPaint
DrawPic hPic&,0,0;0// <-- statt DrawPic hPic&,0,0,0
Test(hPic&)
DrawPic hPic&,500,0;0// <-- statt DrawPic hPic&,500,0,0
WaitInput

nproc Test

    Parameters hPic&
    long hDCBits=CreateCompatibleDC(hDC)
    selectObject(hDCBits, hPic&)

    WhileLoop 50

        SetPixel(hDCBits,50+&loop,50,0)

    EndWhile

    deleteDC(hDCBits)// <-- vergessen, eigentlicher Knackpunkt

EndProc



5 kB
Hochgeladen:05.09.2012
Ladeanzahl106
Herunterladen
 
05.09.2012  
 




Andreas
Koch
Ok, wieder was gelernt. Danke, damit kann ich weitermachen.
 
05.09.2012  
 




Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

15.410 Betrachtungen

Unbenanntvor 0 min.
Rainer Hoefs03.05.2019
Walter Köhler21.09.2018
Andreas Koch08.09.2015
iF12.04.2015
Mehr...

Themeninformationen



Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie