Data commit
This commit is contained in:
parent
7387c8f97b
commit
cb5bb5e222
199093 changed files with 3378972 additions and 0 deletions
|
|
@ -0,0 +1,93 @@
|
|||
#macro min(x,y)
|
||||
Iif(x>y,y,x)
|
||||
#endmacro
|
||||
#macro max(x,y)
|
||||
Iif(x>y,x,y)
|
||||
#endmacro
|
||||
|
||||
type pnt 'typedef for a point
|
||||
x as double
|
||||
y as double
|
||||
end type
|
||||
|
||||
type edg 'typedef for an edge
|
||||
p1 as pnt
|
||||
p2 as pnt
|
||||
end type
|
||||
|
||||
function point_in_tri( r as pnt, a as pnt, b as pnt, c as pnt ) as boolean
|
||||
'uses barycentric coordinates to determine whether point r is in the triangle defined by a, b, c
|
||||
dim as double k = ((b.y - c.y)*(a.x - c.x) + (c.x - b.x)*(a.y - c.y))
|
||||
dim as double v = ((b.y - c.y)*(r.x - c.x) + (c.x - b.x)*(r.y - c.y)) / k
|
||||
dim as double w = ((c.y - a.y)*(r.x - c.x) + (a.x - c.x)*(r.y - c.y)) / k
|
||||
dim as double z = 1 - v- w
|
||||
if v<0 or v>1 then return false
|
||||
if w<0 or w>1 then return false
|
||||
if z<0 or z>1 then return false
|
||||
return true
|
||||
end function
|
||||
|
||||
function bbox_overlap( a1 as pnt, a2 as pnt, b1 as pnt, b2 as pnt) as boolean
|
||||
dim as double a1x = min(a1.x, a2.x), a1y = min(a1.y, a2.y)
|
||||
dim as double a2x = max(a1.x, a2.x), a2y = max(a1.y, a2.y)
|
||||
dim as double b1x = min(b1.x, b2.x), b1y = min(b1.y, b2.y)
|
||||
dim as double b2x = max(b1.x, b2.x), b2y = max(b1.y, b2.y)
|
||||
if a1x > b2x or b1x > a2x then return false
|
||||
if a1y > b2y or b2y > a2y then return false
|
||||
return true
|
||||
end function
|
||||
|
||||
function ccw( a as pnt, b as pnt, c as pnt) as double
|
||||
return (b.x - a.x) * (c.y - a.y) - (c.x - a.x) * (b.y - a.y)
|
||||
end function
|
||||
|
||||
function line_intersect( a as edg, b as edg ) as boolean
|
||||
if ccw(a.p1, a.p2, b.p1)*ccw(a.p1, a.p2, b.p2) > 0 then return false
|
||||
if ccw(b.p1, b.p2, a.p1)*ccw(b.p1, b.p2, a.p2) > 0 then return false
|
||||
if not bbox_overlap( a.p1, a.p2, b.p1, b.p2 ) then return false
|
||||
return true
|
||||
end function
|
||||
|
||||
function triangle_overlap( a() as pnt, b() as pnt ) as boolean
|
||||
'if two triangles overlap then either a corner of one triangle is inside
|
||||
'the other OR an edge of one triangle intersects an edge of the other.
|
||||
dim as uinteger i, j
|
||||
dim as edg c, d
|
||||
for i = 0 to 2
|
||||
if point_in_tri( a(i), b(0), b(1), b(2) ) then return true
|
||||
if point_in_tri( b(i), a(0), a(1), a(2) ) then return true
|
||||
c.p1.x = a(i).x
|
||||
c.p1.y = a(i).y
|
||||
c.p2.x = a((i+1) mod 3).x
|
||||
c.p2.y = a((i+1) mod 3).y
|
||||
for j = 0 to 2
|
||||
d.p1.x = b(i).x
|
||||
d.p1.y = b(i).y
|
||||
d.p2.x = b((i+1) mod 3).x
|
||||
d.p2.y = b((i+1) mod 3).y
|
||||
if line_intersect( c, d ) then return true
|
||||
next j
|
||||
next i
|
||||
return 00
|
||||
end function
|
||||
|
||||
data 0,0 , 5,0 , 0,5 , 0,0 , 5,0 , 0,6
|
||||
data 0,0 , 0,5 , 5,0 , 0,0 , 0,5 , 5,0
|
||||
data 0,0 , 5,0 , 0,5 , -10,0 , -5,0 , -1,6
|
||||
data 0,0 , 5,0 , 2.5,5 , 0,4 , 2.5,-1 , 5,4
|
||||
data 0,0 , 1,1 , 0,2 , 2,1 , 3,0 , 3,2
|
||||
data 0,0 , 1,1 , 0,2 , 2,1 , 3,-2 , 3,4
|
||||
data 0,0 , 1,0 , 0,1 , 1,0 , 2,0 , 1,1
|
||||
|
||||
dim as uinteger t, i
|
||||
dim as pnt a(0 to 2), b(0 to 2)
|
||||
|
||||
for t = 1 to 7
|
||||
for i = 0 to 2
|
||||
read a(i).x, a(i).y
|
||||
next i
|
||||
for i = 0 to 2
|
||||
read b(i).x, b(i).y
|
||||
next i
|
||||
print triangle_overlap( a(), b() )
|
||||
next t
|
||||
Loading…
Add table
Add a link
Reference in a new issue