Anonymous user
Ray-casting algorithm: Difference between revisions
new class: Edge, output provided (Scala)
m (→{{header|REXX}}: used different glyph for 2nd quoted value (infinity).) |
(new class: Edge, output provided (Scala)) |
||
Line 2,709:
=={{header|Scala}}==
{{trans|D}}
<lang scala>package scala.ray_casting
case class Figure(name: String, edges: ((Double, Double), (Double, Double))*) {}▼
object Ray_casting extends App {▼
val figures = Array(Figure("Square", ((0.0, 0.0), (10.0, 0.0)),▼
if
if (p._2 == _1._2
if
((10.0, 10.0), (0.0, 10.0)), ((0.0, 10.0), (0.0, 0.0)),▼
if
val blue =
val red = if
((0.0, 10.0), (2.5, 7.5)), ((2.5, 7.5), (7.5, 7.5)),▼
((7.5, 7.5), (10.0, 10.0)), ((10.0, 10.0), (10.0, 0.0)),▼
((10.0, 0), (2.5, 2.5))),▼
Figure("Exagon", ((3.0, 0.0), (7.0, 0.0)), ((7.0, 0.0), (10.0, 5.0)),▼
((10.0, 5.0), (7.0, 10.0)), ((7.0, 10.0), (3.0, 10.0)),▼
((3.0, 10.0), (0.0, 5.0)), ((0.0, 5.0), (3.0, 0.0))))▼
val points = Array((5.0, 5.0), (5.0, 8.0), (-10.0, 5.0), (0.0, 5.0), (10.0, 5.0), (8.0, 5.0), (10.0, 10.0))▼
}
case class Figure(name: String, edges: Seq[Edge]) {
def contains(p: (Double, Double)) = edges.count(_.raySegI(p)) % 2 != 0
}
▲object Ray_casting extends App {
▲
Figure("Strange", Seq(((0.0, 0.0), (2.5, 2.5)), ((2.5, 2.5), (0.0, 10.0)),
((0.0, 10.0), (2.5, 7.5)), ((2.5, 7.5), (7.5, 7.5)), ((7.5, 7.5), (10.0, 10.0)),
▲
▲
println("Is point inside figure " + f.name + '?')▼
▲ }
println("points: " + points)
▲ private def raySegI(p: (Double, Double), e: ((Double, Double), (Double, Double))): Boolean = {
for (f <- figures) {
▲ val epsilon = 0.00001
println("
println("result: " + (points map f.contains))
▲ return false
▲ blue >= red
▲ }
private
}</lang>
{{out}}
<pre>points: List((5.0,5.0), (5.0,8.0), (-10.0,5.0), (0.0,5.0), (10.0,5.0), (8.0,5.0), (10.0,10.0))
figure: Square
List(Edge((0.0,0.0),(10.0,0.0)), Edge((10.0,0.0),(10.0,10.0)), Edge((10.0,10.0),(0.0,10.0)), Edge((0.0,10.0),(0.0,0.0)))
result: List(true, true, false, false, true, true, false)
figure: Square hole
List(Edge((0.0,0.0),(10.0,0.0)), Edge((10.0,0.0),(10.0,10.0)), Edge((10.0,10.0),(0.0,10.0)), Edge((0.0,10.0),(0.0,0.0)), Edge((2.5,2.5),(7.5,2.5)), Edge((7.5,2.5),(7.5,7.5)), Edge((7.5,7.5),(2.5,7.5)), Edge((2.5,7.5),(2.5,2.5)))
result: List(false, true, false, false, true, true, false)
figure: Strange
List(Edge((0.0,0.0),(2.5,2.5)), Edge((2.5,2.5),(0.0,10.0)), Edge((0.0,10.0),(2.5,7.5)), Edge((2.5,7.5),(7.5,7.5)), Edge((7.5,7.5),(10.0,10.0)), Edge((10.0,10.0),(10.0,0.0)), Edge((10.0,0.0),(2.5,2.5)))
result: List(true, false, false, false, true, true, false)
figure: Exagon
List(Edge((3.0,0.0),(7.0,0.0)), Edge((7.0,0.0),(10.0,5.0)), Edge((10.0,5.0),(7.0,10.0)), Edge((7.0,10.0),(3.0,10.0)), Edge((3.0,10.0),(0.0,5.0)), Edge((0.0,5.0),(3.0,0.0)))
result: List(true, true, false, false, true, true, false)
</pre>
=={{header|Smalltalk}}==
|