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);
}
}
Hab das Problem behoben.
Wie könnte ich jetzt mehrere Kreise mit Nummern erstellen ?
Grüße
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.
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
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
Microsoft MVP // Me // Blog // GitHub // @Egghead // All my talks // Speakerdeck
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
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.
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:
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 😃
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