 |
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 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 15.07.2014, 09:13 Titel: |
|
|
Am Rande ... nach eigener erfahrung ist ein
deutlich schneller als ein
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ]
Zuletzt bearbeitet von ThePuppetMaster am 15.07.2014, 10:00, insgesamt einmal bearbeitet |
|
Nach oben |
|
 |
Muttonhead

Anmeldungsdatum: 26.08.2008 Beiträge: 565 Wohnort: Jüterbog
|
Verfasst am: 15.07.2014, 09:33 Titel: |
|
|
... und meistens andere Ergebnisse liefert als
Mutton  |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 15.07.2014, 10:00 Titel: |
|
|
ups. verschrieben *g* .. THX @mutton
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 15.07.2014, 11:12 Titel: |
|
|
grindstone hat Folgendes geschrieben: | Bei mir läuft die "Integer"-Version sogar ca. 25% langsamer als die "Single"-Version (0,15s : 0,19s für einmal Rendern). Sehr seltsam!
Gruß
grindstone |
Integer-zu-Float-Konvertierungen sind langsam. Oft sehr viel langsamer als direkt durchgängig in Float zu rechnen. _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1280 Wohnort: Ruhrpott
|
Verfasst am: 15.07.2014, 13:17 Titel: |
|
|
@Jojo: Ja, das leuchtet ein. Zumal ich wahrscheinlich auch nicht alles sauber umgestellt habe.
Ich hatte über Sonntag auch ein Programm für eine beliebige Anzahl von Kreisen geschrieben, mit einem anderen Lösungsansatz, nämlich klassisch mit Sinus und Cosinus, aber nachdem ich dreaels Regenbogenkreise gesehen hatte, habe ich mich nicht mehr getraut, meine armseligen Kringel zu posten.
Inzwischen habe ich das Ganze ein wenig gepimpt, geschwindigkeitsoptimiert und (zur besseren Vergleichbarkeit) dreaels Kreise als Ausgangsmaterial übernommen. Es bringt (fast) dasselbe Resultat, ist dabei aber etwa doppelt so schnell (0,194 : 0,098 Sekunden). Code: | Type Kreis
x As Integer
y As Integer
r As Integer
End Type
Const pi As Double = ACos(0)*2
Const pi2 As Double = 2 * pi
Function Quad(s As Integer) As Integer
Return s * s
End Function
Dim As Integer i,j,z,xp,yp,punkt
Dim As Double w,zeitmerken
Dim f(1 To ...) As Integer => { 0, 2, 3, 9, 13, 4 }
Dim k(1 To ...) As kreis => { (125, 130, 60), (240, 175, 65), (412, 176, 125), _
(375, 320, 60), (260, 350, 65), (170, 328, 55), (98, 245, 75) }
Dim As Integer p(UBound(k))
ScreenRes 640,480
For rx As Integer = 1 To UBound(k) 'radien korrigieren
k(rx).r -= 5
Next
zeitmerken = Timer
For zae As Integer = 1 To UBound(f) 'alle farben
For st As Integer = 1 To 5 'streifenbreite
For i = 1 To UBound(k) 'alle kreise abarbeiten
'prüfen, welche kreise sich überschneiden
z = 0
For j = 1 To UBound(k)
If i <> j Then
If (Quad(k(i).x - k(j).x) + Quad(k(i).y - k(j).y)) < (Quad(k(i).r + k(j).r)) Then 'kreise überschneiden sich
z += 1
p(z) = j 'index des kreises in liste schreiben
EndIf
EndIf
Next
If z = 0 Then 'keine überschneidung --> vollkreis zeichnen
Circle (k(i).x,k(i).y),k(i).r,f(zae)
Else 'kreisbogen zeichnen
For w = 0 To pi2 Step 1/(k(i).r * 2 ) 'schrittweite so wählen, daß eine geschlossene linie entsteht
xp = k(i).x + Cos(w) * k(i).r 'kreispunktkoordinaten
yp = k(i).y + Sin(w) * k(i).r
punkt = 1 'flag für "punkt setzen"
For j = 1 To z 'alle überschneidenden kreise
If Quad(xp - k(p(j)).x) + Quad(yp - k(p(j)).y) < Quad(k(p(j)).r) Then 'abstand vom mittelpunkt ist kleiner als der radius
punkt = 0 'punkt nicht setzen
Exit For 'prüfung abbrechen
EndIf
Next
If punkt Then
PSet(xp,yp),f(zae) 'punkt setzen
EndIf
Next
EndIf
Next
For rx As Integer = 1 To UBound(k) 'nächster radius
k(rx).r += 1
Next
Next
Next
Print "zeit ";Timer - zeitmerken
Sleep
| Die Arbeitsgeschwindigkeit dieses Programms hängt wahrscheinlich sehr viel stärker als dreaels Version vom Ausgangsmaterial ab.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 15.07.2014, 14:24 Titel: |
|
|
Zitat: | PS. Nemored, die gleitkommazahl würde dann für den timer dienen right? |
Wenn sich ein Objekt fließend von A nach B bewegen soll, wäre eine pixelgenaue Bewegung in aller Regel zu ungenau, weil dann ständig ungünstig gerundet wird. Da würde man dann entweder mit einer höheren Auflösung rechnen als man zeichnet, oder man rechnet gleich mit Gleitkommawerten. Wenn die Bewegungsbahn bekannt ist und sich nicht (z. B. durch Kollision) ändert, kann man natürlich auch immer direkt vom Startwert aus berechnen. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 15.07.2014, 15:58 Titel: |
|
|
Die Billard-Simulation aus meiner Sammlung verwendet übrigens auch bereits ein fliesskomma-basiertes Rendern für die Kugeln.
Gerade in der recht groben SCREEN 7-Auflösung (nur 320x200) macht dies noch recht viel aus! In FreeBasic könnte das Ganze mittlerweilen sogar auf Antialiasing erweitert werden; dazu müsste bei den Randpixeln berechnet werden, wieviele Prozent überdeckt sind => Zeichnen mit entsprechender Teiltransparenz nötig.
Dürfte allerdings ziemlich rechenaufwändig werden (jedoch ansonsten auch wieder gutes Lernbeispiel!), deshalb erledigen heutzutage die Coprozessoren in Grafikkarten normalerweise solche Aufgaben via DirectX/OpenGL. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
 |
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1280 Wohnort: Ruhrpott
|
Verfasst am: 16.07.2014, 09:35 Titel: |
|
|
@dreael: Kann es sein, daß du die Billard-Simulation für einen etwas langsameren Rechner geschrieben hast? Kann man das Gewusel irgendwie langsamer machen? Ich würde mir die Simulation gerne einmal ansehen.
@creepi: Ich bin deiner Anregung gefolgt und habe meinen Popup-Blocker aktualisiert. Jetzt erscheinen keine Werbefenster mehr.
Eigentlich wollte ich in Bezug auf dreaels Anmerkung ein Beispielprogramm schreiben, bei dem die Transparenz der Farben von außen nach innen abnimmt. Allerdings weigert sich mein FB, die Kreise transparent darzustellen, obwohl die Farbtiefe laut 'Screeninfo' (und auch bei den Bildschirmeigenschaften) 32 bit beträgt. Bei Code: | ScreenRes 300,300,32
Line (0,100)-(150,150),RGB(0,255,255),BF
For x As Integer = 50 To 60
Circle (100,100),x,RGBA(255,255,255,10)
Next
Sleep | ist der Kreis vollständig zu sehen. Was mache ich falsch?
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
 |
Toa-Nuva
Anmeldungsdatum: 14.04.2006 Beiträge: 204 Wohnort: München
|
Verfasst am: 16.07.2014, 12:37 Titel: |
|
|
Zitat aus der Befehlsreferenz: http://www.freebasic-portal.de/befehlsreferenz/color-anweisung-98.html
Zitat: | Im 32bit-Farbmodus werden die Farbwerte im Format &hAARRGGBB angegeben, wobei AA den Wert des Alphakanals angibt. Dazu steht die Funktion RGBA zur Verfügung. Um den Alphakanal für die Transparenz der drawing primitives nutzen zu können, muss bei der Initialisierung des Grafikfensters das Flag GFX_ALPHA_PRIMITIVES aktiviert sein (siehe SCREENRES). |
Versuch also mal, den ScreenRes-Befehl wie folgt abzuändern:
Code: | ScreenRes 300,300,32,,FB.GFX_ALPHA_PRIMITIVES |
_________________ 704 Signature not found |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 16.07.2014, 12:41 Titel: |
|
|
Mist, jetzt wollte ich meinen ersten Beitrag zu diesem Thread zitieren, aber da war ich zu langsam.  _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
creepi
Anmeldungsdatum: 13.06.2010 Beiträge: 59
|
Verfasst am: 16.07.2014, 15:40 Titel: |
|
|
hey, das geht doch dann sicher auch mit line? wenn ich dann rgba angebe, direkt mal testen : )
hat schon gegrübelt wenn es bei circle mit dem code rgba geht sollte es ja bei line sicher auch.
ok, hät wohl auch zuerst testen können und dann antworten nur hab gerad was anderes vor der nase und da ich nu mal rein schaute wollt ich auch antworten bevor ich es vergess ; D
was das zu schnelle game anbelangt, sicher reicht einfach ein timer der doch die abläufe dann etwas verlangsamt. so das alle paar xy millisec eine berechnung stattfindet. aber ich glaub euch erzähl ich da nichts
off topic:
@grindstone, keine ursache, aber gibt auch webseiten wo man ruhig mal deaktivieren kann damit der betreiber ein bissel unterstützt wird, bereits das anzeigen ohne anzuklicken ist ja schon eine kleine vergütung im 0,00x euro bereich
Edit:
Nun hatte es mir doch keine ruhe gelassen und ich hab mich mal dran rum versucht. Also mit screen funktionierte es nicht, screenres schon aber dafür waren alle texte nun ausgeblendet die ich mit draw anzeigen ließ. Die line war aber dafür transparent xDD
das immer alles vor und nachteile haben muss...., sachen gibts.
ooh...„OpenGL-Modus“... mh, transparents wird eh überbewertet  |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 16.07.2014, 19:37 Titel: |
|
|
Zitat: | dafür waren alle texte nun ausgeblendet die ich mit draw anzeigen ließ |
Welche Schriftfarbe hast du eingestellt? Bedenke, dass in der Angabe &hrrggbb der Alphakanal auf 0 steht, also voll transparent. Da dann doch lieber RGB oder RGBA verwenden. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1280 Wohnort: Ruhrpott
|
Verfasst am: 17.07.2014, 11:05 Titel: |
|
|
@Toa-Nuva: Ja ja, wer lesen kann, ist klar im Vorteil. Vielen Dank für den Hinweis. Wenn man dann noch fbgfx.bi einbindet, klappt's auch mit der Transparenz.
@creepi / off topic: Ich habe nichts gegen Werbebanner auf Webseiten. Aber wenn mir ein solches Banner die Sicht auf das versperrt, was ich mir anschauen möchte und ich es wegklicken muss, empfinde ich das als Nötigung, und da werde ich sauer. Zumal ich ja auch nicht weiß, was ich wirklich auslöse, wenn ich auf den Button mit dem X klicke...
on topic: Ich habe festgestellt, daß der 'Circle'-Befehl etwa 70mal so schnell arbeitet wie die 'PSet'-Methode mit Sinus und Cosinus. Das legt nahe, die Teilkreise doch als einzelne Kreisbögen zu zeichnen. Die Anfangs- und Endwinkel der einzelnen Kreisausschnitte (jeweils in Bezug auf einen der anderen Kreise) zu berechnen, ist nicht allzu schwierig, das sinnvolle Ordnen der Winkel macht aber überraschenderweise Probleme. Ich werde mal auf den nächsten Geistesblitz warten.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
 |
creepi
Anmeldungsdatum: 13.06.2010 Beiträge: 59
|
Verfasst am: 17.07.2014, 15:53 Titel: |
|
|
70x schneller o.O
*denk* wenn jemand 100+ planeten hat wäre pset schneller
außer man würde dann hingehen und gewisse planeten außen vorlassen wenn man weiß das die innerhalb des eigenes system liegen...
Bei euch kann man echt nur schmunzeln, eigtl. sagte ich ja schon in meiner ersten antwort das ich nen lösungsweg hab und ihr...... *lach* echt genial ;D
Komme aber gerad gut voran, war eigtl. nicht geplant aber versuch mal eine art projektile rein zu hauen, das wenn da zb auf planet gefeuert wird das man entsprächende schüsse sieht... explosion müsste man erstmal passende finden o.o aaaaaaaaber das gehört hier nicht mehr in den thema
@nemored, genau - hatte ich in den moment nicht daran gedacht, die waren per &hFFFFFF angegeben deshalb dann ausgeblendet worden. |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 17.07.2014, 18:29 Titel: |
|
|
Wo kämen wir denn hin, wenn wir immer nur die Fragen beantworten und dann aufhören würden?
Ich finde das statische Beispiel von dreael ja sehr schön, es könnte aber etwas Bewegung vertragen. Wer mag, kann noch einen Wechsel der Regenbogenfarben einbauen. Sollte nicht so schwer sein, aber mir fehlt die Begabung, eine schöne Farbreihenfolge zu erstellen. RGB(255, 0, 255) ist jetzt aber tabu, weil transparent.
Code: | ' "Rauch"-Kreise (Regenbogeneffekt)
' Variante PSET-Methode
' Idee von dreael; Bewegung von nemored
#Define Fensterbreite 640
#Define Fensterhoehe 480
#Define Minimalradius 20
#Define Maximalradius 50
#Define Streifenbreite 5.0
#Include Once "fbgfx.bi"
Randomize
Type Kreis
As Single x, y, vx, vy, r, dr
End Type
Function Quadrat(s As Single) As Single
Quadrat = s * s
End Function
' Hier die Kreise unserer "Wolke"
Dim k(24) As Kreis
For i As Integer = LBound(k) to UBound(k)
With k(i)
.x = Rnd*Fensterbreite
.y = Rnd*Fensterhoehe
.vx = Rnd*10 - 5
.vy = Rnd*10 - 5
.r = Rnd*(Maximalradius-Minimalradius) + Minimalradius
.dr = Rnd - .5
End With
Next
ScreenRes Fensterbreite, Fensterhoehe, 32, 1, FB.GFX_ALPHA_PRIMITIVES
Width 80, 30
Dim regenbogenfarben(...) As UInteger => { _
RGB(255, 0, 255), _
RGB( 0, 0, 127), _
RGB( 0, 127, 255), _
RGB(127, 255, 127), _
RGB(255, 127, 0), _
RGB(255, 0, 0) }
Dim i As Integer, y As Integer, x As Integer, abstMin As Single, abst As Single
Dim j As Integer
Dim As Any Ptr hintergrund = ImageCreate(Fensterbreite, Fensterhoehe)
Dim As Any Ptr vordergrund = ImageCreate(Fensterbreite, Fensterhoehe)
For i=1 To 30
For j=1 To 61 Step 20
Locate i, j
Print "Kreise mit CIRCLE *";
Next j
Next i
Get (0, 0)-(Fensterbreite-1, Fensterhoehe-1), hintergrund
Do
' neue Kreisposition
For i = LBound(k) To UBound(k)
With k(i)
.x += .vx
If .x < 0 Or .x > Fensterbreite Then
.vx *= -1
.x += 2*.vx
End If
.y += .vy
If .y < 0 Or .y > Fensterhoehe Then
.vy *= -1
.y += 2*.vy
End If
.r += .dr
If .r < Minimalradius Or .r > Maximalradius Then
.dr *= -1
.r += 2*.dr
End If
End With
Next
' zeichnen
Line vordergrund, (0, 0)-(Fensterbreite-1, Fensterhoehe-1), rgb(255, 0, 255), BF
For i = UBound(regenbogenfarben) To LBound(regenbogenfarben) Step -1
For j = LBound(k) To UBound(k)
Circle vordergrund, (k(j).x, k(j).y), k(j).r + CSng(i) * Streifenbreite, regenbogenfarben(i), , ,1.0, F
Next j
Next i
ScreenLock
Put (0, 0), hintergrund, Pset
Put (0, 0), vordergrund, Trans
ScreenUnlock
Sleep 50
Loop Until Len(Inkey) |
_________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
creepi
Anmeldungsdatum: 13.06.2010 Beiträge: 59
|
Verfasst am: 17.07.2014, 22:29 Titel: |
|
|
habs mir mal angeschaut, krass eeeey
da wird man ja high von ; DD |
|
Nach oben |
|
 |
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1280 Wohnort: Ruhrpott
|
Verfasst am: 18.07.2014, 11:06 Titel: |
|
|
@nemored: Das gäbe einen 1A Bildschirmschoner ab!
creepi hat Folgendes geschrieben: | 70x schneller o.O | Hört sich schön an, ist aber für deinen Zweck leider nicht zu gebrauchen. Nicht nur, daß das Berechnen und sinnvolle Ordnen der Anfangs- und Endwinkel reichlich kompliziert ist, 'Circle' kann die Kreise zwar zeichnen, aber nicht mehr beseitigen. Da bist du dann wieder auf des Karussellverfahren mit dem rotierenden Punkt auf dem Kreisbogen angewiesen. creepi hat Folgendes geschrieben: | Bei euch kann man echt nur schmunzeln, eigtl. sagte ich ja schon in meiner ersten antwort das ich nen lösungsweg hab und ihr...... *lach* echt genial | Das passiert, wenn Leute zusammenkommen, die zuviel Zeit haben. Und hin und wieder kommt ja auch was interessantes dabei heraus, wie z.B. 3 verschiedene Verfahren, Kreise auf den Bildschirm zu malen. Und mit a * a statt a^2 werde ich jetzt meine Audio-Konvertierungsprogramme noch ein paar Prozent schneller machen...
Ach ja: einen Lösungsvorschlag für deine expandierenden Kreise habe ich nebenbei auch noch geschrieben.
http://www.freebasic-portal.de/porticula/kreiswolke-1764.html
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 18.07.2014, 17:51 Titel: |
|
|
Mich hat dieser doofe Farbwechsel nicht in Ruhe gelassen, weshalb ich jetzt doch noch eine Version geschrieben habe. Sieht ... interessant aus.
Man kann mal an den #DEFINE-Werten herumschrauben, gibt schöne Kombinationsmöglichkeiten, interessant finde ich z. B. auch die Einstellung sehr vieler Kreise mit geringem Höchstradius.
Wenn man alle Kreise auf dieselbe Startfarbe setzt (Zeile 45), wirkt es wieder komplett anders, aber auch nicht schlecht.
Oh, hoppla, Link vergessen:
http://www.freebasic-portal.de/porticula/bewegte-transparente-kreise-mit-farbwechsel-1765.html _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1280 Wohnort: Ruhrpott
|
Verfasst am: 19.07.2014, 07:35 Titel: |
|
|
Da wird einem ja ganz psychedelisch zumute...
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 19.07.2014, 09:35 Titel: |
|
|
Wenn du es psychedelisch willst, musst du die Streifenbreite hochstellen.  _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
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.
|
|