2009-03-23 21 views
35

これは簡単な質問だと思いますが、私の現在のコードでは奇妙な結果が出ています。理由を完全に理解するための数学の背景はありません。私の目標は、タイトルに記載されているように単純です:私はちょうど中心点からいくつかの距離と角度でポイントを見つけるしたい。C#の角度から円の円周上の点を計算する?

私の現在のコード:一般的に

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

あなたは "私は様々なスポットでの問題を取得する" とはどういう意味ですか? –

+0

は意図的に使用されていないcenterPointですか? resultにcenterPoint.Xと.Yを追加しないでください。 – spender

+0

問題の例を挙げることはできますか? –

答えて

29

あなたは、中心点を追加するのを忘れ:?残りはあなたが奇妙な結果を得ていたもの(... [OK]をする必要があり

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

をあなたが与えることができます正確な入力?)

+0

ああ、これは中心点についての良い点です - この場合は使用されていません。私が現在取り組んでいる具体的な点は中心点が0であるため、その場合は無関係ですが、他の場合は確かに違いがあります。私は適切にそれを含めるために例を更新しました。 – x4000

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

ジョン、魚をありがとう。私は幸運にもC#がまったく二重の計算を丸めていたことに気づいていませんでした。 – corlettk

1

正確なエラーの詳細がないと、間違ったことを伝えるのが難しいです。方程式は正しく見え、うまくいくはずです。渡している角度が90度を超える正しい角度になっていますか?私が考えることができる唯一の他のものは、あなたがMath.sin(double)の結果によって距離(int)を掛けることですが、それは本当に問題ではありません。

+0

あなたはまさに正しいですが、角度入力は実際にはオフでした。 – x4000

0

どこかでポイントを描こうとしているのであれば、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)); 

、あなたはいくつかの例を与えることができますか?

+0

result.Yはsinを使用しないsinを使用してください。このリンクをチェックしてください。http://www.webdeveloper.com/forum/showthread.php?t=190439 – RVN

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;   
    } 
+0

戻り値6半径100の円を返します。円のパラメトリック方程式は ですrは半径であり、cx、cyは原点であり、角度は0..2PIラジアンまたは0..360度である。 。 – Waseem

2

A 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) 
} 
関連する問題