Laden...

Mehrere Kreise mit Nummern erstellen

Erstellt von Contace vor 5 Jahren Letzter Beitrag vor 5 Jahren 2.368 Views
C
Contace Themenstarter:in
5 Beiträge seit 2018
vor 5 Jahren
Mehrere Kreise mit Nummern erstellen

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);
    }

}
C
Contace Themenstarter:in
5 Beiträge seit 2018
vor 5 Jahren

mein bisheriges ergebniss im Anhang.

Grüße

C
Contace Themenstarter:in
5 Beiträge seit 2018
vor 5 Jahren

Hab das Problem behoben.

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

Grüße

C
2.121 Beiträge seit 2010
vor 5 Jahren

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.

C
Contace Themenstarter:in
5 Beiträge seit 2018
vor 5 Jahren

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

2.207 Beiträge seit 2011
vor 5 Jahren

Hallo 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

3.170 Beiträge seit 2006
vor 5 Jahren

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

4.931 Beiträge seit 2008
vor 5 Jahren

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.

P
1.090 Beiträge seit 2011
vor 5 Jahren

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.

Sollte man mal gelesen haben:

Clean Code Developer
Entwurfsmuster
Anti-Pattern

C
2.121 Beiträge seit 2010
vor 5 Jahren

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 😃

C
Contace Themenstarter:in
5 Beiträge seit 2018
vor 5 Jahren

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