Rounded Rectangle

Eigene oder Gemeinschaftsprojekte, Klassen, Module, Codeschnipsel, HowTos, ...
Antworten
0backbone0
Foriker
Beiträge: 8
Registriert: Di 14. Okt 2014, 18:48
Kontaktdaten:

Rounded Rectangle

Beitrag von 0backbone0 » Sa 18. Okt 2014, 15:34

Hallo,

ich habe gerade eine Klasse geschrieben mit der man ein Rechteck mit abgerundeten Ecken zeichnen kann.
Das ist jetzt keine so aufregende Sache aber vielleicht hilft es ja jemandem.

Syntax:

Code: Alles auswählen

RndRect(x, y , width, height, radius)


Konstruktive Kritik zum Programmierstiel sind willkomen.

Viel Spaß damit... :wink:
Dateianhänge
RndRec.tar.gz
(6.64 KiB) 481-mal heruntergeladen

tux_
Moderator
Beiträge: 943
Registriert: Di 11. Nov 2008, 20:05
Kontaktdaten:

Re: Rounded Rectangle

Beitrag von tux_ » So 19. Okt 2014, 11:51

Das sieht gut aus. Aber drei Dinge kann ich bemaengeln ;-)

  1. Du verwendest Draw statt Paint. Dazu musst du wissen, dass Draw ein obsoletes Interface zum Zeichnen ist (seit Gambas 3.4). Neuere Projekte sollten immer auf Paint setzen (wenn moeglich). Die Art, zu zeichnen ist dort etwas anders (vektoriell), aber es steckt z.B. schon das AntiAliasing mit drin, was auch deine Zeichnung gleich viel weicher macht. Wenn wir gerade dabei sind: was deine OpenArc()-Funktion leistet, gibt es schon in Paint.Arc(), deine Deg2Rad() heiszt in Gambas Rad() und generell kann man (wenn man auf den Lerneffekt nicht bedacht ist) das Projekt durch einen Einzeiler ersetzen, s. Projekt im Anhang ;-)
  2. Deine Klasse ist nicht dynamisch. Du hast eine Klasse geschrieben, in der kein Symbol wirklich dynamisch ist, d.h. wenn du ein Objekt aus deiner Klasse erzeugst, hat es einen leeren Zustand (keine Eigenschaften, keine internen Variablen). In Gambas kann (und sollte) man in diesem Fall spezielle statische Klassen (sog. "Module") verwenden, sonst verschwendet man Speicher bei der Instantiierung dieser zustandslosen (= weitgehend nutzlosen) Objekte -- deine Klasse bietet sozusagen nur eine Routine. Ein Modul ist eine Klasse, von der man selbst kein Objekt erstellen kann, aber man kann den Klassennamen wie ein Objekt der Klasse verwenden. Damit hast du immer genau ein Objekt der Klasse.
  3. Wenn man den Radius grosz genug waehlt, kollabieren deine Ecken ueber das Rechteck hinaus. Werte um 400 sehen richtig kuenstlerisch aus :-)

Ich stelle einen Patch fuer dein Projekt in den Anhang. Dort habe ich alles umgesetzt, was den ersten und zweiten Punkt betrifft (auszer die Einzeiler- und OpenArc()-Ersetzungen, weil sie zu viel Quelltext wegnehmen). Insbesondere ist die DrawingArea1.Cached = False. Wenn du dazu Fragen hast, zoegere nicht.

Lass dich von dem vielen Text in diesem Beitrag und dem groszen Patch nicht verunsichern. Fuer die kurze Zeit, die du erst Gambas sprichst, ist das ein sehr gutes Projekt geworden. Viele der Makel, die ich oben angemerkt habe, sind der Tatsache geschuldet, dass du gewisse Funktionen noch nicht kennst.

Ein Gedankenexperiment zum Abschluss: du gehst in deiner OpenArc() in "angle" Winkel im Gradmasz in Einerschritten durch und zeichnest den Bogen als offenen Polygonzug. Wuerde man ein riesiges Rechteck zeichnen und auf deine Boegen zoomen, wuerde man nicht die Linien sehen, insb. wenn der Eckenradius sehr grosz ist? Vielleicht moechtest du als Uebung deinen Algorithmus dahingehend sensitiv machen...

Interessant scheint mir auch die Verallgemeinerung auf rundeckige Polygone zu sein (das gibt es naemlich noch nicht in Gambas!): [0].

[0] http://stackoverflow.com/questions/24771828/algorithm-for-creating-rounded-corners-in-a-polygon
Dateianhänge
RndRect-tb-0.0.1.tar.gz
(3.92 KiB) 499-mal heruntergeladen
RndRec-0.0.1~RndRec-0.0.2.patch
(4.39 KiB) 474-mal heruntergeladen
Achtung: Es passiert, dass ich einen frisch geschrieben Beitrag innerhalb von 10 Minuten noch 3-4 Mal aendere!

0backbone0
Foriker
Beiträge: 8
Registriert: Di 14. Okt 2014, 18:48
Kontaktdaten:

Re: Rounded Rectangle

Beitrag von 0backbone0 » So 19. Okt 2014, 12:28

Hallo,

danke für die Antwort.
In meiner IDE wird noch die alte Hilfe angezeigt (Gambas 3.1.1 per Ubuntu Softwarecenter installiert).
Das Paint überhaupt existiert wusste ich nicht.
Hab mich schon gewundert das es nicht mal eine Moveto und Lineto Funktion gibt, hätte mir die beiden Variablen für den alten X/Y Wert erspart.
Die Arc funktion in Draw ist ja leider geschloßen, weshalb ich dann meine eigene Funktion geschrieben habe.
Das die Ecken kollabieren können ist mir auch schon aufgefallen, mir ist aber auf die schnelle keine Lösung eingefallen. (na ja, im Endeffekt if 2*radius > RndRect.width bzw .height dann den Radius verkleinern)

Wie wende ich den Patch an, hab mir das Ganze schon in GEdit angeschaut, da sieht man schon was geändert wird, aber das ist ja nicht der Sinn von einem Patch.

Zur Einzeiler-Variante:
Paint.Begin() und Paint.End() fehlen in deinem Beispiel. :P
Kann es sein das die beiden Parameter für die Radien erst in Gambas Versionen nach 3.1.1 dazugekommen sind?
Bekomme den Fehler zu viele Parameter. Die Auto-Vervollständigung sagt auch nur was von X, Y, Width und Height.
Wenn ich eine bestehende Funktion für ein RoundedRect gehabt hätte wäre ich gar nicht auf die Idee gekommen selbst eine zu Implementieren.

Beschäftige mich jetz erstmal mit Modulen,... man lernt ja nie aus :)
Danke nochmal für die Anregungen

tux_
Moderator
Beiträge: 943
Registriert: Di 11. Nov 2008, 20:05
Kontaktdaten:

Re: Rounded Rectangle

Beitrag von tux_ » So 19. Okt 2014, 13:31

Das Gambas in den Ubuntu Softwarecentern ist ziemlich alt (3.1.1 ist vom April 2012) und ich glaube mich zu erinnern, dass Minisini sagte, dass die Pakete sogar defekt seien. Unter Ubuntu kannst du aktuelle Gambas-Versionen von einem PPA beziehen, s. [0].

Die Arc funktion in Draw ist ja leider geschloßen


In der aktuellen Version jedenfalls nicht, s. [1].

Wie wende ich den Patch an [?]


Seit Gambas 3.4 kann die IDE Projekt-Patches erstellen und anwenden... Du kannst es manuell versuchen mit:
shell code
$ cd /your/project/
$ patch -p1 <thepatchfile

Aber mach vorher ein Backup deines Projekts...

Paint.Begin() und Paint.End() fehlen in deinem Beispiel. :P


Das ist aber keineswegs ein Fehler :-P Wenn die DrawingArea.Cached = False gesetzt ist, wird ihr Draw-Event ausgeloest, wann immer der Inhalt neu gezeichnet werden muss. Vor diesem Draw-Event wird intern bereits Paint.Begin() aufgerufen und danach automatisch Paint.End().

Aber alles, was ich sage, bezieht sich auf die neuste Gambas-Version. Seit 3.1.1 hat sich zu viel getan, um die Unterschiede ad-hoc aufzaehlen zu koennen.

[0] http://gambaswiki.org/wiki/install/ubuntu
[1] http://gambaswiki.org/wiki/comp/gb.qt4/draw/arc
Achtung: Es passiert, dass ich einen frisch geschrieben Beitrag innerhalb von 10 Minuten noch 3-4 Mal aendere!

0backbone0
Foriker
Beiträge: 8
Registriert: Di 14. Okt 2014, 18:48
Kontaktdaten:

Re: Rounded Rectangle

Beitrag von 0backbone0 » So 19. Okt 2014, 23:15

So,

hab gerade auf die Version 3.6 upgedated. Gefällt mir schon wesentlich besser. Jetzt hab ich auch die Widgets von denen ich zwar gelesen hatte, aber nie wusste wo die sind (Knob z.B.)
Nur die Projekte die ich in 3.1.1 gemacht hab funktionieren nicht. Es wird keine Fehlermeldung ausgegeben, und rein optisch sieht erstmal alles gut aus, aber die Eventhandler
schwächeln.Man kann keine Buttons ect. anklicken, und Drag Events funktionieren auch nicht.
Bei neuen Projekten funktioniert aber alles. Muss aber nochmal genau testen was von meinen alten Sachen noch geht und was nicht. Vielleicht gibts ja eine Lösung.

tux_
Moderator
Beiträge: 943
Registriert: Di 11. Nov 2008, 20:05
Kontaktdaten:

Re: Rounded Rectangle

Beitrag von tux_ » Mo 20. Okt 2014, 12:21

Eigentlich sollen die 3.x-Versionen abwaertskompatibel sein. Also wenn du etwas findest, das nicht funktioniert, koennen wir das (im entsprechenden Forum) diskutieren.
Achtung: Es passiert, dass ich einen frisch geschrieben Beitrag innerhalb von 10 Minuten noch 3-4 Mal aendere!

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 0 Gäste