2010-05-24 7 views
10

Ich muss einen Bogen mit GraphicsPath zeichnen und Anfangs-, Median- und Endpunkte haben. Der Bogen muss sie passieren.C# Zeichnungsbogen mit 3 Punkten

Ich versuchte. DrawCurve und DrawBezier, aber das Ergebnis ist nicht genau ein Bogen.

Was kann ich tun?

LÖSUNG:

Nach ein paar Stunden Codeschreiben ich es geschafft, zu zeichnen, was ich mit diesem Algorithmus (um 3 Punkte a, b, c und einen Graphic Pfad) wollte:

double d = 2 * (a.X - c.X) * (c.Y - b.Y) + 2 * (b.X - c.X) * (a.Y - c.Y); 
double m1 = (Math.Pow(a.X, 2) - Math.Pow(c.X, 2) + Math.Pow(a.Y, 2) - Math.Pow(c.Y, 2)); 
double m2 = (Math.Pow(c.X, 2) - Math.Pow(b.X, 2) + Math.Pow(c.Y, 2) - Math.Pow(b.Y, 2)); 
double nx = m1 * (c.Y - b.Y) + m2 * (c.Y - a.Y); 
double ny = m1 * (b.X - c.X) + m2 * (a.X - c.X); 
double cx = nx/d; 
double cy = ny/d; 
double dx = cx - a.X; 
double dy = cy - a.Y; 
double distance = Math.Sqrt(dx * dx + dy * dy); 
Vector va = new Vector(a.X - cx, a.Y - cy); 
Vector vb = new Vector(b.X - cx, b.Y - cy); 
Vector vc = new Vector(c.X - cx, c.Y - cy); 
Vector xaxis = new Vector(1, 0); 
float startAngle = (float)Vector.AngleBetween(xaxis, va); 
float sweepAngle = (float)(Vector.AngleBetween(va, vb) + Vector.AngleBetween(vb, vc)); 
path.AddArc(
    (float)(cx - distance), (float)(cy - distance), 
    (float)(distance * 2), (float)(distance * 2), 
    startAngle, sweepAngle); 
+1

meinst du einen Kreisbogen, oder wird jeder Bogen tun? –

+0

Rundschreiben, ich habe vergessen, dass – Keeper

Antwort

6

würde ich DrawArc() verwenden, wie von ANC_Michael vorgeschlagen. Um einen Bogen zu finden, der 3 Punkte durchläuft, wollen Sie den circumcircle des Dreiecks berechnen, das durch die Punkte gebildet wird.

Sobald Sie den Umkreis haben berechnen Sie eine Bounding Box für den Kreis mit DrawArc mit den Min/Max-Abmessungen (Center +/- Radius) zu verwenden. Berechnen Sie nun Ihre Start- und Stoppwinkel, indem Sie die Punkte so umrechnen, dass der Umkreis auf den Ursprung zentriert ist (durch -circumcenter) und das Skalarprodukt der normalisierten Start- und Endvektoren mit der X-Achse:

double startAngle = Math.Acos(VectorToLeftPoint.Dot(XAxis)); 
double stopAngle = Math.Acos(VectorToRightPoint.Dot(XAxis)); 

Beachten Sie, dass DrawArc Winkel im Uhrzeigersinn von der X-Achse erwartet. Fügen Sie daherhinzu, wenn der berechnete Vektor über der X-Achse liegt. Das sollte genug Informationen sein, um DrawArc() zu rufen.

Bearbeiten: Diese Methode findet einen Kreisbogen Arc und nicht unbedingt die 'beste Passform' Bogen abhängig von Ihrem erwarteten Endpunkt Verhalten.

0

Haben Sie die DrawArc-Methode ausprobiert und sehen, ob Sie Ihre 3 Punkte irgendwie manipulieren können?

vielleicht

Pen blackPen= new Pen(Color.Black, 3); 
// Create rectangle to bound ellipse. 
Rectangle rect = new Rectangle(initial x, initial y, final x, median y); 
// Create start and sweep angles on ellipse. 
float startAngle = 0F; 
float sweepAngle = 270.0F; 
// Draw arc to screen. 
e.Graphics.DrawArc(blackPen, rect, startAngle, sweepAngle); 

http://msdn.microsoft.com/en-us/library/system.drawing.graphics.drawarc%28VS.71%29.aspx

+0

Ich habe nicht die Winkel und ich weiß nicht, wie man sie berechnet und die Punkte können an jedem Ort sein (sie werden von AutoMap 3D in FDO innerhalb von Oracle exportiert) – Keeper

Verwandte Themen