Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Mehrere Kreise mit Nummern erstellen
Contace
myCSharp.de - Member



Dabei seit:
Beiträge: 5

Themenstarter:

Mehrere Kreise mit Nummern erstellen

beantworten | zitieren | melden

Hallo,

ich wollte einen kreis mit nummern entwickeln, komme jedoch nicht weiter.


Das eigentliche resultat sollte wie im Anhang aussehen.


Mein aktueller Stand.

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;

public class DrawStringAlignACircle : System.Windows.Forms.Form
{
    private System.ComponentModel.Container components = null;

    public DrawStringAlignACircle()
    {
        InitializeComponent();
        BackColor = SystemColors.Window;
        ForeColor = SystemColors.WindowText;
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        Graphics g = e.Graphics;
        SetScale(g);
        DrawFace(g);
        base.OnPaint(e);
    }
    private void InitializeComponent()
    {
        this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
        this.ClientSize = new System.Drawing.Size(800, 600);

    }

    [STAThread]
    static void Main()
    {
        Application.Run(new DrawStringAlignACircle());
    }

    private void SetScale(Graphics g)
    {
        g.TranslateTransform(Width / 2, Height / 2);

        float inches = Math.Min(Width / g.DpiX, Height / g.DpiX);

        g.ScaleTransform(inches * g.DpiX / 2000, inches * g.DpiY / 2000);
    }

    private void DrawFace(Graphics g)
    {
        Brush brush = new SolidBrush(ForeColor);
        Font font = new Font("Arial", 15);

        float x, y;

        const int numHours = 100;
        const int deg = 360 / numHours;
        const int FaceRadius = 700;

        for (int i = 1; i ≤ numHours; i++)
        {
            x = GetCos(i * deg + 90) * FaceRadius;
            y = GetSin(i * deg - 90) * FaceRadius;

            StringFormat format = new StringFormat();
            format.Alignment = StringAlignment.Center;
            format.LineAlignment = StringAlignment.Center;

            g.DrawString(i.ToString(), font, brush, -x, -y, format);

        }
        brush.Dispose();
        font.Dispose();
    }

    private static float GetSin(float degAngle)
    {
        return (float)Math.Sin(Math.PI * degAngle / 180f);
    }

    private static float GetCos(float degAngle)
    {
        return (float)Math.Cos(Math.PI * degAngle / 180f);
    }

}
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Contace am .
Attachments
private Nachricht | Beiträge des Benutzers
Contace
myCSharp.de - Member



Dabei seit:
Beiträge: 5

Themenstarter:

beantworten | zitieren | melden

mein bisheriges ergebniss im Anhang.


Grüße
Attachments
private Nachricht | Beiträge des Benutzers
Contace
myCSharp.de - Member



Dabei seit:
Beiträge: 5

Themenstarter:

beantworten | zitieren | melden

Hab das Problem behoben.

Wie könnte ich jetzt mehrere Kreise mit Nummern erstellen ?


Grüße
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Contace am .
Attachments
private Nachricht | Beiträge des Benutzers
chilic
myCSharp.de - Experte



Dabei seit:
Beiträge: 2.111

beantworten | zitieren | melden

Zitat von Contace
Wie könnte ich jetzt mehrere Kreise mit Nummern erstellen ?
Genauso, nur eben mehrmals :-)

Ja doof ich weiß. Aber was könnte man da sonst antworten? Wo ist dein Problem dabei?


Was mir beim überfliegen deines Codes auffällt, in SetScale wird "inches" errechnet indem durch dpi dividiert wird. Danach multiplizierst du das wieder mit dpi. Könntest du also auch ganz weglassen.
private Nachricht | Beiträge des Benutzers
Contace
myCSharp.de - Member



Dabei seit:
Beiträge: 5

Themenstarter:

beantworten | zitieren | melden

Hallo chilic,

danke für deinen Support.


Könntest Du den Code dazu bitte reinstellen.

Ich weiß nicht was Du mit nochmal genau meinst.


Grüße
private Nachricht | Beiträge des Benutzers
Coffeebean
myCSharp.de - Team

Avatar #avatar-3295.gif


Dabei seit:
Beiträge: 2.209
Herkunft: Deutschland/Schweiz

beantworten | zitieren | melden

Hallo Contace,
Zitat von Contace
Könntest Du den Code dazu bitte reinstellen.

ich bin mir sicher chilic und alle anderen Nutzer helfen dir gerne, aber trotzdem der Verweis auf [Hinweis] Wie poste ich richtig? Punkt 4 "Verlangt keine fertigen Lösungen".

Du kannst ja schon einen Kreis erstellen. Ruf einfach die Prozedur, die du brauchst um einen Kreis zu erstellen, mehrmals in einer Schleife auf.

Hast du das schonmal probiert? Was kam dabei heraus? Wie sieht der Code aus, nachdem du es probiert hast?

Gruss

Coffeebean
private Nachricht | Beiträge des Benutzers
MarsStein
myCSharp.de - Experte

Avatar #avatar-3191.gif


Dabei seit:
Beiträge: 3.170
Herkunft: Trier -> München

beantworten | zitieren | melden

Hallo,

wenn die Darstellung irgendwann so aussehen soll wie im Bildanhang, dann solltest Du Dir mal Graphics.RotateTransform ansehen. Damit werden dann auch die Zahlen entsprechend mitrotiert/gekippt.
Überhaupt ist diese Aufgabe damit viel einfacher lösbar, Du brauchst dann die ganzen Sinus/Cosinus Berchnungen nicht - du rotierst einfach die Zeichenebene immer weiter um einen bestimmten Winkel und kannst dadurch jede Zahl quasi immer an die selbe xy-Koordinate zeichnen.

Gruß, MarsStein
Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4.594

beantworten | zitieren | melden

Noch als Tipp:
Erzeuge dir aus deiner Methode DrawFace folgende Methode


void DrawNumbersInCircle(Graphics g, int radius, int startNumber, endNumber)
{
  // ...
}
Diese kannst du dann mit verschiedenen Radien und Zahlenwerten in einer Schleife aufrufen.
private Nachricht | Beiträge des Benutzers
Palin
myCSharp.de - Member



Dabei seit:
Beiträge: 1.090

beantworten | zitieren | melden

Hi Contace,

einmal kannst du hingehen und sagen es wird eine Zahl (N) angegeben bis zu der du die Werte von 1 in Kreise aufteilen möchtest und dann brauchst du noch die Anzahl der Kreise (K). N/K ergibt dann die Anzahl von Zahlen Pro Kreis (AK), hier brauchst du einen Teiler ohne Rest. Dann Teilst du 360° durch AK und bekommst den Winkel im den du immer wider Verschieben musst. Schau dir mal die Funktion von Mars Stein an)

[Edit]
Für den Nächsten Kreis fängst du dann natürlich ein Stück Höher an zu Zeichnen.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Palin am .
Sollte man mal gelesen haben:

Clean Code Developer
Entwurfsmuster
Anti-Pattern
private Nachricht | Beiträge des Benutzers
chilic
myCSharp.de - Experte



Dabei seit:
Beiträge: 2.111

beantworten | zitieren | melden

Was ich sagen wollte war:

float inches = Math.Min(Width / g.DpiX, Height / g.DpiX);
g.ScaleTransform(inches * g.DpiX / 2000, inches * g.DpiY / 2000);

wird zu

g.ScaleTransform(Math.Min(Width / g.DpiX, Height / g.DpiX) * g.DpiX / 2000, Math.Min(Width / g.DpiX, Height / g.DpiX) * g.DpiY / 2000);

und dann zu

g.ScaleTransform(Math.Min(Width, Height) / 2000, ...);

und falls du nicht beide male DpiX verwenden wolltest sondern im zweiten Ausdruck DpiY, dann vereinfacht sich das nochmal.
Du brauchst dich also nicht mit dpi rumschlagen, was bei der Darstellung auf dem Bildschirm oft sowieso nichts bringt.

Dann wollte ich ausdrücken, für weitere Hilfe fehlt eine konkrete Frage :-)
private Nachricht | Beiträge des Benutzers
Contace
myCSharp.de - Member



Dabei seit:
Beiträge: 5

Themenstarter:

beantworten | zitieren | melden

Hallo,

ich danke euch erstma allen für den tollen Support hier.


Ich hab mal mein resultat was ich bis jetzt habe angehängt.



Grüße
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Contace am .
Attachments
private Nachricht | Beiträge des Benutzers