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

Добавлен , опубликован
Алгоритмы, Наработки и Способности
Способ реализации:
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
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
27
4 года назад
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 перепишет, тк вар не может возвращать два значения
ссылка

0
27
4 года назад
0
эх... почему-то у меня алгоритмы точек пересечения работают не стабильно
2
32
4 года назад
2
Есть функция в worm war - от близардов, там работает.
1
27
4 года назад
Отредактирован MpW
1
вот пример хотел показать
тфу четвертый случай, ладно посмотрю карту червей

в карте worm war вот такая функция (вполне рабочая)
function InterLineLine takes real x1, real y1, real x2, real y2, real a1, real b1, real a2, real b2, location loc returns boolean
    local real p = (x2-x1)*(b2-b1)-(y2-y1)*(a2-a1)
    local real x
    local real y

    if ( p == 0 ) then
        return false
    endif

    set x =  ((x2-x1)*(a2-a1)*(y1-b1)+(x2-x1)*(b2-b1)*a1-(y2-y1)*(a2-a1)*x1)/p
    set y = -((y2-y1)*(b2-b1)*(x1-a1)+(y2-y1)*(a2-a1)*b1-(x2-x1)*(b2-b1)*y1)/p
    call MoveLocation( loc, x, y )
    return true
endfunction
Загруженные файлы
0
28
4 года назад
0
Потому что векторы нужно использовать.
0
27
4 года назад
Отредактирован MpW
0
это тоже не работает как надо (
0
28
4 года назад
0
Steal nerves, а как надо?
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.