2017-01-26 32 views
1

私は「似ている」と多くの質問を読んだが、誰も私には良いことはなかった。私は曲線と直線からの最長距離を知りたいと思っています。曲線はユーザのタッチ入力であり、すべての点であり、直線は開始タッチ点から終了タッチ点までである。UNITYの直線と曲線との間の最長距離

Here is an example of what I want to get

それを達成するための最善かつ効率的な方法は何ですか?

ありがとうございます。

+2

これはC#の問題よりも数学的な問題だと思います。この式は、距離を得るために使用できるhttps://en.wikipedia.org/wiki/Distance_from_a_point_to_a_line#Line_defined_by_two_pointsです。 – Fif

+0

基本的には、直線/曲線上の任意の点から最短距離の最長距離が必要です。あなたはそれぞれの候補を個別に計算し、最も長い候補を選択する必要があります。 –

+0

作業するコードを教えてもらえますか?たとえば、コードにカーブはどのように存在しますか?それは 'IEnumerable 'ですか?あなたのラインはどのように存在していますか? – Lumen

答えて

0

あなたの曲線はIEnumerable<Point> curveで与えられ、あなたの行は2点startendで与えられているとします。

Func<Point, double> distance = p => 
    Math.Abs(
      (end.Y - start.Y)*p.X 
     - (end.X - start.X)*p.Y 
     + end.X*start.Y 
     - end.Y*start.X 
    ) 
    /Math.Sqrt(
      (end.Y - start.Y)*(end.Y - start.Y) 
     + (end.X - start.X)*(end.X - start.X)); 

Point nearest = curve.OrderBy(distance).First(); 
Point farthest = curve.OrderByDescending(distance).First(); 

データ上の1回の反復が十分であるため、これは、それを行うための最も効率的な方法ではないとソートが過剰です。しかしLinqにはArgMinAndMaxByが組み込まれておらず、速度は問題にならないかもしれません。

タイプPointSystem.Drawing)をVector2タイプで置き換えることができます。

+0

私のカーブは、2倍のVector2によって与えられています。あなたのコードにあるポイントがそれぞれの値であるかどうかはわかりません。私はC#のかなりのnoobです、申し訳ありません。 EDIT:スピードが問題ですが、ゲームに遅れをとらないほど速ければ良いでしょう。それは私が持っている主要な問題であり、私はそれを解決する方法を知らない。 –

+0

@DanielBlanco私はあなたが 'System 'の' Point'を置き換えることができると確信しています。描画 ')を 'Vector2'で描画します。 – Lumen

0

直線と曲線の間の最長距離を求めるのであれば...曲線は最も長い距離を持っています。計算を使用して曲線の正確な距離を推定できます曲線上の直線セグメントの数。より多くの線分は、距離の近似を改善する可能性が高くなります。

関連する問題