40

我想这是一个简单的问题,但是我当前的代码得到了一些奇怪的结果,而且我没有数学背景来完全理解为什么。正如标题中所述,我的目标很简单:我只想找到与中心点有一定距离和角度的点。

我当前的代码:

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 的角度存在错误。我以为我已经检查得足够好,但显然没有。感谢大家的时间,希望上面的工作代码对其他人有帮助。

4

6 回答 6

34

您忘记添加中心点:

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

其余的应该没问题......(你得到了什么奇怪的结果?你能给出准确的输入吗?)

于 2009-03-23T17:19:08.877 回答
6

首先,因为你是弧度,所以定义你的角度可能是有益的:

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

功能本身运行良好。如果您的距离足够小,四舍五入只会影响您的答案。除此之外,答案应该很好。

如果这是您担心的舍入,请记住,默认情况下,.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 和角度 Y的问题中......我假设你没有把它与 point 联系起来(X,Y),因为那是完全不同的。

距离公式为:

double distance = Math.Sqrt((centerPoint.X + result.X)^2 + (centerPoint.Y + result.Y)^2);
于 2009-03-23T17:17:52.110 回答
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)
}
于 2017-08-08T19:43:25.863 回答
1

如果没有关于确切错误的更多信息,就很难判断出了什么问题。方程看起来正确,应该可以工作。您确定您传入的角度对于 > 90 度的角度是否正确?我唯一能想到的另一件事是你将距离(一个 int)乘以 Math.sin (双精度)的结果,但这不应该是一个真正的问题。

于 2009-03-23T18:12:00.560 回答
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;   
    }
于 2012-09-20T05:58:54.497 回答
0

我不知道 c#,无论如何,如果你想在某个地方画点,你必须考虑 Y 轴从屏幕顶部到底部折痕的事实,所以你的sin元素应该是-sin(.. .)而不是+sin(...)

所以

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

应该变成:

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

如果您不尝试绘制它们,我无法想象问题出在哪里,您能举个例子吗?

于 2009-03-23T18:18:37.987 回答