Frage zu einer Kreisfunktion c#

snogi

Neuling
Thread Starter
Mitglied seit
07.09.2009
Beiträge
10
Hallo,

ich habe eine Frage zur unserer selbst geschriebenen Kreisfunktion.

Code:
public void Kreis(ref float Xstart,ref float Ystart, float groesse, double winkel, float winkelstart,ref Graphics g)
        {
          float wertx = groesse; //zuweisung des Feldes "Größe"
          float werty = groesse; //zuweisung des Feldes "Größe"

          double endpunktX;
          double endpunktY;

          double w = (Math.PI * winkelstart)/180;
          string wi = Convert.ToString(w);
          float Zwinkel = float.Parse(wi);

          if(winkelstart== 90 && winkel==90)
          {
             endpunktX = (groesse / 2 * Math.Sin(Zwinkel))*x;
             endpunktY = groesse  / 2 * Math.Cos(Zwinkel);
          }
          else 
          {
             endpunktX = (groesse / 2) * (Math.Sin(Zwinkel));
             endpunktY = groesse  / 2 * Math.Cos(Zwinkel);
          }

          string winkel1 = Convert.ToString( winkel );
          float winkel2 = float.Parse( winkel1 );
          float winkelende = winkelstart + winkel2;  //überprüfungsvariable für die Winkelgröße

          string Xendpunkt = Convert.ToString(endpunktX);
          float Xend = float.Parse( Xendpunkt );
          string Yendpunkt = Convert.ToString(endpunktY);
          float Yend = float.Parse( Yendpunkt );           
          
          double Xende = (groesse/2*(Math.Cos(winkelende*(Math.PI / 180))));
          double Yende = (groesse/2*(Math.Sin(winkelende * (Math.PI / 180))));

          Yende = Math.Round( Yende,3 );
          Xende = Math.Round( Xende,3 );


Unser Problem ist jetzt das wir immer von oben nach unten Zeichnen müssen.
Also wenn wir ein "C" zeichnen wollen, müssen wir oben rechts anfangen und nach unten rechts zeichnen. Unterbrechen können wir die Zeichen Methode nicht, auch unsichtbare Strichen können wir nicht zeichnen (Projektbedingt).
So wie es jetzt läuft zeichnet das Programm von unten nach oben war wir einfach umdrehen müssen.

Wenn jemand eine Idee hat bitte posten.

lg snogi
 
Wenn Du diese Anzeige nicht sehen willst, registriere Dich und/oder logge Dich ein.
Code:
          double w = (Math.PI * winkelstart)/180;
          string wi = Convert.ToString(w);
          float Zwinkel = float.Parse(wi);
...
Also.. nicht, dass ich C# könnte, aber srsly, wtf?
 
Zuletzt bearbeitet:
Die Funktion ist nicht vollständig. Im moment zeichnet sie überhaupt nicht sondern berechnet nur ein paar sachen. Ich warte noch auf den Teil wo Graphics g verwendet wird.

asdfman hat aber völlig Recht: wtf?
 
Das Graphics Objekt habe ich nur nicht mit reinkopiert. Zeichnen tut er ja, aber halt nicht richtug herum, so wie beschrieben.

aber srsly? was soll das heißen?

lg
 
asdfman wollte wissen warum du aus einem Double einen String machst und daraus wiederum einen float ;) (falls das noch nicht klar wurde)
 
weil es eine direkte umwandlung von double in float nicht gibt.
 
ich kann c# nicht, aber in Java geht das u.a. so:
double d = 12345
float f = (float)d

Sowas ähnliches gibts doch in C# evtl auch?
 
ja, typencasting sollte auch in c# funktionieren
 
Das hat ja nichts mit hellsehen zu tun ;)

es geht nur darum das die Kreisfunktion die wir haben immer im Uhrzeigersin zeichnet, wir brauchen sie aber so das sie andersherum zeichnet.
 
Mangels Quellcode bleibt mir aber nur das Hellsehen übrig...

Ich sehe an dem Quellcode nur 2 Dinge.
1. Die Funktion zeichnet nicht -> wir können deine Frage nicht beantworten.
2. Du wandelst die Datentypen etwas umständlich um. -> Wer weiß welche Funktionen du zum zeichnen verwendest.
 
namespace Projekt
{
class Methoden
{
//Deklaration der Variablen und Graphic Objekte
public double hoehe;
public double ypunkt;
public double lange;
public const float xWert = 8F;
public const float umrechnung = 420 / (8F * 2);
Pen stift = new Pen(Color.Black, 0.03f); //Linen-Eigenschaft für Koord.-Kreuz + Linien
Pen unsicht = new Pen(Color.White, 0.03f); //Linen-Eigenschaft für Koord.-Kreuz + Linien
Pen gitter = new Pen(Color.LightGray, 0.02f); //Linen-Eigenschaft für Koord.-Gitter
Font besch = new Font("Arial", 0.3f); //Beschrieftung des Koord.
Brush pinsel = new SolidBrush(Color.Black); //Pinsel-Eigendschaft für Koord.
public int x = -1; //Vorzeichenwechsel für y-Koordinate


public void Koord(ref Graphics g)
{
//Deklaration der Variablen und Graphic Objekte
g.ScaleTransform(umrechnung, umrechnung);
g.TranslateTransform(xWert, xWert);

//Schleife für Koord.-Gitter
for (int i = 1; i < (xWert * 2); i++)
{
g.DrawLine(gitter, -(xWert) + i, xWert, (-(xWert)) + i, -(xWert));
g.DrawLine(gitter, -(xWert), xWert - i, xWert, xWert - i);
}

//Koord. Kreuz
g.DrawLine(stift, 0F, xWert, 0F, -(xWert));
g.DrawLine(stift, -xWert, 0F, xWert, 0F);

//Koord-Beschriftung
g.DrawString("+5", besch, pinsel, 0F, (5F * x));
g.DrawString("+5", besch, pinsel, 5F, (0F * x));
g.DrawString("-5", besch, pinsel, 0F, (-5F * x));
g.DrawString("-5", besch, pinsel, -5F, (0F * x));
g.DrawString("+10", besch, pinsel, 0F, (10F * x));
g.DrawString("+10", besch, pinsel, 10F, (0F * x));
g.DrawString("-10", besch, pinsel, 0F, (-9.6F * x));
g.DrawString("-10", besch, pinsel, -10F, (0F * x));
g.DrawString("0", besch, pinsel, 0F, 0F * x);
}
public void Strich(ref float startx, ref float starty, double distanz, double winkel, ref Graphics g)
{
winkel = winkel * 2 * Math.PI / 360;
hoehe = distanz * Math.Sin(winkel);
lange = distanz * Math.Cos(winkel);

distanz = lange + startx;
ypunkt = hoehe + starty;

string Shoehe = Convert.ToString(hoehe);
float Zhoehe = float.Parse(Shoehe);
string Sdistanz = Convert.ToString(distanz);
float Zdistanz = float.Parse(Sdistanz);
string Sypunkt = Convert.ToString(ypunkt);
float Zypunkt = float.Parse(Sypunkt);

//g.ScaleTransform(umrechnung, umrechnung);
//g.TranslateTransform(xWert, xWert);
g.DrawLine(stift, startx, starty * x, Zdistanz, Zypunkt * x);

startx = Zdistanz;
starty = Zypunkt;

}

public void Kreis1(ref float Xstart, ref float Ystart, float groesse, double winkel, float winkelstart, ref Graphics g)
{
// Funktion fuktioniert nur gegen den Uhrzeigersinn!
int schritte = Convert.ToInt16(winkelstart);
float x1, x2, y1, y2, hilfx, hilfy;
x1 = Xstart;
y1 = Ystart;
int y = schritte;
float winkel1 = float.Parse(Convert.ToString(winkel));
float winkelende = float.Parse(Convert.ToString(y)) + winkel1;
double Xende = (groesse / 2 * (Math.Cos(winkelende * (Math.PI / 180))));
double Yende = (groesse / 2 * (Math.Sin(winkelende * (Math.PI / 180))));
x2 = float.Parse(Convert.ToString(Xende + Xstart));
y2 = float.Parse(Convert.ToString(Ystart - Yende));
x1 = x2;
y1 = y2;
int i = schritte;
do
{
winkel1 = float.Parse(Convert.ToString(winkel));
winkelende = float.Parse(Convert.ToString(i)) + winkel1;
Xende = (groesse / 2 * (Math.Cos(winkelende * (Math.PI / 180))));
Yende = (groesse / 2 * (Math.Sin(winkelende * (Math.PI / 180))));
x2 = float.Parse(Convert.ToString(Xende + Xstart));
y2 = float.Parse(Convert.ToString(((Yende * x) + Ystart)));
g.DrawLine(stift, x1, y1 * x, x2, y2 * x);
hilfx = x1;
hilfy = y1;
x1 = x2;
y1 = y2;
i = i - 1;
} while (i != 1);
Xstart = hilfx;
Ystart = hilfy;
//MessageBox.Show(" x: " + Xstart + " y: " + Ystart);
}
public void Kreis(ref float Xstart, ref float Ystart, float groesse, double winkel, float winkelstart, ref Graphics g)
{
// Funktion fuktioniert nur im Uhrzeigersinn!
float wertx = groesse; //zuweisung des Feldes "Größe"
float werty = groesse; //zuweisung des Feldes "Größe"
double endpunktX;
double endpunktY;
float Zwinkel = float.Parse(Convert.ToString(((Math.PI * winkelstart) / 180)));

if(winkelstart== 90 && winkel==90)
{
endpunktX = (groesse / 2 * Math.Sin(Zwinkel))*x;
endpunktY = (groesse / 2 * Math.Cos(Zwinkel));
}
else
{
endpunktX = (groesse / 2 * Math.Sin(Zwinkel));
endpunktY = (groesse / 2 * Math.Cos(Zwinkel));
}

float winkel1 = float.Parse(Convert.ToString( winkel ));
float winkelende = winkelstart + winkel1; //überprüfungsvariable für die Winkelgröße

float Xend = float.Parse(Convert.ToString(endpunktX));
float Yend = float.Parse(Convert.ToString(endpunktY));

double Xende = (groesse/2*(Math.Cos(winkelende*(Math.PI / 180))));
double Yende = (groesse/2*(Math.Sin(winkelende * (Math.PI / 180))));

Yende = Math.Round( Yende,3 );
Xende = Math.Round( Xende,3 );

if ( winkelende <= 360 )
{
g.DrawArc(stift, (Xstart - wertx / 2), (Ystart * x) - (werty / 2) + (groesse / 2), wertx, werty, winkelstart, winkel1);
}
else
{
MessageBox.Show( "Winkelsumme ist über 360. Bitte geben Sie neue Winkelwerte ein. \n\t\t MFG Team Laserscanner" );
}
//if (Xstart != 0 && Ystart != 0)
//{
// MessageBox.Show("x: " + (Xende + Xstart) + " y: " + ((Yende * x) + Ystart));
//}
//else if (Xstart != 0 && Ystart == 0)
//{
// MessageBox.Show("x: " + (Xende + Xstart) + " y: " + ((Yende * x) + Ystart));
//}
//else if (Xstart == 0 && Ystart != 0)
//{
// MessageBox.Show("x: " + (Xende + Xstart) + " y: " + ((Yende * x) + Ystart));
//}
//else if (winkelstart != 0)
//{
// MessageBox.Show(" x: " + (Xende + Xstart) + " y: " + ((Yende * x) + Ystart));
//}
//else
//{
// MessageBox.Show("x: " + Xende + " y: " + Yende * x);
//}
}


public void aZeichnen(ref Punkt start,ref Graphics g)
{
Strich(ref start.x, ref start.y, 2.1, 70, ref g);
Strich(ref start.x, ref start.y, 1.1, 290, ref g);
Strich(ref start.x, ref start.y, 0.75, 180, ref g);
Strich(ref start.x, ref start.y, 0.75, 0, ref g);
Strich(ref start.x, ref start.y, 1, 290, ref g);
start.x += 0.3f;

}

Und hier der Aufruf der Buchstaben.

namespace Projekt
{
struct Punkt { public float x, y; }

public partial class FrmMain : Form
{
public FrmMain()
{
InitializeComponent();

}

Methoden m1 = new Methoden();


private void btn_Zeichnen_Click(object sender, EventArgs e)
{
Graphics g = Graphics.FromHwnd(panel1.Handle);
Punkt start;
panel1.Refresh();
m1.Koord(ref g);
string oben = txt_ObenText.Text; //auslesen des Textfeldes
int anzahl = oben.Length; //ließt die Länge des Textfeldes aus
string[] obenArray = new string[anzahl]; //string Array wird erzeugt

oben = oben.ToUpper(); // alle Buchstaben GROSS

for (int i = 0; i < anzahl; i++) //Schleife-solange wir das Wort ist
{
obenArray = Convert.ToString(oben); //einzelne Buchstaben in Array speichern
}
start.x = -7.0f; start.y = 3.0f;

foreach (string a in obenArray) //Schleife-einzelne Buchstaben in a speichern
{
switch (a) //auswahl welcher Buchstabe in a ist
{
case "A":
m1.aZeichnen( ref start,ref g);
break;



Hoffe damit könnt ihr etwas mehr anfangen;)
 
Ja das sieht besser aus.

Code:
public void Kreis(ref float Xstart, ref float Ystart, float groesse, double winkel, float winkelstart, ref Graphics g)
{
	// Funktion fuktioniert nur im Uhrzeigersinn!
	float wertx = groesse; //zuweisung des Feldes "Größe"
	float werty = groesse; //zuweisung des Feldes "Größe"

	double endpunktX;
	double endpunktY; 
	float Zwinkel = float.Parse(Convert.ToString(((Math.PI * winkelstart) / 180))); 

	if(winkelstart== 90 && winkel==90)
	{
		endpunktX = (groesse / 2 * Math.Sin(Zwinkel))*x;
		endpunktY = (groesse / 2 * Math.Cos(Zwinkel));
	}
	else 
	{
		endpunktX = (groesse / 2 * Math.Sin(Zwinkel));
		endpunktY = (groesse / 2 * Math.Cos(Zwinkel));
	}

	float winkel1 = float.Parse(Convert.ToString( winkel )); 
	float winkelende = winkelstart + winkel1; //überprüfungsvariable für die Winkelgröße

	float Xend = float.Parse(Convert.ToString(endpunktX)); 
	float Yend = float.Parse(Convert.ToString(endpunktY)); 

	double Xende = (groesse/2*(Math.Cos(winkelende*(Math.PI / 180))));
	double Yende = (groesse/2*(Math.Sin(winkelende * (Math.PI / 180))));

	Yende = Math.Round( Yende,3 );
	Xende = Math.Round( Xende,3 ); 

	if ( winkelende <= 360 )
	{
		g.DrawArc(stift, (Xstart - wertx / 2), (Ystart * x) - (werty / 2) + (groesse / 2), wertx, werty, winkelstart, winkel1); 
	}
	else
	{
		MessageBox.Show( "Winkelsumme ist über 360. Bitte geben Sie neue Winkelwerte ein. \n\t\t MFG Team Laserscanner" );
	}
}

1. Warum berechnest du einen haufen Werte wenn du zum Zeichnen nur die ersten 3 Zeilen benötigst (Kommentar mitgerechnet)?
2. Muss die Winkelsumme nicht <=360° sein. Beispiel: Halbkreis vom 4. in den 1. Quadranten. Winkelstart 270° + Winkel 180°. DrawArc dürfte das egal sein. Sollte eigentlich keine Probleme geben. Durch deine Abfrage verhinderst du das aber. Hat das irgend einen Grund?
3. Sollte die Funktion entgegen des Uhrzeigersinns zeichnen, wenn du einfach einen negativen Winkel angibst. Versuch das einfach mal. Im schlimmsten Fall gibt es eine Fehlermeldung. MSDN (http://msdn.microsoft.com/de-de/library/ms142028.aspx) hat ein Beispiel. Start ist bei 45° und 270° sollen es werden. Das ergibt einen Halbkreis der zwischen +-45° offen bleibt. Damit das ganze entgegen des Uhrzeigersinnes zeichnet, musst du nur 360-Startwinkel als Start übergeben und den zu zeichnenden Winkel mit einem negativen Vorzeichen versehen. Rein rechnerisch sollte das den gewünschten Effekt erziehlen.
4. Warum überhaupt der Aufwand? In welche Richtung der Halbkreis nun gezeichnet wird, spielt bei der Funktion doch überhaupt keine Rolle. Halbkreis bleibt Halbkreis egal in welche Richtung gezeichnet wird. Es ist praktisch egal ob gegen oder im Uhrzeigersinn. Vor dem Funktionsaufruf ist der Kreis nicht vorhanden und danach ist er komplett vorhanden. In welche Richtung er intern zeichnet dürfte für dich eigentlich keine Rolle spielen.

Edit: Moment mal. Die Funktion zeichnet doch entgegen des Uhrzeigersinnes. Ich lasse mich hier gerade von deinen Kommentaren verwirren... Ändert aber nichts an der Lösung. Entweder die Funktion kann mit negativen Winkeln umgehen oder du kannst immer nur in eine Richtung zeichnen. Etwas anderes lässt diese Funktion nicht zu. Wie gesagt ist es sowieso egal in welche Richtung er zeichnet. Macht am Ende überhaupt keinen Unterschied. Das Ergebnis bleibt das gleiche.
 
Zuletzt bearbeitet:
Hardwareluxx setzt keine externen Werbe- und Tracking-Cookies ein. Auf unserer Webseite finden Sie nur noch Cookies nach berechtigtem Interesse (Art. 6 Abs. 1 Satz 1 lit. f DSGVO) oder eigene funktionelle Cookies. Durch die Nutzung unserer Webseite erklären Sie sich damit einverstanden, dass wir diese Cookies setzen. Mehr Informationen und Möglichkeiten zur Einstellung unserer Cookies finden Sie in unserer Datenschutzerklärung.


Zurück
Oben Unten refresh