 |
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 |
creepi
Anmeldungsdatum: 13.06.2010 Beiträge: 59
|
Verfasst am: 11.07.2014, 02:06 Titel: Circle - ohne zu überlappen / sich zu schneiden? |
|
|
Hi : )
hoffe der titel ist einigermaßen richtig gewählt.
Ist jetzt nichts was umbedingt sein muss eher nur eine überlegung. Ich weiß nicht ob es mit circle machbar ist, hab schon ein wenig das Forum durchforstet und eben was mit google so aufzufinden ist / war.
Also am rande, mit circle selber ist zb 20% transparents nicht möglich? Weil sonst könnte ich alternativ den kreis ausfüllen und eben durch die transparents eine art verbindung schaffen wenn sie sich überschneiden.
Frage:
Wenn sich mit Circle zwei kreise treffen, wäre es machbar das sie sich nicht überschneiden sondern dort aufhören wo sie sich treffen und wieder dort weiter zeichnen wo sie sich nicht mehr schneiden?
Hoffe es ist verständlich worauf ich hinaus möchte ansonsten kann ich auch per paint ein bild erstellen ; )
Wenn nicht möglich, wie könnte ein lösungsweg aussehen, gibt es eine alternative?
Wie gesagt wenn nicht machbar auch ok, so wild wäre das jetzt nicht. Aber wie ich euch so kenne hat der eine oder andere vielleicht eine passende idee / weiß wovon ich rede
In diesem sinne, sag ich einfach mal wieder vorab vielen dank : ) |
|
Nach oben |
|
 |
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1278 Wohnort: Ruhrpott
|
Verfasst am: 11.07.2014, 06:37 Titel: |
|
|
Hallo!
Meintest du sowas?
Code: | ScreenRes 300,300
Circle (100,100),30,15
Circle (140,100),30,0,,,,F
Circle (140,100),30,15
Sleep |
Oder eher das?
Code: | ScreenRes 300,300
Circle (100,100),30,15
Circle (140,100),30,15
Circle (100,100),29,0,,,,F
Circle (140,100),29,0,,,,F
Sleep
|
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: 11.07.2014, 12:02 Titel: |
|
|
Hi Grindstone,
also meinen tu ich das zweite beispiel
Problem ist nur das ich das so nicht übernehmen kann, da ich ein hintergrund hab der solch ein beispiel nicht ermöglicht, könnte zwei andere kreise nicht einfach mit farbe füllen : /
mh, oooooooder!!
*denk*
doch in eine grafik rein schreiben und die schwarzen mit der pinken farbe füllen, dann per put trans nutzen. Einziges manko, es müsste ständig die grafik erstellt & gelöscht werden.... kostet rechenleistung aber anders würde es nicht gehen?
....bzw. ein integer zwischen schalten und erst wenn sich etwas geändert hat wird nochmal die grafik.... Na ich schau mal falls es anders nicht geht hab ich zu mindest ein gedanken anstoß, danke  |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4700 Wohnort: ~/
|
Verfasst am: 11.07.2014, 15:07 Titel: |
|
|
Siehe http://www.freebasic-portal.de/befehlsreferenz/screenres-372.html:
Um mit CIRCLE Alpha-Transparenz zu nutzen, muss das Flag GFX_ALPHA_PRIMITIVES gesetzt sein. Du kannst dann direkt beim Zeichnen auf den Bildschirm Transparenzeffekte nutzen.
Code: | #include once "fbgfx.bi"
screenres 400, 300, 32, 1, FB.GFX_ALPHA_PRIMITIVES
line (100, 100)-(200, 200), rgba(255, 0, 0, 127), bf
line (150, 150)-(250, 250), rgba(0, 255, 0, 127), bf
getkey |
_________________ 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: 11.07.2014, 19:05 Titel: |
|
|
ah ok, gut zu wissen das auch bei circle die transparents möglichkeit gibt  |
|
Nach oben |
|
 |
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1278 Wohnort: Ruhrpott
|
Verfasst am: 12.07.2014, 11:49 Titel: |
|
|
Mit etwas Rechnerei geht es auch direkt, ohne 'Circle', Zwischenspeicher und Transparenz: Code: | Const pi As Double = Acos(0)*2
Dim As Integer x1,y1,r1,x2,y2,r2,x,y
Dim As Double w
ScreenRes 300,300
x1 = 100 'mittelpunkt kreis 1
y1 = 100
r1 = 30 'radius kreis 1
x2 = 150 'mittelpunkt kreis 2
y2 = 130
r2 = 40 'radius kreis 2
'erster kreis
For w = 0 To 2*pi Step .01
x = x1 + Sin(w) * r1
y = y1 + Cos(w) * r1
If Sqr((x - x2)^2 + (y - y2)^2) > r2 Then
PSet(x,y),15
EndIf
Next
'zweiter kreis
For w = 0 To 2*pi Step .01
x = x2 + Sin(w) * r2
y = y2 + Cos(w) * r2
If Sqr((x - x1)^2 + (y - y1)^2) > r1 Then
PSet(x,y),15
EndIf
Next
Sleep
|
Das Prinzip ist ganz einfach: Es wird jeder Punkt der Kreisbahn berechnet, aber nur dann gesetzt, wenn er weiter vom Mittelpunkt des anderen Kreises entfernt ist als dessen Radius.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 12.07.2014, 15:53 Titel: |
|
|
grindstone hat Folgendes geschrieben: | Code: | If Sqr((x - x1)^2 + (y - y1)^2) > r1 Then
PSet(x,y),15
EndIf |
|
Nur als kleiner Geschwindigkeitsoptimierungstipp: SQR() ist eine relativ aufwändige Operation, stattdessen den Vergleich mit den Quadraten machen:
Code: | If (x - x1)^2 + (y - y1)^2 > r1 * r1 Then
PSet(x,y),15
EndIf |
Bei der Potenz bin ich mir ebenfalls nicht sicher, ob der FB-Compiler diese als Multiplikation mit sich selbst optimiert. Üblicherweise bereichnen viele BASIC-Interpreter und Compiler ein
üblicherweise als
Code: | r = exp(log(a) * b) |
Zum Problem selber: CIRCLE erlaubt sehr wohl bereits seit den Zeiten von GW-BASIC und QB die Angabe eines Start- und Endwinkels, den man in diesem Fall berechnen müsste.
Vom MiniCAD-Projekt ganz früher hätte ich noch irgendwo eine Kreisschnittpunkte-Berechnung. In diesem Fall sind auch Trigonometrie und Polarwinkelberechnungen möglich.
@creepi (ursprünglicher Poster): Ich empfehle Dir sonst, ein Windows Paint einmal zu starten und eine ganz kleine Skizze zu zeichnen, was Du genau als Effekt benötigst. Beispiel von mir:
http://beilagen.dreael.ch/QB/Kreise_transparent_getrimmt.png
=> Stelle am besten etwas Ähnliches zusammen. Für die Beispiele mit dem roten und blauen getrimmten (an CAD denken!) Kreis wäre die besagte Start- und Endwinkelberechnung nötig. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
 |
creepi
Anmeldungsdatum: 13.06.2010 Beiträge: 59
|
Verfasst am: 12.07.2014, 21:53 Titel: |
|
|
@Grindstone, bisschen rechnerei? : D
...an die transparents hat ich gedacht falls es mit dem circle nicht so gehen sollte wie gedacht wäre das eine alternative gewesen, war aber nuuur ein gedanke. Hab es wie gesagt noch am selben tag umgesetzt mit dem zwischen speichern, bin ich recht zufrieden mit. Sobald eine änderung stattfindet wird bild gelöscht und neu gezeichnet.
Es kommen schon einige kreise vorher weshalb ich es nicht komplezierter machen mag als umbedingt nötig ; )
Wenn ich den code sehe und bedenke das der dann x mal durchgerechnet werden muss ist eine zwischen speicherung sogar vielleicht cpu schonender.
Dreael, auf dein bild von den drei beispiele, meinte ich das rechte
Wisst ihr was, bin mal so frei und zeige euch einfach mal das resultat, hatte vorher nur angezeigt wenn angeklickt wurde, mit der jetzigen möglichkeit zeig ich nu direkt alle an und was wichtig ist, sie überschneiden sich nicht sonst sähe das verdammt unschön aus.
(Hoffe sind nu nicht zuviele bilder, erst dacht ich nur zu sagen rechte beispiel nur dacht wäre ja auch nett euch zu zeigen... das ihr wisst was ich damit angestellt hab. Nur dann denkt man aaach noch ein bild, ach davon noch eins... lol....  |
|
Nach oben |
|
 |
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1278 Wohnort: Ruhrpott
|
Verfasst am: 13.07.2014, 13:15 Titel: |
|
|
dreael hat Folgendes geschrieben: | CIRCLE erlaubt sehr wohl bereits seit den Zeiten von GW-BASIC und QB die Angabe eines Start- und Endwinkels, den man in diesem Fall berechnen müsste. | Das mit den Winkeln ist mir schon klar, aber das Berechnen ist eben das Problem. Mein kleines Progrämmchen ist aus dem Versuch entstanden, die Schnittpunkte quasi per Versuch und Irrtum zu ermitteln (und wenn ich die Punkte schon berechne, kann ich sie auch gleich setzen).
Zum Berechnen der Schnittpunkte von zwei Kreisen habe ich im Internet nichts gefunden, aber inzwischen hatte ich selber einen Geistesblitz (ja, sowas kommt vor, wenn auch selten ). Das Ermitteln der Anfangs- und Endwinkel bedeutet noch ein bisschen mehr Rechnerei, die dafür aber nur einmal ausgeführt werden muss. Was die Sache etwas kompliziert macht, ist die Tatsache, daß FB Winkel rechtsherum berechnet, die Kreise aber (mathematisch korrekt) linksherum gezeichnet werden. Dadurch werden einige zusätzliche Fallunterscheidungen erforderlich.
Ich habe mal eine kleine Animation erstellt: Code: | Const pi As Double = Acos(0)*2
Dim As Integer x1,y1,r1,x2,y2,r2,a
Dim As Double wa,wb,w1,w2,ew2,ew1,mw
ScreenRes 300,300
x1 = 150 'mittelpunkt kreis 1
y1 = 150
r1 = 50 'radius kreis 1
x2 = 100 'mittelpunkt kreis 2
y2 = 110
r2 = 30 'radius kreis 2
For y2 = 50 To 230
Cls
a = Sqr((x1 - x2)^2 + (y1 - y2)^2) 'abstand der kreismittelpunkte voneinander
If a >= (r1 + r2) Then 'die kreise berühren sich nicht
Circle (x1,y1),r1,15
Circle (x2,y2),r2,15
Else
mw = ASin(Abs(y1 - y2) / a) 'winkel der verbindungslinie der mittelpunkte zur x-achse
If (x1 <= x2) And (y1 > y2) Then 'I. quadrant
wa = mw
wb = wa + pi
ElseIf (x1 > x2) And (y1 > y2) Then 'II. quadrant
wa = pi - mw
wb = 2*pi - mw
ElseIf (x1 > x2) And (y1 <= y2) Then 'III. quadrant
wa = pi + mw
wb = mw
Else '(x1 <= x2) And (y1 <= y2) 'IV. quadrant
wa = 2*pi - mw
wb = wa - pi
EndIf
w1 = ACos((r1^2 + a^2 - r2^2) / (2 * r1 * a))' halber öffnungswinkel kreis 1
w2 = ACos((r2^2 + a^2 - r1^2) / (2 * r2 * a))' halber öffnungswinkel kreis 2
ew1 = wa - w1 'endwinkel kreis 1
If ew1 < 0 Then
ew1 += 2 * pi
EndIf
Circle (x1,y1),r1,15,wa + w1,ew1 'teilkreis 1
ew2 = wb - w2 'endwinkel kreis 2
If ew2 < 0 Then
ew2 += 2 * pi
EndIf
Circle (x2,y2),r2,15,wb + w2,ew2 'teilkreis 2
If InKey <> "" Then
End
EndIf
EndIf
Sleep 50
Next
Sleep
|
@creepi:
Die Berechnung ist sicher alles andere als selbsterklärend, aber ich hoffe, daß du trotzdem damit klarkommst.
Gruß
grindstone
Ach ja: Deine hochgeladenen Bilder habe ich mir nicht angesehen (zumindest nicht in groß), da ich Webseiten, bei denen mir ein Werbefenster die Sicht versperrt, aus Prinzip sofort wieder verlasse.  _________________ 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: 13.07.2014, 13:49 Titel: |
|
|
Habs mir mal angeschaut, schöne animation jedenfalls
Problem wäre ja nur, da treffen ja x weitere kreise aufeinander, da würde die rechnung schon noch etwas komplexer werden als bereits ist. Wobei ist ja realtiv wenn man es sich anschaut kann man schon durch blicken nur eben.... aber gut für leute die ggf. das selbe problem haben, schönes beispiel ist es aufjedenfall. : )
Off Topic:
...was das mit den bildern angeht, spontaner gedanke war: welches werbefenster xD
tipp: adblock ist ganz nett, gibts zb. als plugin / addon für firefox...
Bin bei der seite auch nicht angemeldet, war eher durch google drauf gekommen. |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 13.07.2014, 19:33 Titel: |
|
|
Danke für Deine Bilder, sie zeigen letztendlich, dass eine Art Raucheffekt generiert werden soll...
Daher einen kleinen Code zusammengebaut:
http://beilagen.dreael.ch/QB/Regenbogenkreis1.bas
Die PSET-Variante bedeutet halt schnell einmal recht viel mehr Rechenaufwand, dafür kann das Innere transparent bleiben (soll der Text demonstrieren).
Hinweise zur Variante Winkelberechnung: Da kommen wir ziemlich tief ins CAD-Schraffuralgorithmus-Problem hinein. Was bei nur 2 Kreisen noch recht trivial ist, kann bei vielen Kreisen schon sehr anspruchsvoll werden, weil hier nebst der eigentlichen Winkelberechnung noch umfangreiche Kreisbogen-Heraustrimm-Filteroperationen anfallen. => Bedingt dann dynamische Listen, welcher Teil vom Kreis gezeichnet werden darf, ob aus einem Teil zwei Teile werden, ein Teil wegen vollständiger Überdeckung herausfällt usw. Und natürlich bei n Kreisen müssen n * (n - 1) / 2 Berechnungen getätigt werden.
Eine ähnliche Problemstellung gibt es übrigens bei der unter
http://www.dreael.ch/Deutsch/Download/Billard-Simulation.html
vorhandenen Billard-Simulation ebenfalls: Zwischen nur 2 Kugeln ist die Berechnung trivial, bei n (beliebige Anzahl) muss der Zusammenstoss auch mit jeder Kugel berechnet werden => zeitlich findet dann von den vielen prognostizierten Ereignissen immer das früheste statt -> die neue Bewegrichtung der beiden Kugeln verwerfen dann in der dort verwendeten sog. Halde (Heap) die Ereignisse, die dann dafür neu berechnet werden müssen. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
 |
creepi
Anmeldungsdatum: 13.06.2010 Beiträge: 59
|
Verfasst am: 13.07.2014, 20:52 Titel: |
|
|
Hatte damit eigtl. schon erreicht was ich wollte weshalb ich jetzt mehr als verwirrt war worauf du hinaus möchtest Dreael. Also neugirig aufjedenfall nun, Raucheffekt?? ....Nur leider bekomm ich eine fehler meldung zitat:
Zitat: | error 11: Expected constant, AnzKreise in 'Const AnzKreise = UBound(k) - LBound(k) + 1' | : / |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4700 Wohnort: ~/
|
Verfasst am: 13.07.2014, 20:58 Titel: |
|
|
Welche Compilerversion nutzt du? Bei mir compiliert es ohne zu klagen.
Du kannst AnzKreise auch über DIM deklarieren oder sogar ganz weglassen - das wird im Quellcode gar nicht mehr verwendet.
Sieht übrigens hübsch aus, dreael.  _________________ 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: 13.07.2014, 21:02 Titel: |
|
|
uuups, mein fehler
starte immer die neuste manuell und öffne dann die passende .bas
Hab ich gerad nicht getan, wo du es sagtest hab ich flott in einstellung geschaut und siehe da, alte version gerad offen
Sry, kommando zurück. Ja mit der aktuellen version funkt es.  |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 13.07.2014, 22:03 Titel: |
|
|
creepi hat Folgendes geschrieben: | Nur leider bekomm ich eine fehler meldung zitat:
Zitat: | error 11: Expected constant, AnzKreise in 'Const AnzKreise = UBound(k) - LBound(k) + 1' | : / |
Inzwischen noch korrigiert (war noch am Code etwas umbauen)...
Sonst zeigt das Beispiel, dass READ und DATA nicht mehr länger nötig sind und das Array sogar in der Grösse vom Compiler selber bestimmt wird. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
 |
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1278 Wohnort: Ruhrpott
|
Verfasst am: 14.07.2014, 09:17 Titel: |
|
|
@dreael: Toll gemacht mit den Regenbogenkreisen. Auf diesen Weg, Kreise ohne eine einzige Winkelfuktion zu zeichnen, muß man erst mal kommen!
Hat es einen besonderen Grund, daß du alle Variablen als 'Single' definiert hast? Die Bildschirmkoordinaten sind doch Integerwerte. Und das Programm funktioniert auch mit Integerwerten (ich habe es mal ausprobiert ) einwandfrei.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 14.07.2014, 22:11 Titel: |
|
|
grindstone hat Folgendes geschrieben: | Hat es einen besonderen Grund, daß du alle Variablen als 'Single' definiert hast? Die Bildschirmkoordinaten sind doch Integerwerte. Und das Programm funktioniert auch mit Integerwerten (ich habe es mal ausprobiert :D ) einwandfrei. |
Korrekterweise wäre dann ein kleiner Umbau nötig: Statt Wurzel zu ziehen (immer Fliesskommaoperation!) bei jedem Kreis eine Tabelle mit den quadrierten Radien führen, entsprechender Vergleich machen.
Für physikalische Vorgänge wie das fliegende Raumschiff, welches mit einer kreisförmigen Wolke zerschellt, ist an und für sich Fliesskomma geeigneter, wobei für so etwas einfache Genauigkeit ausreicht. Müsste ich jedoch auch einmal testen, ob in FB der Geschwindigkeitsunterschied zwischen Single und Double auch immer noch so ausgeprägt wie in QBasic / GW-BASIC ist. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4700 Wohnort: ~/
|
Verfasst am: 14.07.2014, 23:15 Titel: |
|
|
Kann sogar sein, dass DOUBLE gar nicht mehr langsamer ist als SINGLE - der Prozesseror rechnet sowieso mit einer ganz anderen Bit-Zahl.
Bei feststehenden Kreisen würde INTEGER ja reichen, aber wenn sich das ganze später mal bewegen soll, sind natürlich Gleitkommazahlen wichtig. _________________ 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: 15.07.2014, 02:18 Titel: |
|
|
Sage mal noch was dazu, wusst jetzt nicht so recht ob...
Ihr unterhaltet euch da so schön, mag ich gar nicht unterbrechen aber da nochmal bezug aufs spiel genommen wurde werf ich doch mal noch nen kommentar in den raum ; )
Also die kreise um die es geht stehen fest
Sie "dehnen" sich mit der zeit nur aus.
Das schiff selber hat auch ein kreis, aber nur wenn man es angeklickt also ausgewählt hat ansonsten nicht. Wenn es sich bewegt setzt sich der kreis ebenfalls in bewegung aber da findet keine solche berechnung statt da er mit nichts verschmelzen muss. Der wird dann einfach darüber gezeichnet. (also in meinen fall).
PS. Nemored, die gleitkommazahl würde dann für den timer dienen right? |
|
Nach oben |
|
 |
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1278 Wohnort: Ruhrpott
|
Verfasst am: 15.07.2014, 03:23 Titel: |
|
|
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 _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
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.
|
|