Ray-casting algorithm: Difference between revisions
Content added Content deleted
m (→{{header|REXX}}: added/changed whitespace and comments, simplified code.) |
(→{{header|Lua}}: added Lua solution) |
||
Line 2,393: | Line 2,393: | ||
rand = Int(Rnd(0)*(hiNum-loNum+1)+loNum) |
rand = Int(Rnd(0)*(hiNum-loNum+1)+loNum) |
||
End Function </lang> |
End Function </lang> |
||
=={{header|Lua}}== |
|||
<lang lua>function Point(x,y) return {x=x, y=y} end |
|||
function Polygon(name, points) |
|||
local function contains(self, p) |
|||
local odd, eps = false, 1e-9 |
|||
local function rayseg(p, a, b) |
|||
if a.y > b.y then a, b = b, a end |
|||
if p.y == a.y or p.y == b.y then p.y = p.y + eps end |
|||
if p.y < a.y or p.y > b.y or p.x > math.max(a.x, b.x) then return false end |
|||
if p.x < math.min(a.x, b.x) then return true end |
|||
local red = a.x == b.x and math.huge or (b.y-a.y)/(b.x-a.x) |
|||
local blu = a.x == p.x and math.huge or (p.y-a.y)/(p.x-a.x) |
|||
return blu >= red |
|||
end |
|||
for i, a in ipairs(self.points) do |
|||
local b = self.points[i%#self.points+1] |
|||
if rayseg(p, a, b) then odd = not odd end |
|||
end |
|||
return odd |
|||
end |
|||
return {name=name, points=points, contains=contains} |
|||
end |
|||
polygons = { |
|||
Polygon("square", { Point(0,0), Point(10,0), Point(10,10), Point(0,10) }), |
|||
Polygon("squarehole", { Point(0,0), Point(10,0), Point(10,10), Point(0,10), Point(2.5,2.5), Point(7.5,2.5), Point(7.5,7.5), Point(2.5,7.5) }), |
|||
Polygon("strange", { Point(0,0), Point(2.5,2.5), Point(0, 10), Point(2.5,7.5), Point(7.5,7.5), Point(10,10), Point(10,0), Point(2.5,2.5) }), |
|||
Polygon("hexagon", { Point(3,0), Point(7,0), Point(10,5), Point(7,10), Point(3,10), Point(0,5) }) |
|||
} |
|||
points = { Point(5,5), Point(5,8), Point(-10,5), Point(0,5), Point(10,5), Point(8,5), Point(10,10) } |
|||
for _,poly in ipairs(polygons) do |
|||
print("Does '"..poly.name.."' contain the point..") |
|||
for _,pt in ipairs(points) do |
|||
print(string.format(" (%3.f, %2.f)? %s", pt.x, pt.y, tostring(poly:contains(pt)))) |
|||
end |
|||
print() |
|||
end</lang> |
|||
{{out}} |
|||
<pre>Does 'square' contain.. |
|||
( 5, 5)? true |
|||
( 5, 8)? true |
|||
(-10, 5)? false |
|||
( 0, 5)? false |
|||
( 10, 5)? true |
|||
( 8, 5)? true |
|||
( 10, 10)? false |
|||
Does 'squarehole' contain.. |
|||
( 5, 5)? false |
|||
( 5, 8)? true |
|||
(-10, 5)? false |
|||
( 0, 5)? false |
|||
( 10, 5)? true |
|||
( 8, 5)? true |
|||
( 10, 10)? false |
|||
Does 'strange' contain.. |
|||
( 5, 5)? true |
|||
( 5, 8)? false |
|||
(-10, 5)? false |
|||
( 0, 5)? false |
|||
( 10, 5)? true |
|||
( 8, 5)? true |
|||
( 10, 10)? false |
|||
Does 'hexagon' contain.. |
|||
( 5, 5)? true |
|||
( 5, 8)? true |
|||
(-10, 5)? false |
|||
( 0, 5)? false |
|||
( 10, 5)? true |
|||
( 8, 5)? true |
|||
( 10, 10)? false</pre> |
|||
=={{header|Nim}}== |
=={{header|Nim}}== |