94

このような計算をしてから10年になります...私は2Dでゲームをプログラミングし、プレーヤーを動かしています。プレーヤーを動かしながら、-360〜360の正または負の角度(度)を指定して、プレーヤーの位置から200ピクセル離れた円上の点を計算しようとしています。画面は1280x720で、中心点は0,0です。画面の。プレーヤーは、このデカルト座標系全体を移動します。私が見つけようとしているポイントは、画面外にある可能性があります。

記事「半径と角度で点を見つける」の数式を試しましたが、角度を-360から360としてCos(角度)またはSinに渡すと、奇妙な結果が得られるため、「角度」が何であるかを理解していないと思います。 (角度)。

だから例えば私は持っています...

  • デカルト平面で1280x720
  • センターポイント(プレイヤーの位置):
    • x=最小-640から最大640までの数値とします。
    • y=最小-360から最大360までの数値とします。
  • プレーヤーの周りの円の半径:rを常に=200とします
  • 角度:a = -360〜360の範囲の数値とします(負の場合は下向き、正の場合は上を指すため、-10と350で同じ答えが得られます)

円にXを返す式は何ですか?

円にYを返す式は何ですか?

ここに画像の説明を入力してください ここに画像の説明を入力してください

4

10 に答える 10

83

リンクからの簡単な方程式は、円の中心を基準にした円上の点のX座標とY座標を示します。

X = r * cosine(angle)  
Y = r * sine(angle)

これは、ポイントが円の中心からどれだけオフセットされているかを示します。中心の座標(Cx、Cy)があるので、計算されたオフセットを追加するだけです。

円上の点の座標は次のとおりです。

X = Cx + (r * cosine(angle))  
Y = Cy + (r * sine(angle))
于 2012-12-31T00:28:31.687 に答える
20

使用しているコードを投稿する必要があります。それは問題を正確に特定するのに役立ちます。

ただし、角度を-360から360で測定するとおっしゃっていたので、数学ライブラリに間違った単位を使用している可能性があります。三角関数のほとんどの実装では、入力にラジアンを使用します。そして、代わりに度を使用する場合...あなたの答えは奇妙に間違っています。

x_oncircle = x_origin + 200 * cos (degrees * pi / 180)
y_oncircle = y_origin + 200 * sin (degrees * pi / 180)

象限が期待したものではない状況に遭遇する可能性もあることに注意してください。これは、角度ゼロがどこにあるかを注意深く選択するか、期待する象限を手動でチェックして、結果値に独自の符号を適用することで修正できます。

于 2012-12-31T00:27:48.190 に答える
7

このタイプの操作には行列を使用することを強くお勧めします。これは最も一般的なアプローチです。以下の例を参照してください。

// The center point of rotation
var centerPoint = new Point(0, 0);
// Factory method creating the matrix                                        
var matrix = new RotateTransform(angleInDegrees, centerPoint.X, centerPoint.Y).Value;
// The point to rotate
var point = new Point(100, 0);
// Applying the transform that results in a rotated point                                      
Point rotated = Point.Multiply(point, matrix); 
  • ちなみに、慣例では、角度を反時計回りに開始して(正の)X軸を測定します。
于 2013-01-02T18:34:12.797 に答える
6

また、コードで時計の針の動きを形成するためにもこれが必要でした。私はいくつかの数式を試しましたが、それらは機能しませんでした、それでこれは私が思いついたものです:

  • モーション-時計回り
  • ポイント-6度ごと(360度を60分で割ると6度になるため)
  • 手の長さ-65ピクセル
  • 中央-x=75、y = 75

したがって、式は次のようになります

x=Cx+(r*cos(d/(180/PI))
y=Cy+(r*sin(d/(180/PI))

ここで、xとyは円周上の点、CxとCyは中心のx、y座標、rは半径、dは度数です。

于 2014-12-14T06:45:50.327 に答える
5

Angleを-360から360としてCos(angle)またはSin(angle)に渡すと、奇妙な結果が得られます。

あなたの試みがうまくいかなかった理由は、あなたが度単位で角度を通過していたからだと思います。および三角関数はラジアンで表される角度を想定しているため、数値はからまでである必要がsinあります。度については合格します。ヘッダーで定義された定数です。cos02*M_PIdM_PI*d/180.0M_PImath.h

于 2012-12-31T00:28:41.213 に答える
3

これがc#の実装です。radiusこのメソッドは、centerangle intervalをパラメータとして取る円形の点を返します。角度はラジアンとして渡されます。

public static List<PointF> getCircularPoints(double radius, PointF center, double angleInterval)
        {
            List<PointF> points = new List<PointF>();

            for (double interval = angleInterval; interval < 2 * Math.PI; interval += angleInterval)
            {
                double X = center.X + (radius * Math.Cos(interval));
                double Y = center.Y + (radius * Math.Sin(interval));

                points.Add(new PointF((float)X, (float)Y));
            }

            return points;
        }

および呼び出し例:

List<PointF> LEPoints = getCircularPoints(10.0f, new PointF(100.0f, 100.0f), Math.PI / 6.0f);
于 2018-04-19T05:17:04.977 に答える
1

上記の貢献がArduinoLCDコンパスの作成にどのように役立ったかを共有したいと思います。これが正しいエチケットであることを願っています...私はstackoverflowに参加したばかりなので、すばらしい人々に感謝することができます。

上のジオメトリジャイアントの肩に立っている間、私はこのサンプルコンパスを作成することができました: 複数のベアリングを備えたArduinoTFTコンパス

私が繰り返し呼び出した関数のコード(小さな黄色のテキストで表示されるさまざまなベアリング用)は、Arduino(「C」のようなもの)で書かれています...そしてかなり翻訳可能です:

void PaintCompassNeedle( int pBearingInDegrees, int pRadius, TSPoint pCentrePt ) {
    // ******************************************************************************
    // * Formula for finding pointX on the circle based on degrees around the circle:
    // * x_oncircle = x_origin + radius * cos (degrees * pi / 180)  
    // * y_oncircle = y_origin - radius * sin (degrees * pi / 180) //minus explained
    // * Thanks to folks at stackoverflow...standing on the shoulders of giants. :) 

    float bearingInRads = (pBearingInDegrees) * PI / 180; 
    // Degrees vs Rads...The math folks use Rads in their formulas

    // *******************************************************************
    // * bearingPt is the point on the circle that we are trying to find
    TSPoint bearingPt;
    // Find the X on the circle starting with orgin (centre)
    bearingPt.x = pCentrePt.x + pRadius * sin(bearingInRads); 
    // Notice the "minus" R * cos()...because TFT the y is upside down bearingPt.y = 
    pCentrePt.y - pRadius * cos(bearingInRads); 
    // * Extra Explanation: The TFT is the graphical display I'm using and it
    // * calculates x & y from the top left of screen (portrait mode) as (0,0)
    // * ...so by Subtracting from the Y orgin...I flip it vertically
    // * Other folks using x,y as increasing to the right and up respectively
    // * would keep the plus sign after the pCentrePt.y
    // *************************************************************************

    // ***************************************************************
    // * This part will change for the final product...but leaving
    // * it because when call numerous times it shows it working for
    // * a number of different quadrants (displaying yellow degrees text)
    tft.fillCircle( bearingPt.x, bearingPt.y, 5, RED); 
    tft.setCursor( bearingPt.x, bearingPt.y );
    tft.setTextSize( 1 );
    tft.setTextColor( YELLOW );
    tft.print( pBearingInDegrees );

    TSPoint innerPt;
    innerPt.x = pCentrePt.x + pRadius/2 * sin(bearingInRads);
    innerPt.y = pCentrePt.y - pRadius/2 * cos(bearingInRads);
    tft.drawLine(innerPt.x, innerPt.y, bearingPt.x, bearingPt.y, RED);

}
于 2018-12-30T19:54:04.577 に答える
0

答えは正反対でなければなりません。

X = Xc + rSin(角度)

Y = Yc + rCos(角度)

ここで、XcとYcは円の中心座標であり、rは半径です。

于 2017-01-08T03:57:14.000 に答える
0

お勧め:

 public static Vector3 RotatePointAroundPivot(Vector3 point, Vector3 
pivot, Vector3 angles)
    {
	    return Quaternion.Euler(angles) * (point - pivot) + pivot;
    }

于 2017-08-15T06:25:13.873 に答える
-3

あなたはこれを使うことができます:

ここで円の方程式

(xk)2 +(yv)2 = R 2

ここで、kとvは定数で、Rは半径です。

于 2019-08-18T22:57:59.593 に答える