Ich möchte meine Antwort in C# basierend auf der Antwort von Marcelo Cantos beitragen, da der Algorithmus sehr gut funktioniert. Ich habe ein Programm geschrieben, um den Schwerpunkt eines auf das CCD-Array projizierten Laserstrahls zu berechnen. Nachdem der Schwerpunkt gefunden wurde, wird die Richtungswinkellinie gezeichnet und ich brauche den Pfeilkopf, der auf diese Richtung zeigt. Da der Winkel berechnet wird, müsste der Pfeilkopf dem Winkel in irgendeiner Richtung folgen.
Dieser Code Ihnen die Flexibilität der Änderung des Pfeilkopfgröße gibt, wie in den Abbildungen gezeigt.
Zuerst benötigen Sie die Vektorstruktur mit allen notwendigen Operatoren überladen.
private struct vec
{
public float x;
public float y;
public vec(float x, float y)
{
this.x = x;
this.y = y;
}
public static vec operator -(vec v1, vec v2)
{
return new vec(v1.x - v2.x, v1.y - v2.y);
}
public static vec operator +(vec v1, vec v2)
{
return new vec(v1.x + v2.x, v1.y + v2.y);
}
public static vec operator /(vec v1, float number)
{
return new vec(v1.x/number, v1.y/number);
}
public static vec operator *(vec v1, float number)
{
return new vec(v1.x * number, v1.y * number);
}
public static vec operator *(float number, vec v1)
{
return new vec(v1.x * number, v1.y * number);
}
public float length()
{
double distance;
distance = (this.x * this.x) + (this.y * this.y);
return (float)Math.Sqrt(distance);
}
}
Dann können Sie den gleichen Code von Marcelo Cantos gegeben, aber ich machte die Länge und half_width der Pfeilkopfvariablen, so dass Sie die definieren, wann die Funktion aufrufen.
private void arrowhead(float length, float half_width,
vec A, vec B, ref vec v1, ref vec v2)
{
float h = length * (float)Math.Sqrt(3);
float w = half_width;
vec U = (B - A)/(B - A).length();
vec V = new vec(-U.y, U.x);
v1 = B - h * U + w * V;
v2 = B - h * U - w * V;
}
Jetzt können Sie die Funktion wie folgt aufrufen:
vec leftArrowHead = new vec();
vec rightArrowHead = new vec();
arrowhead(20, 10, new vec(circle_center_x, circle_center_y),
new vec(x_centroid_pixel, y_centroid_pixel),
ref leftArrowHead, ref rightArrowHead);
In meinem Code ist der Kreismitte der erste Vektor Stelle (Pfeil Po) und der centroid_pixel ist der zweite Vektor Stelle (Pfeil Kopf).
Ich zeichne die Pfeilspitze durch Speichern der Vektorwerte in den Punkten für Grafiken.DrawPolygon() -Funktion in den System.Drawings.Code ist unten dargestellt:
Point[] ppts = new Point[3];
ppts[0] = new Point((int)leftArrowHead.x, (int)leftArrowHead.y);
ppts[1] = new Point(x_cm_pixel,y_cm_pixel);
ppts[2] = new Point((int)rightArrowHead.x, (int)rightArrowHead.y);
g2.DrawPolygon(p, ppts);
Um zu klären - ist das Ende der Linie in der Mitte der Basis der Pfeilspitze, oder ist es an der Spitze der Spitze des Pfeils? – Chowlett
Es ist die Spitze der Pfeilspitze –