ポイントが特定の行に属しているかどうかを確認するにはどうすればよいですか?可能であれば、実施例は理解される。別ウィンドウ(タブ)の大きな表示で見るポイントが特定の行に属しているかどうかを確認するにはどうすればよいですか?
答えて
当てはまる場合点(X1、Y1)をチェックすることにより、ライン上にあるかどうかを決定することができるが座標を線方程式に差し込み、等価性をチェックするだけです。
は考える:XとYで
Point p (X=4, Y=5)
Line l (Slope=1, YIntersect=1)
プラグ:
Y = Slope * X + YIntersect
=> 5 = 1 * 4 + 1
=> 5 = 5
そうです、ポイントはライン上にあります。あなたのラインが(X1、Y1)、(X2、Y2)の形で表現されている場合
、その後、あなたが斜面を計算することができます。
Slope = (y1 - y2)/(x1-x2)
そしてこれにY-交差を得る:
YIntersect = - Slope * X1 + Y1;
編集:私はあなたがx1 - x2
が0
ではないことを確認する必要があります
(X1/Y1されている...)Y-交差を固定しました。そうであれば、そのポイントがライン上にあるかどうかを確認することは、あなたのポイントのY値がx1
またはx2
のいずれかに等しいかどうかをチェックすることです。また、ポイントのXが 'x1'または 'x2'でないことを確認します。
これはどの言語ライブラリですか? –
それはそうではありません - それは単なる擬似コードです。 – Eclipse
これは擬似コードではなく、数学だけです。 – configurator
もっと具体的になりますか?
どのようなプログラミング言語について話していますか?
あなたはどのような環境について話していますか?
どのような "ライン"について話していますか?テキスト?何がポイント?画面上のXY?
これは私が元の質問にコメントしたはずです – joshcomley
投稿を削除してコメントを投稿することもできます:) –
線の式である:
y = mx + c
それは即ち、この式を満たすのであれば点は、(B)は、このライン上にありますb = ma + c
A 2Dラインは、一般的にここでは2つの変数xの方程式およびyを用いて表現されている周知の方程式
今すぐGDI +ラインが(に(0,0)から引き出されている想像であります100、100)の場合、m =(0-100)/(0-100)= 1の値になるので、線の方程式はy-0 = 1 *(x-0)=> y = xです。
ここで問題の行の方程式があり、その行がその行に属しているかどうかを簡単にテストできます。与えられた点(x3、y3)はx = x3とy = y3を代入すると線方程式を満たしていればこの行に属します。例えば、10 = 10であるので、この線に属する点(10,10)は、この線に属さないが、12!= 10であるから
注:垂直線については、 (m)は無限ですが、この特殊なケースでは、垂直線x = cの方程式を使用することができます。ここで、c = x1 = x2です。
これが最も効果的な方法であるかどうかはわかりませんが、もう少し時間があるときは、より効率的な方法を見つけようとします。
これが役に立ちます。
あなたは、そのエンドポイント
PointF pt1, pt2;
によって定義されたラインを持っているとあなたは次のように、あなたは、関数を定義することができ
PointF checkPoint;
をチェックしたいポイントを持っている場合:
bool IsOnLine(PointF endPoint1, PointF endPoint2, PointF checkPoint)
{
return (checkPoint.Y - endPoint1.Y)/(endPoint2.Y - endPoint1.Y)
== (checkPoint.X - endPoint1.X)/(endPoint2.X - endPoint1.X);
}
if (IsOnLine(pt1, pt2, checkPoint) {
// Is on line
}
ゼロで除算を行う必要があります。
ありがとうございます。 –
これは正しいとは言えません...ポイント座標はintなので、checkPointがendPoint1に近く、endPoint2から遠く離れていると、パークリシェーションが(クリティカルで)失われます。もしあなたがそれを10進数または2進数に変更したなら、それは両側でうまくいくでしょうが、私はまだこのequasionの正確さを信じません。 – configurator
フェアポイント(punの意図)、PointFに変更 –
L0
およびL1
の2点と、試験する点P
が与えられています。
(L1 - L0) * (P - L0)
n = (P - L0) - --------------------- (L1 - L0)
(L1 - L0) * (L1 - L0)
ベクターn
のノルムがL0
とL1
通る線から点P
の距離です。この距離がゼロまたは十分小さい場合(丸め誤差の場合)、ポイントはライン上にあります。
記号*
は内積を表します。
例
P = (5, 5)
L0 = (0, 10)
L1 = (20, -10)
L1 - L0 = (20, -20)
P - L0 = (5, -5)
(20, -20) * (5, -5)
n = (5, -5) - --------------------- (20, -20)
(20, -20) * (20, -20)
200
= (5, -5) - --- (20, -20)
800
= (5, -5) - (5, -5)
= (0, 0)
+1丸め誤差に言及します。浮動小数点演算で完全一致を使用すると、多くの場合、他の提案されたソリューションが失敗する可能性があります。私は提案されたアルゴリズムの数値的な頑健性についてはわかりませんが、数値の堅牢性は複雑であり、精度が重要な場合は、そのトピックに関する科学文献を見ることをお勧めします。あるいは、著者が研究を行った可能性の高い図書館を少なくとも使用してください。 –
私はあなたの例が正しいとは思っていません。なぜなら、いくつかの変換 'n =(p-L0) - (p-L0)'の後に、いつでも 'n =(0、0)' 。 – nenito
点R =(RX、RY)は点P =(PX、PY)とQ =(QX、QY)を結ぶ直線上にあるかどうかを判断するための最良の方法*(RY - PY) - (QY - PY)*(RX - PX) - マトリックス
{{qx - px, qy - py}, {rx - px, ry - py}},
すなわち(PX QX)の行列かどうかをチェックすることは、0に近いです。このソリューションには、他にもいくつかの利点があります。第1に、縦線の特殊な場合は必要ありません。第2に、分割しない(通常は低速な操作)、第3に、浮動小数点ラインはほとんど、しかし全く垂直ではありません。
私はMr.Patrickマクドナルドはほぼ正しい答えを入れて、これが彼の答えの補正だと思う:
public bool IsOnLine(Point endPoint1, Point endPoint2, Point checkPoint)
{
return (((double)checkPoint.Y - endPoint1.Y))/((double)(checkPoint.X - endPoint1.X))
== ((double)(endPoint2.Y - endPoint1.Y))/((double)(endPoint2.X - endPoint1.X));
}
そしてもちろん、他の多くの正解がある特にMr.Joshが、私はこれが見つかりました一番いい。
感謝の意を表します。
checkPoint.x == endPoint.xの場合、またはエンドポイントのx値が同じ場合はdivをゼロにします – ThiefMaster
は、私はちょうど私が描画アプリケーションでは、このチェックを使用するため、いくつかの余分な要求を処理する関数を書いた:
- 許容量 - 機能をクリックして行を選択するために使用されているので、エラーの余地がなければなりませんそれらの上に。
- この行にはEndPointとStartPointがあり、無限の行はありません。
- 直線の垂直線と水平線を処理する必要があります。(x2 - x1)== 0は、他の回答で0で除算します。
slope/y-intercept
方法に代わるものとして
private const double SELECTION_FUZZINESS = 3;
internal override bool ContainsPoint(Point point)
{
LineGeometry lineGeo = geometry as LineGeometry;
Point leftPoint;
Point rightPoint;
// Normalize start/end to left right to make the offset calc simpler.
if (lineGeo.StartPoint.X <= lineGeo.EndPoint.X)
{
leftPoint = lineGeo.StartPoint;
rightPoint = lineGeo.EndPoint;
}
else
{
leftPoint = lineGeo.EndPoint;
rightPoint = lineGeo.StartPoint;
}
// If point is out of bounds, no need to do further checks.
if (point.X + SELECTION_FUZZINESS < leftPoint.X || rightPoint.X < point.X - SELECTION_FUZZINESS)
return false;
else if (point.Y + SELECTION_FUZZINESS < Math.Min(leftPoint.Y, rightPoint.Y) || Math.Max(leftPoint.Y, rightPoint.Y) < point.Y - SELECTION_FUZZINESS)
return false;
double deltaX = rightPoint.X - leftPoint.X;
double deltaY = rightPoint.Y - leftPoint.Y;
// If the line is straight, the earlier boundary check is enough to determine that the point is on the line.
// Also prevents division by zero exceptions.
if (deltaX == 0 || deltaY == 0)
return true;
double slope = deltaY/deltaX;
double offset = leftPoint.Y - leftPoint.X * slope;
double calculatedY = point.X * slope + offset;
// Check calculated Y matches the points Y coord with some easing.
bool lineContains = point.Y - SELECTION_FUZZINESS <= calculatedY && calculatedY <= point.Y + SELECTION_FUZZINESS;
return lineContains;
}
これは受け入れられた答えではありません。他のものはすべて数学的なものばかりです。これは現実の世界であり、戦闘で強化された機能であり、好ましいものでなければなりません。私はこれがMathOverflowではなく、神のためのStackOverflowであることを意味します。 –
これは最高の答えです。 SELECTION_FUZZINESSにとって最良の価値は何ですか? –
、IはMath.Atan2
を使用して、このアプローチを選択した:
// as an extension method
public static bool Intersects(this Vector2 v, LineSegment s) {
// check from line segment start perspective
var reference = Math.Atan2(s.Start.Y - s.End.Y, s.Start.X - s.End.X);
var aTanTest = Math.Atan2(s.Start.Y - v.Y, s.Start.X - v.X);
// check from line segment end perspective
if (reference == aTanTest) {
reference = Math.Atan2(s.End.Y - s.Start.Y, s.End.X - s.Start.X);
aTanTest = Math.Atan2(s.End.Y - v.Y, s.End.X - v.X);
}
return reference == aTanTest;
}
それはエンドだと最初のチェックreference
は、線分の始点から逆正接を決定ポイント。 次に、開始点の観点から、arcTanをベクトルv
に設定します。
これらの値が等しい場合は、エンドポイントの観点から確認します。
シンプルで、水平、垂直、およびその間のすべてを扱います。
- 1. ポイントが特定の行の近くにあるかどうかを確認するにはどうすればよいですか?
- 2. ネットパイプサービスがリッスンしているかどうかを確認するにはどうすればよいですか
- 3. ポップアップページが開いているかどうかを確認するにはどうすればよいですか?
- 4. マウスが重複していない特定の円の上にあるかどうかを確認するにはどうすればよいですか?
- 5. Javaでは、コレクションに特定のクラスのインスタンスが含まれているかどうかを確認するにはどうすればよいですか?
- 6. ウェブサイト全体で特定のURLにリンクしているページがあるかどうかを確認するにはどうすればよいですか?
- 7. ユーザーがindex.htmlにいるかどうかを確認するにはどうすればよいですか?
- 8. 特定のページが既にGoogle Chromeで開いているかどうかを確認するにはどうすればよいですか?
- 9. テキストファイルに特定のテキストがバッチで含まれているかどうかを確認するにはどうすればよいですか?
- 10. 特定のタイプのモバイルクライアントがWebアプリケーションにアクセスしているかどうかを確認するにはどうすればよいですか?
- 11. Authlogicを使用している特定のモデルにユーザーが属していることを確認するにはどうすればよいですか?
- 12. リストに特定のタイプのオブジェクトが含まれているかどうかを確認するにはどうすればよいですか? C#
- 13. 文字列に特定の文字が含まれているかどうかを確認するにはどうすればよいですか?
- 14. データが新しいかどうかを確認するにはどうすればよいですか?
- 15. アプリがバックグラウンドで実行されているか、アンドロイドを殺しているかどうかを確認するにはどうすればよいですか?
- 16. jquery:ページにフォーカスがないかどうかを確認するにはどうすればよいですか?
- 17. 特定のファイルがWindowsで開いているかどうかを確認するにはどうすればよいですか?
- 18. Tomcatがシャットダウンを受信するように設定されているかどうかを確認するにはどうすればいいですか?
- 19. CURLを使用してウェブページに特定のテキストがあるかどうかを確認するにはどうすればよいですか?
- 20. GUI:特定のUnicode文字がサポートされているかどうかを確認するにはどうすればよいですか?
- 21. 特定のUSBデバイスが接続されているかどうかを確認するにはどうすればよいですか?
- 22. 特定のJSファイルがWebページに含まれているかどうかを確認するにはどうすればいいですか?
- 23. Androidアプリにメモリリークがあるかどうかを確認するにはどうすればよいですか?
- 24. Android:アクティビティにオプションメニューがあるかどうかを確認するにはどうすればよいですか?
- 25. ユーザーがJSPで特定の役割を持っているかどうかを確認するにはどうすればよいですか?
- 26. 特定のユーザーがFacebookページの投稿を共有しているかどうかを確認するにはどうすればいいですか?
- 27. Facebookのタイムラインがあるかどうかを確認するにはどうすればよいですか?
- 28. ウィンドウがオフスクリーンであるかどうかを確認するにはどうすればよいですか?
- 29. URLが画像であるかどうかを確認するにはどうすればよいですか?
- 30. ファイルが空であるかどうかを確認するにはどうすればよいですか?
具体的にしてください。どのような情報から始めなければなりませんか?あなたは点と方程式の順序付けられたペアを持っていますか? –