2015-04-14 79 views
1

我有編碼的功能的問題,即會做下列臨時座標:如果計算的距離超過100

功能將需要2組座標(X,Y,Z)的。第一組是起點,第二組是終點。 現在首先,我將不得不確定這兩點之間的距離。如果距離大於讓我們說100,那麼我將不得不計算一個臨時點。然後,我將計算第一組座標和此臨時點之間的距離。請看下面的插圖,我相信事情會更容易理解。

功能,計算點A之間的新點,B:

x = (x1+x2/2) 
y = (y1+y2/2) 
z = (z1+z2/2) 

功能,計算距離爲:

public float DistanceTo(float x, float y, float z, float x2, float y2, float z2) 
     { 
      float a = x - x2; 
      float b = y - y2; 
      float c = z - z2; 

      return Math.Sqrt(a * a + b * b + c * c); 

     } 

鏈接說明:

enter image description here

也許是我的方法將是CPU很重,也許很慢(?)b目前我不知道如何解決這個問題。

基本上我需要一個函數,如果(距離< 100)從A到B以增量進行。

感謝您閱讀並感謝您發佈的任何解決方案!

PS請不要讓我的油漆技能的樂趣:)

+1

只是計算沿線的點 – Ewan

+0

問題是我該怎麼做?你能提供一個例子嗎? – Tagyoureit

+0

爲什麼混合float,double和int? – gdir

回答

0

你可以做到這一點遞歸

創建一個Point結構表示R3中的一個點,與2層實用的方法來計算距離和中點。

struct Point 
{ 
    public double x; 
    public double y; 
    public double z; 

    public double Distance(Point b) 
    { 
     return Math.Sqrt(Math.Pow(b.x - this.x, 2) + 
         Math.Pow(b.y - this.y, 2) + 
         Math.Pow(b.z - this.z, 2)); 
    } 

    public Point MidPoint(Point b) 
    { 
     return new Point() 
     { 
      x = (this.x + b.x)/2, 
      y = (this.y + b.y)/2, 
      z = (this.z + b.z)/2 
     }; 
    } 
} 

,寫一個簡單的遞歸函數,將計算距離和遞歸調用本身,直到點和臨時點之間的距離小於maxSegmentLength是100你的情況:

public static Point GetPoint(Point a, Point b, double maxSegmentLength) 
    { 
     var distance = a.Distance(b); 
     if (distance < maxSegmentLength) 
      return b; 
     else 
      return GetPoint(a, a.MidPoint(b),maxSegmentLength); 
    } 

或更有效地與載體:

struct Vector 
    { 
     public double Vx; 
     public double Vy; 
     public double Vz; 
     public double R; 
     public Vector(Point a,Point b) 
     { 
      R = a.Distance(b); 
      Vx = (b.x - a.x)/R; 
      Vy = (b.y - a.y)/R; 
      Vz = (b.z - a.z)/R; 
     } 

    } 


public static Point GetPoint(Point a, Point b,double maxSegmentLength) 
     { 
      var Vab = new Vector(a, b); 
      var dAC = Vab.R; 
      while (dAC > maxSegmentLength) { dAC /= 2; } //or replace this line and the one above it with var dAC=Math.Pow(0.5,(int)(-(Math.Log(maxSegmentLength/Vab.R)/Math.Log(2))) + 1)*Vab.R; 
      return new Point() { 
       x = a.x + Vab.Vx * dAC , 
       y = a.y + Vab.Vy * dAC , 
       z = a.z + Vab.Vz * dAC 
      }; 
     } 
+0

不確定你的數學是否正確,不應該是x = a.x +(a.x-b.x)/ 2? – Ewan

+1

@Ewan https://www.easycalculation.com/analytical/learn-midpoint3.php –

+0

@Ewan:你可能是指'ax +(bx-ax)/ 2'(考慮ax = 150和bx = 0的情況。顯然你希望你的新x是75.隨着你的計算,它將是225(因爲你的矢量ab從b到a,所以你應該把它加到b或者反轉它),我給出的公式等價於答案中的一個,只是重新排列了一下,這種格式的一個優點是你可以用它來定義a和b之間的連線,參數爲a.x + t(bx-ax)。 0到1會在連線兩點上給予點數,讓你更容易找到多點。 – Chris

1

計算距離d(xb,yb,zb)(開始)到(xe,ye,ze)(結束)。計算部件數量N=(int)((d-1)/100)+1。計算

xk = xb + (k*(xe-xb))/N 
yk = yb + (k*(ye-yb))/N 
zk = zb + (k*(ze-zb))/N 

k=1,...,N-1相處,距離不超過100段等距點。

0

如果該點始終處於中點那麼它的距離總是原

01的一半
public double Calc(Point A, Point B) 
{ 
    double d = Distance(A,B); 
    while(d>100) 
    { 
     d/=2; 
    } 
    return d; 
}