2009-05-26 2 views
3

У меня есть простой объект, который позволяет вам назначить три свойства (x, y, z) (позволяет называть этот объект «точкой», потому что именно это и есть). Затем у меня есть второй объект с методом, который принимает два экземпляра первого объекта и возвращает расстояние между двумя «точками» в трехмерном пространстве. Мне также нужен метод, который примет две «точки» и двойной, представляющий пройденное расстояние (из используемого первого параметра «точка»), который возвращает объект «точка» с его координатами 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

Можете ли вы опубликовать код, чтобы показать нам, что у вас есть до сих пор? Это звучит немного как домашнее задание ... –

ответ

5

Это может быть сделано с небольшим количеством помощи векторов.

Скажем, ваша отправная точка называется P, а другая точка Q, а расстояние d. Вы хотите, чтобы найти точку на линии PQ на расстоянии г от Р в направлении 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

Идеально ... единственное, что я натолкнулся, - это если введенное расстояние больше фактического расстояния ....но я могу легко выполнить эту проверку, так как im уже вычисляет расстояние между двумя точками от get-go – Patrick

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 с первой точки, это соотношение равно 1/3,74, поэтому новая координата будет .2673 от общего расстояния от первой точки ко второй или .267, .534, .802

+0

. Я подумал об этом .... но то, что имеет тенденцию, это то, что после 4-й или 5-й итераций ... (строка/ray может изменить направление) точность падает ... «4 поворотов вправо вернут вас туда, где вы начали», но это не так хорошо ... я опускался примерно на единицу и половину ... это, вероятно, работайте в более мелкой системе ... но при работе с огромными единицами ... и очертаниями единиц единиц ... это может стать беспорядочным ... – Patrick

+0

@Patrick - это потому, что вы округляете. Почему ты? – NVRAM

Смежные вопросы