11

cx中心とcy 重心円の半径を指定して正三角形を描くにはどうすればよいですか?

ポイントが三角形内にあるかどうかを確認するにはどうすればよいですか?

ここに画像の説明を入力

PS: 私は のためandroidにこれを構築していますが、この質問は言語に依存しません。

4

6 に答える 6

16

あなたの最初の質問のために

上の図の点Cは単純で、(cx、cy + r)だけです。

ポイントaとbを取得するための2つのかなり簡単な方法を考えることができます。

最初の方法:(cx、cy)が原点であると仮定し、aとbを取得するために、点Cを60度と120度回転させます。これは、次の式で実現できます。

  • bx = cx * cos(120度)-(cy * sin(120度))
  • by = cx * sin(120度)+(cy * cos(120度))
  • ax = cx * cos(240度)-(cy * sin(240度))
  • ay = cx * sin(240度)+(cy * cos(240度))

ウィキペディアのこの記事もご覧ください。

2番目の方法:(cx、cy)を通り、-30度の傾きを持つ線を引きます。その線が円と交差する場所は点bになります。円は次の方程式で定義されます。

 ( x - c.x )^2 + ( y - c.y )^2 = r^2 

(2つの交点があることに注意してください。正しいものを選択してください)。

次に、(cx、cy)を通る正の30度の角度線で同じことを行い、点aを取得します。

線の傾きは次のようになります:1 / sqrt(3)および-1 / sqrt(3)

2番目の質問について

正三角形を形成する点A、B、およびCを取得したら、点(x、y)が三角形内にあるかどうかを検出する最も速くて簡単な方法の1つは、外積とベクトルに基づいています。

基本的に、(x、y)が「ベクトル」A->Bの左側にあるかどうかを確認します。次に、それがB->Cの左側にあるかどうかを確認します。次に、C->Aの左側にあるかどうかを確認します。

ここから引用した次の方法では、点がベクトルの左側にあるかどうかを確認できます。

public bool isLeft(Point A, Point B, Point C){
    return ((B.x - A.x)*(C.y - A.y) - (B.y - A.y)*( C.x - A.x)) > 0;
}

メソッドでは、A =ラインポイント1、b =ラインポイント2、およびc=チェックするポイントです。

于 2012-07-13T23:38:11.757 に答える
11

単位円上の正三角形の座標が必要な怠け者 (私のような) の場合:

A: (-0.866, -0.5)
B: (0.866, -0.5)
C: (0.0, 1.0)

位置や半径が異なる場合は、すべての値に を掛けてから、座標とsにr加算します。cxxcyy

于 2017-07-31T08:24:12.080 に答える
1

現時点では、2 番目の質問にしかお答えできません。三角形を定義する点を保存していれば、点と線の交差テストを実行するだけです。コンピュータ グラフィックスの本には、多くの相対アルゴリズムがあります。

編集:私はあなたの基本的な問題を解決するための方法論を考えました(与えられたデータとしてcx、cy、radiusで正三角形を定義する3点を見つけてください)。これは、三角形の 3 つの角度の和が 180 度であるという性質に依存しています。それが正しいことを確認するために、さらにチェックを行う時間が必要です。次に、回答を編集して投稿します。

Edit-Full Answer : このアルゴリズム スケッチの実装は、選択したプログラミング言語とグラフィックス API に依存しています。

  • 2D 座標系の中心 (時計回りと仮定) を重心円の中心に変換します。
  • 円の中心とともに、2 つの直線セグメントを定義する 2 つの点を保存します。これらのセグメントの結合により、円の直径が得られる場合があります。どちらのセグメントも、1 つの定義点として円の中心を持ちます。他の 2 つの定義点 (保存する必要があります) は、円の円周上にあります (それらを見つけるには、円の半径の長さを使用します)。
  • 円周上で 2 点を 60 度回転させます。1 つは時計回り、もう 1 つは反時計回りです。新しい座標を保存します。それらを結ぶ線を引きます。3 つの三角形の頂点のうち 2 つがあります。
  • 座標系の中心を逆変換します。
  • 三角形の残りの頂点は、円の半径と 2 つの線分の交点であり、それぞれの既知の三角形の頂点から始まります。
  • 最後に、頂点を保存して三角形を描きます。

それが役立つことを願っています。この方法論の手順をもう少し明確にするために、いくつかの図を追加してみます。また、これらの手順をプログラムしてテストし、問題を正しく解決できるようにします。

于 2012-07-12T10:35:26.113 に答える
0

これは、Java(Android)で三角形を描画するための私の方法です:

mA = new PointD();
mB = new PointD();
mC = new PointD();
mCos120 = Math.cos(AppHelper.toRadians(120));
mSin120 = Math.sin(AppHelper.toRadians(120));
mCos240 = Math.cos(AppHelper.toRadians(240));
mSin240 = Math.sin(AppHelper.toRadians(240));

double r = 30; // this is distance from the center to one of triangle's point.
mA.set(0 + r, 0);
mB.x = mA.x * mCos120 - mA.y  * mSin120;
mB.y = mA.x * mSin120 + mA.y * mCos120;
mC.x = mA.x * mCos240 - mA.y * mSin240;
mC.y = mA.x * mSin240 + mA.y * mCos240;

mA = AppHelper.toScreenCoordinates(mCenterPoint, mA);
mB = AppHelper.toScreenCoordinates(mCenterPoint, mB);
mC = AppHelper.toScreenCoordinates(mCenterPoint, mC);

mPlayPath.reset();
mPlayPath.moveTo(mA.getX(), mA.getY());
mPlayPath.lineTo(mB.getX(), mB.getY());
mPlayPath.lineTo(mC.getX(), mC.getY());
mPlayPath.lineTo(mA.getX(), mA.getY());
mPlayPath.close();

public static PointD toScreenCoordinates(PointD center, PointD point) {
    return new PointD(point.x + center.x, center.y - point.y);
}

PointD は PointF に似ていますが、double 型です。

于 2015-11-27T19:50:58.073 に答える