2013-07-08 38 views
5

Questo potrebbe aver avuto risposta prima, scusa se lo ha. Fondamentalmente ho bisogno di ottenere l'angolo da origine a punto. Quindi diciamo L'origine è (0, 0) e il mio punto di riferimento è (3, 0).Ottieni l'angolo tra il punto e l'origine

ore 3 = 90 gradi

ore 6 = 180 gradi

ore 9 = 270 gradi

12 O'clock = 0 gradi


In qualche modo, devo fare un po 'di magia matematica, e scoprire che l'angolo è di 90 gradi (la cima è 0). L'origine può variare, quindi ho bisogno di un metodo con due parametri, Origine e TargetPoint, che restituisce il doppio angolo in gradi.

Sì, mi rendo conto che sembra corto e nonconstructive, ma ho fatto la domanda più semplice e comprensibile possibile. Tutti gli altri questioni sono state chiuse -.-

Grazie

+3

Un angolo è tra due linee ... non due punti, a meno che non parli dell'angolo di una linea per dire, il mondo stesso? Inoltre ... è questo per i compiti? – LightStriker

+0

No, ho bisogno dell'angolo tra l'origine e un punto. Consideralo come un orologio, 3 in punto è di 90 gradi rispetto all'origine (al centro). No, sto lavorando a un gioco. – Dave

+1

@LightStriker Perché le persone hanno così tanti problemi a comprendere questa domanda? Di ** COURSE ** non puoi _technically_ avere un angolo tra due punti, ma perché è così difficile capire che molti programmatori non sono stati istruiti su questo? Tutto quello che sanno è che hanno 0 gradi e hanno bisogno di trovare un angolo che faccia un punto sprite su un altro sprite. La maggior parte dei programmatori che fanno questa domanda semplicemente non hanno lo sfondo matematico per cogliere il concetto di aver bisogno di tre punti (o due linee, se vuoi) per un angolo. [/ rant] – Clonkex

risposta

11

Il vettore tra due punti A e B è B-A = (B.x-A.x, B.y-A.y). L'angolo tra due vettori può essere calcolato con dot product o atan2.

var vector2 = Target - Origin; 
var vector1 = new Point(0, 1) // 12 o'clock == 0°, assuming that y goes from bottom to top 

double angleInRadians = Math.Atan2(vector2.Y, vector2.X) - Math.Atan2(vector1.Y, vector1.X); 

Vedi anche Finding Signed Angle Between Vectors

+1

Quindi: 'Math.Atan2 (Origin.Y - Target.Y, Origin.X - Target.X);'? E questo sono i radianti, giusto? – Dave

+0

@ user2544245: sono necessari ** due ** vettori. Il secondo vettore punta nella direzione che vuoi rappresentare 0 °. In senso orario, sì. La tua formula è sbagliata, però. –

+0

Nella tua formula, importa quale è Origine e quale è Target? – Dave

1

Supponendo x è positivo, qualcosa di simile:

angle = Math.Atan(y/x) * 180/Math.PI + 90 

cura per consentire negativi x valori:

Se può essere negativo, basta fare per caso. Qualcosa di simile a questo:

if (x < 0) { 
    angle = 270 - (Math.Atan(y/-x) * 180/Math.PI); 
} else { 
    angle = 90 + (Math.Atan(y/x) * 180/Math.PI); 
} 
+0

Bene X e Y possono essere positivi o negativi. – Dave

+2

Non farlo votare, sta solo cercando di aiutare. – Dave

0
public static double GetAngleDegree(Point origin, Point target) { 
    var n = 270 - (Math.Atan2(origin.Y - target.Y, origin.X - target.X)) * 180/Math.PI; 
    return n % 360; 
} 

static void Main(string[] args) 
{ 
    Console.WriteLine(GetAngleDegree(new Point(0, 0), new Point(0, 3)));//0 
    Console.WriteLine(GetAngleDegree(new Point(0, 0), new Point(3, 0)));//90 
    Console.WriteLine(GetAngleDegree(new Point(0, 0), new Point(0, -3)));//180 
    Console.WriteLine(GetAngleDegree(new Point(0, 0), new Point(-3, 0)));//270 
} 
+1

Sembra che vada in senso antiorario, con ** (0, 3) ** pari a 0 gradi. – Dave

+0

Questa è la soluzione perfetta per ordinare i punti per angolo. –

0

In realtà non v'è alcun modo per scoprire l'angolo tra il punto e l'origine a causa del fatto che l'origine è (0,0). Possiamo calcolare l'angolo tra 2 punti perché sono trattati come vettori e come tali hanno una direzione, ma l'origine non ha direzione. Per questo motivo, se si desidera trovare l'angolo utilizzando l'esempio di un orologio, è possibile calcolare l'angolo tra il punto e (1,0) ad esempio il punto a 0 gradi.

Mi dispiace io non sono esperto in C#, ma si può dare un'occhiata a questo codice java che è simile:

double getAngle2PointsRad(double p1_x, double p1_y, double p2_x, double p2_y) { 
    return Math.acos((((p1_x * p2_x) + (p1_y * p2_y))/(Math.sqrt(Math.pow(p1_x, 2) + Math.pow(p1_y, 2)) * Math.sqrt(Math.pow(p2_x, 2) + Math.pow(p2_y, 2))))); 
} 

double getAngle2PointsDeg(double p1_x, double p1_y, double p2_x, double p2_y) { 
    return Math.acos((((p1_x * p2_x) + (p1_y * p2_y))/(Math.sqrt(Math.pow(p1_x, 2) + Math.pow(p1_y, 2)) * Math.sqrt(Math.pow(p2_x, 2) + Math.pow(p2_y, 2))))) * 180/Math.PI; 
} 

Se si tenta di calcolare utilizzando (0,0) si otterrà NaN perché cerca di dividere per zero.