2016-09-05 9 views
0

Я пытаюсь найти новое местоположение (x, y, z) между двумя уже существующими местоположениями (x, y, z).найти местоположение между двумя другими местоположениями

например. скажем, расстояние между locA и locB равно 2500. locNew всегда должно быть местоположением с расстоянием 300 и должно быть на линии locA и locB.

У меня нет проблем с поиском середины между locA и locB, но я продолжаю стучать головой, пытаясь найти locNew для этой конкретной ситуации.

Я попытался это, но она возвращает точку, а не на линии от Лока до locB:

locA = {x = 400, y = 400, z = 400} 
locB = {x = 1200, y = 1200, z = 1200} 

--this is wrong somehow 
locNew_x = (locB.x+locA.x)-(locB.x-300) 
locNew_y = (locB.y+locA.y)-(locB.y-300) 
locNew_z = (locB.z+locA.z)-(locB.z-300) 
locNew = {x = locNew_x, y = locNew_y, z = locNew_z} 

--draws a line between two objects 
DrawLine(locA, locNew) 

кодирования язык не важен, так как расчет должен выглядеть «почти» то же самое в большинстве языков , имейте в виду, что они ищут решение в НЕ-математической форме.

Обновление: Стандартные решения работают, если x, y, z одинаковы, но не в том случае, если они различны, как в приведенном ниже примере.

locA = {x = 1475, y = 95, z = 838} 
locB = {x = 2226, y = 110, z = 1190} 
+0

Возможный дубликат [? Нахождение координат точки между двумя точками] (http://stackoverflow.com/questions/2886092/finding-coordinates-of-a-point-between- две точки) –

ответ

0

Я думаю, что это может помочь вам:

-- Substract vectors 
function subVectors(vector_A, vector_B) 
    return {x = (vector_A.x - vector_B.x), 
      y = (vector_A.y - vector_B.y), 
      z = (vector_A.z - vector_B.z)} 
end 

--- Calculate length of vector 
function vectorLength(vector_A) 
    return math.sqrt(
     (vector_A.x * vector_A.x) + 
     (vector_A.y * vector_A.y) + 
     (vector_A.z * vector_A.z) 
    ) 
end 

-- Convert to unit vector 
function toUnitVector(vector_A) 
    local ln = vectorLength(vector_A) 
    return {x = (vector_A.x/ln), y = (vector_A.y/ln), z = (vector_A.z/ln)} 
end 

-- calculate position of vector which is on the line between A and B and 
-- its distance from B point equals `distance` 
function distancedVector(vector_A, vector_target, distance) 
    local vec = subVectors(vector_A, vector_target) 
    local unitVec = toUnitVector(vec) 

    return { 
     x = (vector_target.x + unitVec.x * distance), 
     y = (vector_target.y + unitVec.y * distance), 
     z = (vector_target.z + unitVec.z * distance) 
    } 
end 

local locA = {x = 0.0, y = 0.0, z = 0.0} 
local locB = {x = 900.0, y = 900.0, z = 900.0} 

local ret = distancedVector(locA, locB, 10) 

print(string.format("x: %f\ny: %f\nz: %f\n", ret.x, ret.y, ret.z)) 

Выход:

x: 894.226497 
y: 894.226497 
z: 894.226497 

Похожие: Move point to another in c#

+0

отлично работает! ти –

1

Я считаю, что это должно работать:

locA = {x = 400, y = 400, z = 400} 
locB = {x = 1200, y = 1200, z = 1200} 

scalar = 300/distance(locA,locB); --target distance/existing distance 

locNew_x = locA.x + (locB.x - locA.x) * scalar 
locNew_y = locA.y + (locB.y - locA.y) * scalar 
locNew_z = locA.z + (locB.z - locA.z) * scalar 
locNew = {x = locNew_x, y = locNew_y, z = locNew_z} 


DrawLine(locA, locNew) 

Извините, если это не отвечает на вопрос, я не совсем уверен, что вы имеете в виду под «в математической форме, не»

+0

это работает, если x, y, z то же, что и в вопросе, но не тогда, когда locA = {x = 1474, y = 95, z = 838} и locB = {x = 2226, y = 95 , г = 1190}. не математически без √x, iφ, α .. и т. д. –

+1

@RichardAvalos, это работает для любых согласований. Вы можете рассчитать расстояния здесь, используя это решение http://www.calculatorsoup.com/calculators/geometry-solids/distance-two-points.php –

+1

@RichardAvalos Это должно работать с любыми координатами –

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

  • Нет связанных вопросов^_^