あなたが提案するものは非常に複雑になる可能性があり (同等の条件下で多くのポイント)、正確なアルゴリズムを提供するには (はるかに) より多くの作業が必要になることに注意してください。より単純な状況 (あなたの写真のようなもの) を処理することはそれほど難しくありません。以下を含める必要があります。
緯度/経度の値をデカルト座標に変換します (計算を簡単にするためです。ただし、この手順をスキップすることもできます)。このリンクでは、この面でいくつかのインスピレーションを得ることができます。それは C# ですが、アイデアはとにかく明確です。
使用可能なすべての点を「対で」反復し、分析対象の点 ( Mypos
) がそれらによって形成された線の中間位置にあるかどうかを確認します。以下のコードに示されているように、この計算は非常に単純であるため、事前にフィルター処理を行う必要はありません (事前に近いポイントを探します)。
.
Dim point1() As Double = New Double() {0, 0} 'x,y
Dim point2() As Double = New Double() {0, 3}
Dim pointToCheck() As Double = New Double() {0.05, 2}
Dim similarityRatio As Double = 0.9
Dim minValSimilarDistance As Double = 0.001
Dim similarityDistance As Double = 0.5
Dim eq1 As Double = (point2(0) - point1(0)) * (pointToCheck(1) - point1(1))
Dim eq2 As Double = (point2(1) - point1(1)) * (pointToCheck(0) - point1(0))
Dim maxVal As Double = eq1
If (eq2 > eq1) Then maxVal = eq2
Dim inLine = False
Dim isInBetween As Boolean = False
If (eq1 = eq2 OrElse (maxVal > 0 AndAlso Math.Abs(eq1 - eq2) / maxVal <= (1 - similarityRatio))) Then
inLine = True
ElseIf (eq1 <= minValSimilarDistance AndAlso eq2 <= similarityDistance) Then
inLine = True
ElseIf (eq2 <= minValSimilarDistance AndAlso eq1 <= similarityDistance) Then
inLine = True
End If
If (inLine) Then
'pointToCheck part of the line formed by point1 and point2, but not necessarily between them
Dim insideX As Boolean = False
If (pointToCheck(0) >= point1(0) AndAlso pointToCheck(0) <= point2(0)) Then
insideX = True
Else If (pointToCheck(0) >= point2(0) AndAlso pointToCheck(0) <= point1(0)) Then
insideX = True
End If
if(insideX) Then
If (pointToCheck(1) >= point1(1) AndAlso pointToCheck(1) <= point2(1)) Then
isInBetween = True
ElseIf (pointToCheck(1) >= point2(1) AndAlso pointToCheck(1) <= point1(1)) Then
isInBetween = True
End If
End If
End If
If (isInBetween) Then
'pointToCheck is between point1 and point2
End If
ご覧のとおり、さまざまな比率を含めて、正確な条件を微調整できるようにしました (ポイントは、ほとんどの場合、直線上に正確には収まりません)。similarityRatio
多かれ少なかれ類似している「方程式」を説明します (つまり、X と Y の値が線内に正確には収まりませんが、十分に近い)。similarityRatio
ゼロを含むケース (たとえば、同じ X または Y) を適切に処理できません。これが目的でminValSimilarDistance
ありsimilarityDistance
、目的です。これらの値を調整するか、比率を再定義することができます (「方程式」ではなく、ポイント間の X/Y 変動に関して)。