【问题标题】:find location between two other locations查找其他两个位置之间的位置
【发布时间】:2017-01-13 00:58:54
【问题描述】:

我正在尝试在两个现有位置 (x,y,z) 之间找到一个新位置 (x,y,z)。

例如假设 locA 和 locB 之间的距离是 2500。locNew 应该始终是距离为 300 的位置,并且应该在 locA 和 locB 的线上。

找到 locA 和 locB 之间的中点我没有问题,但我一直在努力寻找针对这种特定情况的 locNew。

我试过了,但它返回的点不在从 locA 到 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}

【问题讨论】:

标签: coordinates distance calc


【解决方案1】:

我认为这可能会对您有所帮助:

-- 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#

【讨论】:

    【解决方案2】:

    我相信这应该可行:

    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)
    

    抱歉,如果这不能回答您的问题,我不确定您所说的“非数学形式”是什么意思

    【讨论】:

    • 如果 x,y,z 与问题中的相同,则此方法有效,但当 locA = {x=1474,y=95,z=838} 和 locB = {x=2226, y=95,z=1190}。非数学没有 √x、iφ、∝.. 等
    • @RichardAvalos,这适用于任何协调员。您可以使用此解决方案在此处计算距离calculatorsoup.com/calculators/geometry-solids/…
    • @RichardAvalos 这应该适用于任何坐标
    猜你喜欢
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-09
    • 1970-01-01
    相关资源
    最近更新 更多