どのように伝えれば点に属する一定がかかってしまいます。
質問
どのように伝えれば点に属する一定がかかってしまいます。
例をありがたくお受けいたします。が可能です。
解決
最も単純な形態では、単にライン式に座標を差し込むと等しいかどうかチェックします。
が与えられます:
Point p (X=4, Y=5)
Line l (Slope=1, YIntersect=1)
XとYを差し込みます:
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 / Y1されている...)Y-交差を固定
あなたはそのx1 - x2
が0
ではありませんチェックする必要があります。それがある場合は、ポイントがライン上にあるかどうかをチェックすると、あなたのポイントのY値がx1
かx2
のいずれかに等しいかどうかをチェックするのは簡単なことです。また、ポイントのX「は、X1」または「×2」でないことを確認します。
他のヒント
った機能を取り扱うイベントを要求めその結果が、先ほど任天堂さんのドリーウッド(テーマパーク図応用:
- 曖昧に-できることはあると部屋のためのエラーから機能を選択で使用される線をクリックします。
- 行ったエンドポイントとStartPoint、無限です。
- 処理にあたらなければならな直垂直方向と水平線を(x2-x1)==0の原因ゼロのその他の応答となります。
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;
}
の点R =(Rxが、RY)の点P =(PX、PY)とQ =を結ぶ直線上にあるかどうかを判断するための最良の方法は、(QX、QY)マトリックスの行列かどうかを確認することですP>
{{qx - px, qy - py}, {rx - px, ry - py}},
、すなわち(QX - PX)*(RY - PY) - (QY - PY)*(RX - PX)をこの溶液は、他に比べていくつかの関連する利点は、掲載している0に近いです:最初、それは特別なケースを必要としません垂直線に対して、第二、それは、(通常は遅い動作)第三のを分割しない、それはラインがほとんどである場合、不良浮動小数点動作をトリガしないが、非常に垂直しない。
行L0
とL1
とP
をテストする点の2点が与えられます。
(L1 - L0) * (P - L0)
n = (P - L0) - --------------------- (L1 - L0)
(L1 - L0) * (L1 - L0)
ベクターn
のノルムがP
とL0
通る線から点L1
の距離です。この距離は、(丸め誤差の場合)ゼロ又は十分に小さい場合、点はライン上にある。
のシンボル*
は内積を表します。
の例の
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)
私は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ですが、私は、これが最良のものである見つけます。
Thankx evryoneため。
y = m * x + c
この行の方程式です。 X&Yは座標です。各ラインは、それがy軸(C)と交差するその傾き(M)とすることを特徴とする。
の点(X1、Y1)の式は、X = X1及びY = Y1
に当てはまるかどうかをチェックすることにより、ライン上にあるのであればラインのM&Cが与えられると、あなたが決定することができますあなたはそのエンドポイントによって定義されたラインを持っている場合は、
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
}
あなたががゼロ除算をチェックする必要があります。
2Dラインは、一般的にここでは2つの変数xに式を用いて表され、Yは、周知の方程式である
これでGDIを想像+ラインは、次に(100、100)、Mの値=(0-100)/(0〜100)= 1は、このようにあなたの行の式はy方向であると(0,0)から引き出され0 = 1 *(x-0)=> Y = Xの
私たちは疑問点がこのラインに属しているかどうかをテストするために、その簡単でラインの方程式を持っている今という。もしX = X 3およびY = Y3を代入するとき、それは、ライン式を満たす場合に、与えられた点(X3、Y3)は、このラインに属します。例えば、ポイント(10、10)は、10 = 10以来、この行に属しますが、(10,12)が12!= 10以来、この行に属していない。
注:縦線について勾配(M)の値が無限大であるが、この特別な場合のためにあなたが直接垂直ラインの方程式を使用することができ、X = Cここで、C = X1 = X2
。 私が言っているけど、私は、これはこれを行うための最も効率的な方法であるかどうかわからないです。私が手にいくつかのより多くの時間を持っているとき、私は、より効率的な方法を試してみています。
この情報がお役に立てば幸いです。
の行の式は、次のとおりです。
y = mx + c
だからポイントはこの式を満たす場合には(a、b)は、このライン上にあり、すなわちb = ma + c
あなたはより具体的なのだろうか。
どのようなプログラミング言語は、あなたが話しているの?
どのような環境で、あなたが話しているの?
どのような「行」あなたが話していますか?テキスト?何点?画面上のXY?
slope/y-intercept
法に代わるものとして、私が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
はそれの終点までの線分の開始点から逆正接を決定します。
そして、開始点の観点から、我々はベクトルv
にARCTANを決定します。
これらの値が等しい場合、我々は、エンドポイントの観点からチェック
シンプルで、水平、垂直および他のすべての間で処理します。