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}}
From D snippet.
<lang scala>package scala.ray_casting
case class Figure(name: String, edges: ((Double, Double), (Double, Double))*) {}
 
case class FigureEdge(name_1: String, edges: ((Double, Double), _2: (Double, Double))*) {}
object Ray_casting extends App {
import Math._
import Double._
 
private def raySegI(p: (Double, Double), e: ((Double, Double), (Double, Double))): Boolean = {
val figures = Array(Figure("Square", ((0.0, 0.0), (10.0, 0.0)),
if ((10_1.0,_2 > 0_2.0_2), return Edge(10.0_2, 10.0_1)), ((10.0, 10.0), raySegI(0.0, 10.0p)),
if (p._2 == _1._2 ((0|| p.0,_2 10== _2.0_2), return raySegI((0p.0_1, 0p.0_2 + epsilon))),
if Figure("Squarep._2 hole",> ((0_2.0,_2 0.0),|| (10p.0,_2 0.0)),< ((10_1.0,_2 0|| p.0),_1 > max(10_1.0_1, 10_2.0_1)),
return false
((10.0, 10.0), (0.0, 10.0)), ((0.0, 10.0), (0.0, 0.0)),
if ((2p.5,_1 2.5),< min(7_1.5_1, 2_2.5_1)), ((7.5,return 2.5), (7.5, 7.5)),true
val blue = if (abs(7_1.5,_1 7- p.5_1), (2.5,> 7.5)MinValue), ((2p.5,_2 7- _1.5_2), / (2p.5,_1 2- _1.5_1))), else MaxValue
val red = if Figure("Strange", abs((0_1.0,_1 - 0_2.0_1), (2.5,> 2.5)MinValue), ((2_2.5,_2 2- _1.5_2), / (0_2.0,_1 10- _1.0_1)), else MaxValue
blue >= red
((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))))
 
final val epsilon = 0.00001
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 {
val figures = ArraySeq(Figure("Square", Seq(((0.0, 0.0), (10.0, 0.0)), ((10.0, 0.0), (10.0, 10.0)),
((10.0, 10.0), (0.0, 10.0)), ((0.0, 10.0), (0.0, 0.0)))),
Figure("Square hole", Seq((7(0.50, 70.50), (10.0, 100.0)), ((10.0, 100.0), (10.0, 010.0)),
((10.0, 10.0), (0.0, 10.0)), ((0.0, 10.0), (0.0, 0.0)), ((2.5, 2.5), (7.5, 2.5)),
((7.5, 2.5), (7.5, 7.5)),((37.05, 107.05), (02.05, 57.05)), ((02.05, 57.05), (32.05, 02.05)))),
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)),
((010.0, 10.0), (210.50, 70.50)), ((210.50, 70.50), (72.5, 72.5)))),
Figure("Exagon", Seq(((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)), ((103.0, 510.0), (70.0, 105.0)), ((70.0, 105.0), (3.0, 100.0)),)))
 
val points = ArraySeq((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))
figures foreach { f =>
println("Is point inside figure " + f.name + '?')
points foreach { p => println(" " + p + ": " + contains(f, p)) }
println
}
 
println("points: " + points)
private def raySegI(p: (Double, Double), e: ((Double, Double), (Double, Double))): Boolean = {
for (f <- figures) {
val epsilon = 0.00001
println("Is point inside figure: " + f.name + '?')
if (e._1._2 > e._2._2)
println(" return" raySegI(p, (e._2,+ ef._1)edges)
println("result: " + (points map f.contains))
if (p._2 == e._1._2 || p._2 == e._2._2)
}
return raySegI((p._1, p._2 + epsilon), e)
if (p._2 > e._2._2 || p._2 < e._1._2 || p._1 > max(e._1._1, e._2._1))
return false
if (p._1 < min(e._1._1, e._2._1))
return true
val blue = if (abs(e._1._1 - p._1) > MinValue) (p._2 - e._1._2) / (p._1 - e._1._1) else MaxValue
val red = if (abs(e._1._1 - e._2._1) > MinValue) (e._2._2 - e._1._2) / (e._2._1 - e._1._1) else MaxValue
blue >= red
}
 
private privateimplicit def containsto_edge(fp: Figure((Double, p:Double), (Double, Double))): Edge = f.edges.count(raySegIEdge(p._1, _p._2)) % 2 != 0
}</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}}==
Anonymous user