cx
中心とcy
重心円の半径を指定して正三角形を描くにはどうすればよいですか?
ポイントが三角形内にあるかどうかを確認するにはどうすればよいですか?
PS: 私は のためandroid
にこれを構築していますが、この質問は言語に依存しません。
cx
中心とcy
重心円の半径を指定して正三角形を描くにはどうすればよいですか?
ポイントが三角形内にあるかどうかを確認するにはどうすればよいですか?
PS: 私は のためandroid
にこれを構築していますが、この質問は言語に依存しません。
上の図の点Cは単純で、(cx、cy + r)だけです。
ポイントaとbを取得するための2つのかなり簡単な方法を考えることができます。
最初の方法:(cx、cy)が原点であると仮定し、aとbを取得するために、点Cを60度と120度回転させます。これは、次の式で実現できます。
ウィキペディアのこの記事もご覧ください。
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)
正三角形を形成する点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=チェックするポイントです。
単位円上の正三角形の座標が必要な怠け者 (私のような) の場合:
A: (-0.866, -0.5)
B: (0.866, -0.5)
C: (0.0, 1.0)
位置や半径が異なる場合は、すべての値に を掛けてから、座標とsにr
加算します。cx
x
cy
y
現時点では、2 番目の質問にしかお答えできません。三角形を定義する点を保存していれば、点と線の交差テストを実行するだけです。コンピュータ グラフィックスの本には、多くの相対アルゴリズムがあります。
編集:私はあなたの基本的な問題を解決するための方法論を考えました(与えられたデータとしてcx、cy、radiusで正三角形を定義する3点を見つけてください)。これは、三角形の 3 つの角度の和が 180 度であるという性質に依存しています。それが正しいことを確認するために、さらにチェックを行う時間が必要です。次に、回答を編集して投稿します。
Edit-Full Answer : このアルゴリズム スケッチの実装は、選択したプログラミング言語とグラフィックス API に依存しています。
それが役立つことを願っています。この方法論の手順をもう少し明確にするために、いくつかの図を追加してみます。また、これらの手順をプログラムしてテストし、問題を正しく解決できるようにします。
これは、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 型です。