2009-03-23 19 views
35

Immagino che questa sia una domanda semplice, ma sto ottenendo risultati strani con il mio codice corrente e non ho lo sfondo matematico per capire appieno il perché. Il mio obiettivo è semplice, come affermato nel titolo: voglio solo trovare il punto a una certa distanza e angolo da un punto centrale.Calcolo del punto sulla circonferenza del cerchio dall'angolo in C#?

mio codice corrente:

Point centerPoint = new Point (0, 0); 
Point result  = new Point (0, 0); 
double angle  = 0.5; //between 0 and 2 * PI, angle is in radians 
int distance  = 1000; 

result.Y = centerPoint.Y + (int)Math.Round(distance * Math.Sin(angle)); 
result.X = centerPoint.X + (int)Math.Round(distance * Math.Cos(angle)); 

In generale, questo sembra funzionare ragionevolmente ragionevolmente, ma ottengo problemi in vari punti, in particolare quando l'angolo corrispondente a punti in x negative e sull'asse y. Chiaramente sto facendo qualcosa di sbagliato - pensieri su cosa sia?

AGGIORNAMENTO: Questo è stato un mio errore, questo codice funziona correttamente: i pochi valori anomali che non funzionavano erano in realtà dovuti a un errore nel calcolo dell'angolo per 1.5PI. Pensavo di averlo controllato abbastanza bene, ma evidentemente no. Grazie a tutti per il loro tempo, speriamo che il codice sopra riportato si riveli utile a qualcun altro.

+0

Cosa vuol dire "Ho problemi in vari punti"? –

+0

centerPoint è intenzionalmente inutilizzato? Non si dovrebbero aggiungere centerPoint.X e .Y al risultato? – spender

+0

puoi fornire un esempio di problema? –

risposta

29

Hai dimenticato di aggiungere il punto centrale:?

result.Y = (int)Math.Round(centerPoint.Y + distance * Math.Sin(angle)); 
result.X = (int)Math.Round(centerPoint.X + distance * Math.Cos(angle)); 

il resto dovrebbe essere ok ... (cosa strani risultati sono stati ottenendo Puoi dare un input esatto?)

+0

Ah, questo è un buon punto sul punto centrale: non è utilizzato in questo caso. Il punto specifico su cui sto lavorando attualmente è con un punto centrale di 0,0, quindi in questo caso è irrilevante, ma in altri casi farebbe sicuramente la differenza. Ho aggiornato l'esempio per includerlo correttamente. – x4000

6

In primo luogo, dal momento che siete in radianti è probabilmente utile per definire l'angolo in quanto tale:

double angle = (Math.PI/3); // 60 degrees... 

Le funzioni stesse sono funzionare bene. L'arrotondamento influirà solo sulla tua risposta se la tua distanza è sufficientemente piccola. Oltre a questo, le risposte dovrebbero uscire bene.

Se è l'arrotondamento siete preoccupati, ricordate che per impostazione predefinita, .NET fa banker's rounding, e si consiglia:

result.X = (int)Math.Round(centerPoint.X + distance * Math.Cos(angle), MidpointRounding.AwayFromZero); 
result.Y = (int)Math.Round(centerPoint.Y + distance * Math.Sin(angle), MidpointRounding.AwayFromZero); 

invece.

Inoltre, nella domanda si desidera distanza X e angolo Y ... presumo che non si sta relazionando al punto (X,Y), perché è completamente diverso.

La formula della distanza è:

double distance = Math.Sqrt((centerPoint.X + result.X)^2 + (centerPoint.Y + result.Y)^2); 
+0

John, Grazie per il pesce. Ero beatamente inconsapevole del fatto che C# stesse arrotondando i doppi calcoli, figuriamoci terribilmente (IMHO). – corlettk

1

Senza ulteriori informazioni sugli errori esatti è difficile dire cosa c'è che non va. Le equazioni sembrano corrette e dovrebbero funzionare. Sei sicuro che gli angoli che stai passando siano corretti per angoli> 90 gradi? L'unica altra cosa che potrei pensare sarebbe che stai moltiplicando la distanza (un int) dal risultato di Math.sin (doppio), ma questo non dovrebbe essere un problema.

+0

Hai esattamente ragione, l'ingresso dell'angolo era effettivamente spento. – x4000

0

Non so C#, comunque se stai cercando di disegnare i punti da qualche parte devi considerare il fatto che l'asse Y piega dall'alto verso il basso dello schermo, quindi l'elemento sin dovrebbe avere be -sin (...) e non + sin (...)

così

result.Y = centerPoint.Y + (int)Math.Round(distance * Math.Sin(angle)); 

dovrebbe diventare:

result.Y = centerPoint.Y - (int)Math.Round(distance * Math.Sin(angle)); 

Se non si sta cercando di disegnare loro non potevo immaginare quale sia il problema, si può dare qualche esempio?

+0

result.Y dovrebbe usare cos non sin controllare questo link http://www.webdeveloper.com/forum/showthread.php?t=190439 – RVN

1
-(NSMutableArray *)GetPointsForCircle 
    { 
     NSMutableArray *Points = [[NSMutableArray alloc] init]; 
     CGPoint CenterPoint = CGPointMake(160, 230); 
     CGPoint Point; 
     for (float Angel = 0; Angel <= 360; Angel+= 60) 
     { 
      Point.x = CenterPoint.x + 100 * cos(Angel); 
      Point.y = CenterPoint.y + 100 * sin(Angel); 
      [Points addObject:[NSValue valueWithCGPoint:Point]]; 
     } 
     return Points; 
    } 

    - (CGPoint)pointOnCircle:(int)thisPoint withTotalPointCount:(int)totalPoints 
    { 
        CGPoint centerPoint = CGPointMake(self.view.frame.size.width/2, self.view.frame.size.height/2); 
        float radius = 100.0; 
        float angle = (2 * M_PI/(float)totalPoints) * (float)thisPoint; 
        CGPoint newPoint; 
     newPoint.x = (centerPoint.x) + (radius * cosf(angle)); 
     newPoint.y = (centerPoint.y) + (radius * sinf(angle)); 
        return newPoint;   
    } 
+0

Restituire 6 punti per una cerchia di raggio 100. L'equazione parametrica per un cerchio è x = cx + r * cos (a) y = cy + r * sin (a) Dove r è il raggio, cx, cy l'origine e un angolo da 0..2PI radianti o 0..360 gradi . – Waseem

2

versione A Swift3

func pointOnCircle(radius: Double, angleInDegrees: Double, origin: CGPoint) -> CGPoint { 
    let x = abs(Double(origin.x) + radius * cos(angleInDegrees * (.pi/180))) 
    let y = abs(Double(origin.y) - radius * sin(angleInDegrees * (.pi/180))) 

    return CGPoint(x: x, y: y) 
} 
Problemi correlati