我想这是一个简单的问题,但我现在的代码得到了一些奇怪的结果,而我没有数学背景来完全理解为什么。我的目标很简单,正如标题中所述:我只想找到距离中心点一定距离和角度的点。
我目前的代码:
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 ) );
一般来说,这似乎相当合理,但是我在各个地方遇到问题,最明显的是当角度对应于负x轴和y轴的点时。显然,我做错了什么 - 想一想是什么?
更新:这是我的错误,这段代码工作正常 - 少数不起作用的异常值实际上是由于1.5PI的角度计算方式的错误。我以为我已经检查得那么好,但显然没有。感谢大家的时间,希望上面的工作代码对其他人有用。
答案 0 :(得分:34)
您忘了添加中心点:
result.Y = (int)Math.Round( centerPoint.Y + distance * Math.Sin( angle ) );
result.X = (int)Math.Round( centerPoint.X + distance * Math.Cos( angle ) );
剩下的应该没问题......(你得到了什么奇怪的结果?你能给出一个确切的输入吗?)
答案 1 :(得分:6)
首先,由于你处于弧度,因此定义你的角度可能是有益的:
double angle = (Math.PI / 3); // 60 degrees...
功能本身工作正常。如果你的距离足够小,舍入只会影响你的答案。除此之外,答案应该很好。
如果这是你担心的四舍五入,请记住,默认情况下,.NET会banker's rounding,你可能想要:
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和角度Y 的问题中...我假设你没有将它与点(X,Y)
联系起来,因为那是完全不同的。
距离公式为:
double distance = Math.Sqrt((centerPoint.X + result.X)^2 + (centerPoint.Y + result.Y)^2);
答案 2 :(得分:3)
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)
}
答案 3 :(得分:1)
如果没有关于确切错误的更多信息,很难说出错了什么。方程看起来正确,应该工作。你确定你传入的角度对于角度是否正确> 90度?我能想到的另一件事就是你将距离(一个int)乘以Math.sin(double)的结果,但这不应该是一个问题。
答案 4 :(得分: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;
}
答案 5 :(得分:0)
我不知道c#,无论如何你想在某个地方画点,你必须考虑Y轴从屏幕的顶部到底部的折痕,所以你的罪元素应该是 -sin(...)而不是 + sin(...)
所以
result.Y = centerPoint.Y + (int)Math.Round( distance * Math.Sin( angle ) );
应该成为:
result.Y = centerPoint.Y - (int)Math.Round( distance * Math.Sin( angle ) );
如果你不想画它们,我无法想象问题是什么,你能举一些例子吗?