PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C#: Arc zeichnen mittels StartPoint, EndPoint und CenterPoint?


Elemental
2010-11-04, 16:10:34
Hallo zusammen,
ich versuche gerade einen Bogen zu zeichnen, allerdings lassen mich meine Mathematik-Kenntnisse hier im Stich ;(

Ich habe aus einer Gerber-Datei die Bescheibung eines Bogens ausgelesen. Allerdings liefert mir das Gerber-Format nur Start-Punkt, End-Punkt und den Center-Punkt des Bogens.

Wie rechne ich das jetzt um, um mittels
System.Drawing.Graphic.DrawArc (http://msdn.microsoft.com/de-de/library/system.drawing.graphics.drawarc%28v=VS.80%29.aspx)
einen Bogen zu zeichnen? :confused:

Wäre für etwas Hilfe echt dankbar! Ich versuche schon ein paar Stunden vergeblich das hin zu kriegen ;(

mfG
Elemental

Monger
2010-11-04, 19:01:57
Ohne Gewähr (Mathe ist auch nicht meine Stärke):

Du kannst einen Bogen nur dann durch drei Punkte definieren, wenn du annimmst dass er einen stetigen Verlauf hat, sprich: die Steigung am Mittelpunkt nach links ist genau die selbe wie spiegelverkehrt nach rechts.

Das nennt man wohl eine Quadratische Bézierkurve (http://de.wikipedia.org/wiki/B%C3%A9zierkurve#Lineare_B.C3.A9zierkurven_.28n.3D1.29).

Was die Arc Methode dagegen verlangt, ist wohl eher eine kubische Bézierkurve, weil man damit viel flexibler ist.

Für deinen Fall kannst du ja mal P1 = P2 bzw. Ausgangswinkel gleich Eingangswinkel annehmen. Die Winkel musst du halt übern Satz des Pythagoras dir erstmal aus deinen drei Punkten ausrechnen.

RattuS
2010-11-04, 19:55:46
Schau dir auch mal GraphicsPath und dessen Methoden an. Damit dürfte dein Vorhaben recht leicht umzusetzen sein.

Elemental
2010-11-04, 20:47:45
Also so, wie ich das Gerber-Format verstehe, sind da keine 3 Punkte auf der Kurve definiert.
Man hat den Anfangs- und den Endpunkt, sowie den Punkt, an dem man quasi den Zirkel ansetzt, um einen Kreis durch die zwei anderen Punkte zu zeichnen.

siehe hier
http://www.tormach.com/machine_codes.html
unter "G02 and G03 - Arc at Feed Rate"


edit:
Weiter als bis hier bin ich noch nicht gekommen ;(

internal class Arc : Operation
{
internal double m_dStartX = 0.0;
internal double m_dStartY = 0.0;
internal double m_dEndX = 0.0;
internal double m_dEndY = 0.0;
internal double m_dCenterX = 0.0;
internal double m_dCenterY = 0.0;

internal Arc()
{
}

private double Radius
{
get
{
double x = m_dCenterX - m_dStartX;
double y = m_dCenterY - m_dStartY;

return Math.Sqrt(x*x + y*y);
}
}

internal override bool AddGraphicsPath(GraphicsPath graphicsPath)
{
float fStartX = (float)this.m_dStartX;
float fStartY = (float)this.m_dStartY;
float fWidth = 0;
float fHeight = 0;
float fStartAngle = 0;
float fSweepAngle = 0;

graphicsPath.AddArc(fStartX, fStartY, fWidth, fHeight, fStartAngle, fSweepAngle);
}
}

DocEW
2010-11-16, 10:10:22
Also, als Mittelpunkt des Rechtecks (bei DrawArc) nimmst du den Mittelpunkt des Kreises. Jetzt musst du nur noch die Koordinaten von Start- und Endpunkt in Winkel bzgl. der x-Achse umrechnen: Bei einem Mittelpunkt (x_m, y_m) und für einen Punkt (x,y) hast du einen Radius von r=sqrt((x_m-x)²+(y_m-y)²) und daher ist dann der Winkel alpha = sin^-1( (y_m-y)/r ). Der Winkel vom Startpunkt ist dann das zweite Argument für DrawArc. Die Differenz der Winkel von Start- und Endpunkt ist das dritte Argument ("sweepAngle").

Alles ungetestet, aber sollte zumindest in die richtige Richtung führen.