Я синтаксис блица практически не помню, но что-то вроде:
function lerp#(a#,b#,t#)
return (1 - t#) * a# + t# * b#
end function
Type Vector3
x# = 0
y# = 0
z# = 0
End Type
function lerpVector3.Vector3(a.Vector3, b.Vector3, t#)
dim vec.Vector3
vec\x# = lerp(a\x#, b\x#, t#)
vec\y# = lerp(a\y#, b\y#, t#)
vec\z# = lerp(a\z#, b\z#, t#)
return vec
end function
А что касается перпендикуляра, то можно найти как построить уравнение прямой по двум точкам и уравнение кратчайшего расстояния от точки до прямой. Решая их можно получить точку, с перпендикулярной проекцией на грань. Уравнения эти я не помню, но они где-то есть в справочниках по высшей математике
UPD: Если бы у меня под рукой была математическая библиотека (для блица она даже где-то есть), то
1. Я бы, например, посчитал кватернион поворота вектора a1a2 в направлении оси 0X и повернул бы как вектор, так и точку, а затем t1 и t2 посчитал просто взяв компоненту x этих точек. И потом интерполировал
2. Например построил бы плоскость, проходящую через точку ap и перпендикулярную вектору a1a2. Потом бы нашел кратчайшее расстояние от точки a1 до плоскости (получил ее проекцию) и это была бы нужная точка.
В общем решений много
.