用C#中的angular度计算圆周上的点?

我想这是一个简单的问题,但我得到一些奇怪的结果与我目前的代码,我没有math背景,以充分理解为什么。 我的目标很简单,正如标题所说:我只想从中心点以一定的距离和angular度find点。

我目前的代码:

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

一般来说,这似乎是相当合理的工作,但我在不同的地方出现问题,特别是当angular度对应于负x和y轴的点时。 很明显,我做错了什么 – 对这是什么的思考?

更新:这是我的错误,这个代码工作正常 – less数exception值不工作实际上是由于如何计算1.5PI的angular度的错误。 我以为我已经检查好了,但显然没有。 感谢大家的时间,希望上面的工作代码将certificate对别人有帮助。

你忘了添加中心点:

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

剩下的就可以了…(你得到了什么奇怪的结果?你能给出一个确切的input吗?)

首先,由于您使用的是弧度,因此定义angular度可能是有益的:

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

function本身工作正常。 舍入只会影响你的答案,如果你的距离足够小。 除此之外,答案应该很好。

如果这是你担心的四舍五入,记住,默认情况下,.NET 银行家四舍五入 ,你可能想要:

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

代替。

此外,在你想要距离X和angular度Y的问题中 ,我假设你不会将它与(X,Y) ,因为这是完全不同的。

距离公式是:

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

一个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) } 

没有关于确切的错误的更多信息,很难说出什么问题。 等式看起来正确,应该工作。 你确定你通过的angular度是正确的angular度> 90度? 我唯一能想到的另外一件事情是,你将Math.sin(double)的结果乘以distance(int),但这不应该是一个问题。

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

我不知道C#,无论如何,如果你试图绘制的地方,你必须考虑的事实,从Y轴的屏幕从上到下的皱折,所以你的罪的元素应该是-sin(.. 。)而不是+罪(…)

所以

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

应该成为:

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

如果你不想画他们,我无法想象问题是什么,你能举一些例子吗?