Пересечение двух отрезков

» опубликован
» Способ реализации: vJass
» Тип: Алгоритм
Функия проверяет отрезки на пересечения, если они пересекаются, то функция возвращяет true и устанавливает в глобалке точку пересечения.
globals
    real x
    real y
endglobals

function linecrossline takes real x1, real y1, real x2, real y2, real x3, real y3, real x4, real y4 returns boolean
    local real i = (y4-y3)*(x2-x1)-(x4-x3)*(y2-y1)
    local real lx = 0.00
    local real ly = 0.00
    if i == 0.00 then
    else
        set lx = ((x4-x3)*(y1-y3)-(y4-y3)*(x1-x3))/i
        set ly = ((x2-x1)*(y1-y3)-(y2-y1)*(x1-x3))/i
        if lx <= 0.00 and ly <= 0.00 and lx >= 1.00 and ly >= 1.00 then
        set x = x1+lx*(x2-x1)
        set y = y1+ly*(y2-y1)
        return true
        endif
    endif
    return false
endfunction


Просмотров: 1 085

Steal nerves #1 - 1 месяц назад 0
эта функция работает?
например здесь вернет false, ибо i == 0.00:
отрезок x1= 0; y1=0; x2=0; y2=100
отрезок x3=50; y3=50; x4=-50; y4=50
большая часть вычислении возвращает false, наверн просто в координатах нули


» алгоритм: проверка на пересечение отрезков
function CrossLines takes real x1, real y1, real x2, real y2, real x3, real y3, real x4, real y4 returns boolean
return (((x3-x1)*(y2-y1) - (y3-y1)*(x2-x1)) * ((x4-x1)*(y2-y1) - (y4-y1)*(x2-x1)) <= 0) and (((x1-x3)*(y4-y3) - (y1-y3)*(x4-x3)) * ((x2-x3)*(y4-y3) - (y2-y3)*(x4-x3)) <= 0)
endfunction
» алгоритм: точка пересечения
function LineIntersect  takes real x1, real y1, real x2, real y2, real x3, real y3, real x4, real y4 returns nothing

local real LDetLineA = x1*y2 - y1*x2
local real LDetLineB = x3*y4 - y3*x4
local real LDiffLAx = x1 - x2
local real LDiffLAy = y1 - y2
local real LDiffLBx = x3 - x4
local real LDiffLBy = y3 - y4
local real LDetDivInv = 1 / ((LDiffLAx*LDiffLBy) - (LDiffLAy*LDiffLBx))
local real x = ((LDetLineA*LDiffLBx) - (LDiffLAx*LDetLineB)) * LDetDivInv
local real y = ((LDetLineA*LDiffLBy) - (LDiffLAy*LDetLineB)) * LDetDivInv

call DisplayTextToForce( GetPlayersAll(), "точка пересечения: " + R2S(x) + " , " + R2S(y) )
endfunction
кому надо сам на глобалки x,y перепишет, тк вар не может возвращать два значения
ссылка