2009-05-26 51 views
3

我有一個簡單的對象,允許您分配三個屬性(x,y,z)(讓我們稱這個對象爲「point」,因爲這就是它)。然後我有一個方法的第二個對象,該方法接受第一個對象的兩個實例,並返回三維空間中兩個「點」之間的距離。我還需要一種方法,它將接受兩個「點」 和一個double,表示距離(從使用的第一個「點」參數)返回具有x,y,z座標的「點」對象的距離。一條線和一個球體相交?

除了計算所提供的兩點之間原始線上的點座標,即與第一點相距一定距離,我可以確定。

「點」 對象:

public class POR 
{ 
    private double PORX; 
    private double PORY; 
    private double PORZ; 

    public double X 
    { 
     get { return PORX; } 
     set { PORX = value; } 
    } 
    public double Y 
    { 
     get { return PORY; } 
     set { PORY = value; } 
    } 
    public double Z 
    { 
     get { return PORZ; } 
     set { PORZ = value; } 
    } 
    public POR(double X, double Y, double Z) 
    { 
     PORX = X; 
     PORY = Y; 
     PORZ = Z; 
    } 

然後我用:

public double PorDistance(POR por1, POR por2) 
    { 
     return Math.Round(Math.Sqrt(Math.Pow((por1.X - por2.X),2) + Math.Pow((por1.Y - por2.Y),2) + Math.Pow((por1.Z - por2.Z),2)),2); 
    } 

返回這兩點我需要這樣的東西

public POR IntersectPOR (POR por1, POR por2, double distance) 
{ 

} 

這裏距離之間的距離是從por1到por2的距離。

+2

您可以發佈一些代碼以向我們展示您到目前爲止的內容嗎?這聽起來有點像功課... – 2009-05-26 13:04:50

回答

5

這可以與載體一點幫助來完成。

假設你的出發點叫做P,另一個點是Q,距離是d。你想在PQ線上找到P點距離Q的點。

  1. 首先你需要找到旅行的方向。這是通過查找Q做 - P

    v = Point(Q.x - P.x, Q.y - P.y, Q.z - P.z) 
    
  2. 現在,你需要找到那個方向上的單位矢量,所以

    scale = sqrt(v.x*v.x + v.y*v.y + v.z*v.z) 
    unit = Point(v.x/scale, v.y/scale, v.z/scale) 
    
  3. 現在,你需要找到代表行進的距離向量:

    t = Point(unit.x*d, unit.y*d, unit.z*d) 
    
  4. 要找到最終位置,請將您的旅行向量添加到您的出發點:

    final = Point(P.x + t.x, P.y + t.y, P.z + t.z) 
    
+0

完美...我遇到的唯一事情是,如果輸入的距離大於實際距離....但我可以很容易地做這個檢查,因爲我已經計算了從我開始的 – Patrick 2009-05-26 13:40:59

1

它看起來像你想類似於:

public class Point 
{ 
    public double x, y, z; 

    // ctors, Add(), Subtract() omitted 

    public Point Normalize() 
    { 
     double m = Magnitude; 
     if (m != 0.0) return ScaleTo(1.0/m); 
     return new Point(); 
    } 

    public double Magnitude 
    { 
     get { return Math.Sqrt(x * x + y * y + z * z); } 
    } 

    public Point ScaleTo(double s) 
    { 
     return new Point(x * s, y * s, z * s); 
    } 
} 

public Point PointOnLine(Point from, Point to, double dist) 
{ 
    return from.Add(to.Subtract(from).Normalize().ScaleTo(dist)); 
} 
1

沒有實際的代碼,因爲我認爲這更像是一個概念性問題。 這可能不是最高效的,但是當我這樣做時,我只是將總距離和線段之間的比率應用於座標變化量。 例如,如果我有0,0,0和1,2,3點的總共三維距離是3.74,如果我想從第一個點放置一個單位的比例是1/3.74,所以新座標會從第一點到第二點的總距離的2673或.267,.534,.802

+0

這兩個點之間的距離,但我想到的是......但是往往會發生的是在第4次或第5次迭代之後......(線/射線可以改變方向)準確性下降......「4個右轉應該會讓你回到你開始的位置」但是這並沒有發生,我只是靠一個單位和一半來...它可能會在一個較小的系統中工作......但是當處理巨大的單位...和單位的數量......它可能會變得混亂...... – Patrick 2009-05-26 13:47:02

相關問題