package scalation.scala3d import javafx.application.Application import javafx.event.{Event, EventHandler, EventTarget} import javafx.scene.Group import javafx.scene.input.MouseEvent import javafx.scene.paint.{Color, PhongMaterial} import javafx.scene.transform.{Rotate, Scale, Translate} import javafx.scene.shape.Shape3D import javafx.css.Styleable class Line3D (p1: Point3D, p2: Point3D) extends Cylinder(1, p1.distance(p2)) { val yaxis = new Point3D(0.0,1.0,0.0) println("p1="+p1) println("p2="+p2) var midPt = p2.midpoint(p1) var translateMidpoint = new Translate(midPt.getX(),midPt.getY(),midPt.getZ()) var axis = p2.subtract(p1).crossProduct(yaxis) var angle = Math.acos(p2.subtract(p1).normalize().dotProduct(yaxis)) var rotation = new Rotate(-Math.toDegrees(angle),axis) getTransforms().add(translateMidpoint) getTransforms().add(rotation) } class Line3Dend (p1: Point3D, p2: Point3D) extends Line3D(p1,p2) { val sphere1 = new Sphere(4.0) val sphere2 = new Sphere(4.0) sphere1.getTransforms().add(new Translate(p1.getX(),p1.getY(),p1.getZ())) sphere2.getTransforms().add(new Translate(p2.getX(),p2.getY(),p2.getZ())) def getSpheres() = (sphere1, sphere2) } case class Line3DHelper() extends javafx.application.Application() { val root = new Group() val camera = new javafx.scene.PerspectiveCamera(true) var anchorX: Double = _ var anchorY: Double = _ var anchorAngle: Double = _ def mkEventHandler[E <: Event](f: E => Unit) = new EventHandler[E] { def handle(e: E) = f(e) } override def start (primaryStage: javafx.stage.Stage) { println("start 3D") buildCamera() val p1 = new Point3D(0,0,0) val p2 = new Point3D(50,-100,50) val line = new Line3Dend(p1,p2) val s = line.getSpheres() val group1 = new Group(s._1) val group2 = new Group(s._2) val group3 = new Group(line) root.getChildren().addAll(group1,group2,group3) try{ val scene = new Scene(root,1024,768,true) scene.setOnMousePressed (mkEventHandler ((event: MouseEvent) => { anchorX = event.getSceneX () anchorY = event.getSceneY () anchorAngle = camera.getRotate () })) scene.setOnMouseDragged(mkEventHandler((event: MouseEvent) => { camera.setRotate (anchorAngle + anchorX - event.getSceneX ()) })) scene.setFill (javafx.scene.paint.Color.YELLOW) primaryStage.setTitle ("Scala3d sample") primaryStage.setScene (scene) primaryStage.show () scene.setCamera (camera) } catch { case e: Exception => e.printStackTrace () } // try } def buildCamera() { val translateZ = new Translate (0,0,-1000) camera.getTransforms ().add (translateZ) camera.setNearClip (0.0001) camera.setFarClip (1000.0) } // buildCamera } object Line3DTest { def main(args: Array [String]){ javafx.application.Application.launch(classOf [Line3DHelper], args: _*) } }