- Joined
- Jul 29, 2007
- Messages
- 5,174
Polygons are defined as a position (x, y) and a set of vertices (x, y), with each vertex being an offset of the position (AKA object space).
A square, located at (50, 25) with a radii (half-radius for rectangles) of 10 could be defined as following:
And too the skeptics, having the code named "x" and "y" doesn't reflect on which plane this exists, you can input whatever you want (it's named like this because in any other sane environment Z is depth, not height).
A square, located at (50, 25) with a radii (half-radius for rectangles) of 10 could be defined as following:
JASS:
local real x = 50
local real y = 25
local integer size = 8
local real array data
// left top
set data[0] = -10 // x
set data[1] = 10 // y
// right top
set data[2] = 10
set data[3] = 10
// right bottom
set data[4] = 10
set data[5] = -10
// left bottom
set data[6] = -10
set data[7] = -10
And too the skeptics, having the code named "x" and "y" doesn't reflect on which plane this exists, you can input whatever you want (it's named like this because in any other sane environment Z is depth, not height).
JASS:
library PolygonIntersecion
globals
real array x_data
real array y_data
real array x_normals
real array y_normals
integer x_size
integer y_size
real x_segment_x
real x_segment_y
real y_segment_x
real y_segment_y
endglobals
function ProjectX takes real axis_x, real axis_y returns nothing
local integer i = 2
local real d
set x_segment_x = x_data[0] * axis_x + x_data[1] * axis_y
set x_segment_y = x_segment_x
loop
exitwhen i == size
set d = x_data[i] * axis_x + x_data[i+1] * axis_y
if d < x_segment_x then
set x_segment_x = d
endif
if d > x_segment_y then
set x_segment_y = d
endif
set i = i + 2
endloop
endfunction
function ProjectY takes real axis_x, real axis_y returns nothing
local integer i = 2
local real d
set y_segment_x = y_data[0] * axis_x + y_data[1] * axis_y
set y_segment_y = y_segment_x
loop
exitwhen i == size
set d = y_data[i] * axis_x + y_data[i+1] * axis_y
if d < y_segment_x then
set y_segment_x = d
endif
if d > y_segment_y then
set y_segment_y = d
endif
set i = i + 2
endloop
endfunction
function InitializeX takes real array x, integer size returns nothing
local integer i = 0
local real edge_x
local real edge_y
local real d
// if size % 2 != 0 then
// set size = size - 1
// endif
loop
exitwhen i == size
set x_data[i] = x[i]
set x_data[i+1] = x[i+1]
set edge_x = x[(i + 2 + 1) % size] - x[i];
set edge_y = x[(i + 2 + 2) % size] - x[i + 1]
set d = 1.0 / SquareRoot(edge_x * edge_x + edge_y * edge_y)
set edge_x = edge_x * d
set edge_y = edge_y * d
set x_normals[i] = edge_x
set x_normals[i+1] = edge_y
set i = i + 2
endloop
set x_size = size
endfunction
function InitializeY takes real array y, integer size returns nothing
local integer i = 0
local real edge_x
local real edge_y
local real d
// if size % 2 != 0 then
// set size = size - 1
// endif
loop
exitwhen i == size
set y_data[i] = y[i]
set y_data[i+1] = y[i+1]
set edge_x = y[(i + 2 + 1) % size] - y[i];
set edge_y = y[(i + 2 + 2) % size] - y[i + 1]
set d = 1.0 / SquareRoot(edge_x * edge_x + edge_y * edge_y)
set edge_x = edge_x * d
set edge_y = edge_y * d
set y_normals[i] = edge_x
set y_normals[i+1] = edge_y
set i = i + 2
endloop
set y_size = size
endfunction
function ArePolysIntersectingGlobal takes real x_pos_x, real x_pos_y, real y_pos_x, real y_pos_y returns boolean
local real offset_x = x_pos_x - y_pos_x
local real offset_y = x_pos_y - y_pos_y
local int i = 0
local real shift
local real x_length
local real y_length
local real x_center
local real y_center
local real overlap
loop
exitwhen i == x_size - 1
call ProjectPolygonX(x_normals[i], x_normals[i+1])
call ProjectPolygonY(x_normals[i], x_normals[i+1])
set shift = x_normals[i] * offset_x + x_normals[i+1] * offset_y
set x_segment_x = x_segment_x + shift
set x_segment_y = x_segment_y + shift
set x_length = (x_segment_y - x_segment_x) * 0.5
set y_length = (y_segment_y - y_segment_x) * 0.5
set x_center = x_segment_x + x_length
set y_center = y_segment_x + y_length
set overlap = (x_length + y_length) - RAbsBJ(x_center - y_center)
if overlap <= 0.0 then
return false
endif
set i = i + 2
endloop
set offset_x = y_pos_x - x_pos_x
set offset_y = y_pos_y - x_pos_y
set i = 0
loop
exitwhen i == y_size - 1
call ProjectPolygonX(y_normals[i], y_normals[i+1])
call ProjectPolygonY(y_normals[i], y_normals[i+1])
set shift = y_normals[i] * offset_x + y_normals[i+1] * offset_y
set y_segment_x = y_segment_x + shift
set y_segment_y = y_segment_y + shift
set x_length = (x_segment_y - x_segment_x) * 0.5
set y_length = (y_segment_y - y_segment_x) * 0.5
set x_center = x_segment_x + x_length
set y_center = y_segment_x + y_length
set overlap = (x_length + y_length) - RAbsBJ(x_center - y_center)
if overlap <= 0.0 then
return false
endif
set i = i + 2
endloop
return true
endfunction
function ArePolysIntersecting takes real x_pos_x, real x_pos_y, real array x, integer x_size, real y_pos_x, real y_pos_y, real array y, integer y_size returns boolean
call InitializeX(x, x_size)
call InitializeY(y, y_size)
return ArePolysIntersectingGlobal(x_pos_x, x_pos_y, y_pos_x, y_pos_y)
endfunction
endlibrary
Last edited: