Voglio contribuire con la mia risposta in C# basata sulla risposta di Marcelo Cantos poiché l'algoritmo funziona molto bene. Ho scritto un programma per calcolare il centroide di un raggio laser proiettato sull'array CCD. Dopo che il baricentro è stato trovato, viene disegnata la linea dell'angolo di direzione e ho bisogno che la freccia punta in quella direzione. Poiché l'angolo è calcolato, la testa della freccia dovrebbe seguire l'angolo in qualsiasi direzione.
Questo codice offre la flessibilità di cambiare la dimensione della testa freccia, come mostrato nelle immagini.
Innanzitutto occorre la struttura vettoriale con tutti gli operatori necessari per il sovraccarico.
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);
}
}
Quindi è possibile utilizzare lo stesso codice data dal Marcelo Cantos, ma ho fatto la lunghezza e half_width delle variabili testa freccia in modo che è possibile definire che quando si chiama la funzione.
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;
}
Ora è possibile richiamare la funzione in questo modo:
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);
Nel mio codice, il centro del cerchio è la prima posizione vettore (freccia testa), e il centroid_pixel è la seconda posizione vettore (freccia capo).
Disegno la punta della freccia memorizzando i valori vettoriali nei punti per la funzione graphics.DrawPolygon() in System.Drawings.Codice è la seguente:
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);
Per chiarire: è la fine della linea nel punto centrale della base della punta della freccia, oppure è sulla punta della punta della freccia? – Chowlett
È la punta della punta di freccia –