Laden...

GDI+; Umgang mit Arc/Beziers/Curves; dynamische Berechnung

Erstellt von Animal21 vor 13 Jahren Letzter Beitrag vor 13 Jahren 2.822 Views
A
Animal21 Themenstarter:in
144 Beiträge seit 2008
vor 13 Jahren
GDI+; Umgang mit Arc/Beziers/Curves; dynamische Berechnung

Hallo Leute,

ich bin dabei, ein neues Control zu schreiben, welches die Standard Minimieren-, Maximieren-, Schließen-Buttons ersetzten soll, im Bild sieht man das fast fertige Control (Abb. 1).

Leider fehlt noch ein optisches Detail, welches in Abb. 2 zu erkennen ist. Der Kreis, um den die Buttons plaziert werden, soll "eingeschnitten" sein.

die Berechnung der Plazierung erfolgt dynamisch je nach Anzahl der Buttons...

Mein Problem ist nun, diese "eingeschnittenen" Kreise zu zeichnen.
Ich hab ein wenig mit Arcs, Curves und Beziers experimentiert, aber komme nicht richtig weiter...

Könnte mir vll einer erklären (mit Beispielen wäre schön), die man die drei richtig benutzt, um so ein Objekt zu erhalten?

mfg
Ani

M
231 Beiträge seit 2007
vor 13 Jahren

Wenn der Hintergrund beid den kleinen Kreisen nicht durchscheinen muss, einfach erst den großen Kreis zeichnen und dann die kleinen drüber "malen". Zumindest so wie auf Abb1 zu sehen ist, sollte so machbar sein...

Lg MB


Gruß MB

Home of DigiJay - DJ-Freeware

A
Animal21 Themenstarter:in
144 Beiträge seit 2008
vor 13 Jahren

wäre trick 17 xD
soll aber eine Lücke da sein..., so wie in Abb 2.

hab noch ein wenig probiert und bekomme bei folgendem Algorithmus anhängendes Bild


        float BubleSize = 60.0f;
        PointF pMitte = new PointF((recEllipse.Width - 2) / 2, (recEllipse.Height - 2) / 2);
        float fX1, fY1;
        PointF pXY1;
        int anz = 5;
        float phi = 360.0f / anz;
        float radius = recEllipse.Width * 0.45f;

        for(int i = 0; i < anz; i++) {
            float alpha = (float)((phi * i) * Math.PI / 180) - (float)Math.PI * 0.5f;
            fX1 = (float)(Math.Cos(alpha) * radius);
            fY1 = (float)(Math.Sin(alpha) * radius);

            pXY1 = new PointF(pMitte.X + fX1, pMitte.Y + fY1);
            RectangleF rec = new RectangleF(recWheelDraw.X + pXY1.X - BubleSize / 2, recWheelDraw.Y + pXY1.Y - BubleSize / 2, BubleSize, BubleSize);
            gpWheel.AddEllipse(rec);
            double deg = WheelHelper.ToDegree(alpha) + 90.0f;
            gpWheel2.AddArc(new RectangleF(recWheelDraw.X + pXY1.X - BubleSize / 2, recWheelDraw.Y + pXY1.Y - BubleSize / 2, BubleSize, BubleSize), (float)deg, 180);

        }

Wie bekomm ich jetzt die Koordinaten für die Anfang- und Endpunkte der Halbkreise raus?

mfg
ani

PS: die linien Zeichnen sich selber...

M
231 Beiträge seit 2007
vor 13 Jahren

Ich nehme an die kleinen Kreise sitzen auf dem großen Kreis (also der Mittelpunkt)

Dann hast eigentlich eh alles. Radius großer Kreis und Radius kleiner Kreis. dann hast ein gleichseitiges Dreieck und aus dem kannst per Winkelfunktion den End bzw. Anfangspunkt raus holen.


Gruß MB

Home of DigiJay - DJ-Freeware

M
231 Beiträge seit 2007
vor 13 Jahren

So in der Art sollte es sich rechnen lassen...


Gruß MB

Home of DigiJay - DJ-Freeware

A
Animal21 Themenstarter:in
144 Beiträge seit 2008
vor 13 Jahren

ah stimmt, mathe für anfänger xD

jetzt hab ich alle punkte ...
mit linien sieht es wie folgt aus, wie mach ich jetzt, dass es schöne kurven werden, anstelle von den linien?

M
231 Beiträge seit 2007
vor 13 Jahren

Wie mit den kleinen Kreisen eben. Du hast ja nun alle Punkte die du benötigst, oder nicht?


Gruß MB

Home of DigiJay - DJ-Freeware

A
Animal21 Themenstarter:in
144 Beiträge seit 2008
vor 13 Jahren

Mit welcher Funktion zeichne ich solche schwarzen Bögen, wollt ich wissen...
hab probleme das mit "DrawArc" umzusetzten...

M
231 Beiträge seit 2007
vor 13 Jahren

Müsste mit Arc schon gehen. Du hast ja das Rechteck und die Winkel aus den vorigen Berechnungen, denk ich jetzt mal...


Gruß MB

Home of DigiJay - DJ-Freeware

5.742 Beiträge seit 2007
vor 13 Jahren

Hallo Animal21,

nimm Regions, die du entsprechend verbindest (Region.Exclude).
Somit kannst du aus dem äußeren Kreis quasi die Kreise "heraussägen".

A
Animal21 Themenstarter:in
144 Beiträge seit 2008
vor 13 Jahren

hallo winSharp93,
kannst du das mit den Regions bitte näher erklären?

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo Animal21,

was soll denn in dem Spalt zwischen den kleinen und den großen Kreisen zu sehen sein? Soll das Fenster zu sehen sein, über dem das Menü geöffnet wird oder soll der Spalt eine feste Farbe haben?

Wegen der Frage zu den Regions: Hast du dir überhaupt schon Region.Exclude in der :rtfm: Doku angeschaut? Das sollte eigentlich alles erklären.

herbivore

A
Animal21 Themenstarter:in
144 Beiträge seit 2008
vor 13 Jahren

die idee mit den regions hat echt potential xD
Bin grad am lesen @herbivore (sorry ^^)

Der Spalt soll "frei" sein, also dass man sieht, was drunter ist...

5.658 Beiträge seit 2006
vor 13 Jahren

kannst du das mit den Regions bitte näher erklären?

Hallo Animal21,

es geht um sog. Bool'sche Operationen, wie Union, Substraction (hier: Exclude) und Intersection. Hier gibt es ein paar Bilder dazu, die das ganze erklären sollten: http://www.java2s.com/Tutorial/VB/0300__2D-Graphics/RegionExclude.htm (weiter unten sind die Links zu den anderen Operationen).

Ist zwar Java, aber das Konzept ist das gleiche...

Weeks of programming can save you hours of planning

A
Animal21 Themenstarter:in
144 Beiträge seit 2008
vor 13 Jahren

Alles klar, sieht echt klasse aus...
ein letztes noch, kann man aus der Region einen GraphicPath bekommen?

mfg
ani