2009-03-23 15 views
35

Imagino que esta es una pregunta simple, pero obtengo algunos resultados extraños con mi código actual y no tengo los conocimientos matemáticos para comprender por qué. Mi objetivo es simple, como se indica en el título: solo quiero encontrar el punto a cierta distancia y ángulo desde un punto central.¿Cálculo del punto en la circunferencia de un círculo desde el ángulo en C#?

Mi código actual:

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)); 

En general, esto parece funcionar bastante razonable, pero tengo problemas en varios puntos, sobre todo cuando el ángulo corresponde a puntos en los negativos x e y eje. Claramente estoy haciendo algo mal, ¿pensamientos sobre qué es eso?

ACTUALIZACIÓN: Este fue mi error, este código funciona bien - los pocos valores atípicos que no funcionaban en realidad se debían a un error en cómo se calculaba el ángulo para 1.5PI. Pensé que lo había verificado lo suficientemente bien, pero evidentemente no lo había hecho. Gracias a todos por su tiempo, es de esperar que el código de trabajo anterior sea útil para otra persona.

+0

¿Qué quiere decir "tengo problemas en varios puntos"? –

+0

es centerPoint deliberadamente no utilizado? ¿No deberían agregarse centerPoint.X y .Y al resultado? – spender

+0

¿Puedes darnos un ejemplo de un problema? –

Respuesta

29

Usted se olvidó de añadir el punto central:?

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

El resto debería estar bien ... (lo extraños resultados fueron que cada vez ¿Puede dar una entrada exacta?)

+0

Ah, este es un buen punto sobre el punto central; no se usa en este caso. El punto específico con el que estoy trabajando actualmente es con un punto central de 0,0, por lo que es irrelevante en ese caso, pero en otros casos sin duda haría la diferencia. He actualizado el ejemplo para incluirlo correctamente. – x4000

6

En primer lugar, ya que estás en radianes es probable que sea beneficioso para definir el ángulo tales como:

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

Las funciones mismos están funcionando bien. El redondeo solo afectará su respuesta si su distancia es suficientemente pequeña. Aparte de eso, las respuestas deberían salir bien.

si es el redondeo que te preocupa, recuerde que, por defecto, .NET hace banker's rounding, y es posible que desee:

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); 

lugar.

Además, en la pregunta que desea distancia X y el ángulo Y ... supongo que no está relacionada al punto de que (X,Y), porque eso es completamente diferente.

La fórmula de la distancia es:

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

John, gracias por el pez. Estaba felizmente inconsciente de que C# estaba redondeando cálculos dobles en absoluto, y mucho menos terriblemente (en mi humilde opinión). – corlettk

1

Sin más información sobre los errores exactos, es difícil decir lo que está mal. Las ecuaciones se ven bien y deberían funcionar. ¿Estás seguro de que los ángulos que estás pasando son correctos para ángulos> 90 grados? La única otra cosa que podría pensar sería que estás multiplicando la distancia (un int) por el resultado de Math.sin (double) pero eso no debería ser realmente un problema.

+0

Tiene razón, la entrada de ángulo estaba realmente desactivada. – x4000

0

No sé C#, de todos modos si tratas de dibujar los puntos en algún lugar debes considerar el hecho de que el eje Y se pliega desde la parte superior a la inferior de la pantalla, entonces tu elemento sin debería tener ser -sin (...) y no + sin (...)

por lo

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

debe convertirse en:

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

Si usted no está tratando de atraerlos no podía imaginar cuál es el problema, se puede dar algún ejemplo?

+0

result.Y debería usar cos not not check este enlace 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

Devuelve 6 puntos para un círculo de radio 100. La ecuación paramétrica para un círculo es x = cx + r * cos (a) y = cy + r * sin (a) donde r es el radio, cx, cy el origen, y a el ángulo desde 0..2PI radianes o 0..360 grados . – Waseem

2

versión 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) 
} 
Cuestiones relacionadas