用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 ) );
如果你不想画他们,我无法想象问题是什么,你能举一些例子吗?