¿Cálculo del punto en la circunferencia de un círculo desde el ángulo en C #?

Me 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 objective es simple, como se indica en el título: solo quiero encontrar el punto a cierta distancia y ángulo desde un punto central.

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 razonablemente, pero tengo problemas en varios puntos, sobre todo cuando el ángulo corresponde a los puntos en los ejes negativos xey. 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 se debieron en realidad 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.

Olvidaste agregar 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 rest debería estar bien … (¿Qué extraños resultados obtuviste? ¿Puedes dar una entrada exacta?)

En primer lugar, como estás en radianes, probablemente sea beneficioso definir tu ángulo como tal:

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

Las funciones en sí 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 le preocupa el redondeo, recuerde que, de manera predeterminada, .NET redondea al banco 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); 

en lugar.

Además, en la pregunta que quieres distancia X y ángulo Y … supongo que no estás relacionando eso con el punto (X,Y) , porque eso es completamente diferente.

La fórmula de distancia es:

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

Una versión de 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) } 

Sin más información sobre los errores exactos, es difícil saber qué sucede. Las ecuaciones se ven bien y deberían funcionar. ¿Estás seguro de que los angularjs que estás pasando son correctos para angularjs> 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.

 -(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; } 

No sé c #, de todos modos si tratas de dibujar los puntos en alguna parte debes considerar el hecho de que el eje Y se pliega desde la parte superior a la parte inferior de la pantalla, entonces tu elemento sin debe haber sido -sin (… .) y no + sin (…)

asi que

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

debe convertirse:

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

Si no estás tratando de dibujarlos, no podría imaginar cuál es el problema, ¿puedes dar algún ejemplo?

Intereting Posts