Wednesday, 4 September 2013

JavaFX 2 Circle Path For Animation



package arcdemo;

import javafx.animation.PathTransition;
import javafx.animation.PathTransition.OrientationType;
import javafx.animation.PathTransitionBuilder;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.paint.Color;
import javafx.scene.shape.ArcTo;
import javafx.scene.shape.ClosePath;
import javafx.scene.shape.MoveTo;
import javafx.scene.shape.Path;
import javafx.scene.shape.PathBuilder;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
import javafx.util.Duration;

/**
 *
 * @author Jay.Thakkar
 */
public class ArcDemo extends Application {

    private PathTransition pathTransitionEllipse;
    private PathTransition pathTransitionCircle;

    private void init(Stage primaryStage) {
        Group root = new Group();
        primaryStage.setResizable(false);
        primaryStage.setScene(new Scene(root, 600, 460));

        // Ellipse path example
        Rectangle rect = new Rectangle(0, 0, 40, 40);
        rect.setArcHeight(10);
        rect.setArcWidth(10);
        rect.setFill(Color.ORANGE);
        root.getChildren().add(rect);

        Path path = createEllipsePath(200, 200, 50, 100, 45);
        root.getChildren().add(path);

        pathTransitionEllipse = PathTransitionBuilder.create()
                .duration(Duration.seconds(4))
                .path(path)
                .node(rect)
                .orientation(OrientationType.ORTHOGONAL_TO_TANGENT)
                .cycleCount(Timeline.INDEFINITE)
                .autoReverse(false)
                .build();


        // Cirle path example

        Rectangle rect2 = new Rectangle(0, 0, 20, 20);
        rect2.setArcHeight(10);
        rect2.setArcWidth(10);
        rect2.setFill(Color.GREEN);
        root.getChildren().add(rect2);

        Path path2 = createEllipsePath(400, 200, 150, 150, 0);
        root.getChildren().add(path2);

        pathTransitionCircle = PathTransitionBuilder.create()
                .duration(Duration.seconds(2))
                .path(path2)
                .node(rect2)
                .orientation(OrientationType.ORTHOGONAL_TO_TANGENT)
                .cycleCount(Timeline.INDEFINITE)
                .autoReverse(false)
                .build();
    }

    private Path createEllipsePath(double centerX, double centerY, double radiusX, double radiusY, double rotate) {
        ArcTo arcTo = new ArcTo();
        arcTo.setX(centerX - radiusX + 1); // to simulate a full 360 degree celcius circle.
        arcTo.setY(centerY - radiusY);
        arcTo.setSweepFlag(false);
        arcTo.setLargeArcFlag(true);
        arcTo.setRadiusX(radiusX);
        arcTo.setRadiusY(radiusY);
        arcTo.setXAxisRotation(rotate);

        Path path = PathBuilder.create()
                .elements(
                new MoveTo(centerX - radiusX, centerY - radiusY),
                arcTo,
                new ClosePath()) // close 1 px gap.
                .build();
        path.setStroke(Color.DODGERBLUE);
        path.getStrokeDashArray().setAll(5d, 5d);
        return path;
    }

    @Override
    public void start(Stage primaryStage) throws Exception {
        init(primaryStage);
        primaryStage.show();
        pathTransitionEllipse.play();
        pathTransitionCircle.play();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

Friday, 30 August 2013

Swing: Drawing Arcs Between Adjacent Edges of Triangle






import javax.swing.JComponent;
import javax.swing.JFrame;
import java.awt.geom.*;
import java.awt.*;
import java.util.*;

class MyCanvas extends JComponent {
    int a, supb, b, c, length, r;
    double x1, y1, x2, y2, x3, y3;
    Random random = new Random();

    public MyCanvas() {
            a = random.nextInt(80 - 30) + 30;
            supb = random.nextInt(120 - 70) + 100;
            b = 180 - supb;
            c = 180 - a - b;
            length = random.nextInt(150 - 100) + 100;
            x1 = 0;
            y1 = 0;
            r = 20;
            x2 = x1 + length;
            y2 = y1;
            x3 = (x1 + Math.cos(Math.toRadians(-a)) * length);
            y3 = (y1 + Math.sin(Math.toRadians(-a)) * length);
    }

    public void paintComponent(Graphics g2) {
            float dx1, dy1, ang1, dx2, dy2, ang2, ang3;
            Graphics2D g = (Graphics2D) g2;
            AffineTransform oldt = g.getTransform();

            Shape shape = getTriangle(x1, y1, x2, y2, x3, y3);

            Rectangle2D bounds = shape.getBounds2D();

            double height = bounds.getHeight();
            double width = bounds.getWidth();
            g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                            RenderingHints.VALUE_ANTIALIAS_ON);
            g.setStroke(new BasicStroke(2.0f, BasicStroke.CAP_BUTT,
                            BasicStroke.JOIN_BEVEL));
            g.translate((this.getWidth() - width) / 2,
                            (this.getHeight() - height) / 2);
            g.translate(-bounds.getX(), -bounds.getY());

            dy1 = (float) (y3 - y1);
            dx1 = (float) (x3 - x1);
            ang1 = (float) (Math.atan((float)(dy1 / dx1)) * 180 / Math.PI);

            ang1 = (float) Math.abs(ang1);

            dy2 = (float) (y2 - y3);
            dx2 = (float) (x2 - x3);
            ang2 = (float) (Math.atan((float)(dy2 / dx2)) * 180 / Math.PI);

            ang2 = (float) Math.abs(ang2);

    ang3 = (float) (180-ang2-ang1);

            g.setColor(Color.BLACK);
            g.draw(shape);
            g.setColor(Color.RED);
            g.draw(new Arc2D.Double(x1 - r, y1 - r, 2 * r, 2 * r, 0, ang1, Arc2D.OPEN));
            g.setColor(Color.GREEN);
            g.draw(new Arc2D.Double(x2 - r, y2 - r, 2 * r, 2 * r, (180 - ang2), ang2,
                            Arc2D.OPEN));
            g.setColor(Color.RED);
            g.draw(new Arc2D.Double(x3 - r, y3 - r, 2 * r, 2 * r, -180 + a, ang3,
                            Arc2D.OPEN));
            g.setTransform(oldt);
    }

    private Shape getTriangle(double x1, double y1, double x2, double y2,
                    double x3, double y3) {
            GeneralPath gp = new GeneralPath();
            gp.moveTo(x1, y1);
            gp.lineTo(x2, y2);
            gp.lineTo(x3, y3);
            gp.closePath();
            return gp;
    }
}

public class TrianglePanel {
        public static void main(String[] a) {
                JFrame window = new JFrame();
                window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                window.setBounds(30, 30, 300, 300);
                window.getContentPane().add(new MyCanvas());
                window.setVisible(true);
        }
}

How JSP Life-cycle work


JAVAFX: Draw polygon by mouse click and re-size shape by anchor points







package com.jay.shape.drawtriangle;
import java.util.ArrayList;
import java.util.List;
import javafx.application.Application;
import javafx.beans.property.DoubleProperty;
import javafx.beans.property.SimpleDoubleProperty;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.AnchorPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Arc;
import javafx.scene.shape.ArcType;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Polygon;
import javafx.scene.shape.StrokeLineCap;
import javafx.scene.shape.StrokeType;
import javafx.stage.Stage;
/**
*
* @author jay.thakkar
*/
public class DrawTriangle extends Application {
Group root;
@Override
public void start(Stage primaryStage) {
AnchorPane anchorPane = new AnchorPane();
root = new Group();
anchorPane.setOnMouseDragged(mouseHandler);
anchorPane.setOnMousePressed(mouseHandler);
anchorPane.setOnMouseReleased(mouseHandler);
//root.getChildren().add(triangle);
// root.getChildren().addAll(createControlAnchorsFor(triangle.getPoints()));
anchorPane.getChildren().add(root);
primaryStage.setTitle("Hello World!");
primaryStage.setScene(
new Scene(
anchorPane,
400, 400, Color.ALICEBLUE));
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
double x[] = new double[3];
double y[] = new double[3];
int count = 0;
boolean drawShape = true;
Polygon triangle;
List<Double> values = new ArrayList<Double>();
EventHandler<MouseEvent> mouseHandler = new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent mouseEvent) {
if (mouseEvent.getEventType() == MouseEvent.MOUSE_PRESSED) {
if (drawShape) {
x[count] = mouseEvent.getX();
y[count] = mouseEvent.getY();
System.out.println("X:" + mouseEvent.getX());
System.out.println("Y:" + mouseEvent.getY());
}
} else if (mouseEvent.getEventType() == MouseEvent.MOUSE_RELEASED) {
if (drawShape) {
triangle = new Polygon();
values.add(x[count]);
values.add(y[count]);
count++;
triangle.getPoints().addAll(values);
// triangle.getPoints().setAll(
// x[0], y[0],
// x[1], y[1],
// x[2], y[2]);
triangle.setStroke(Color.FORESTGREEN);
triangle.setStrokeWidth(4);
triangle.setStrokeLineCap(StrokeLineCap.ROUND);
triangle.setFill(Color.CORNSILK.deriveColor(0, 1.2, 1, 0.6));
root.getChildren().clear();
root.getChildren().add(triangle);
root.getChildren().addAll(createControlAnchorsFor(triangle.getPoints()));
if (count == 3) {
drawShape = false;
count = 0;
calculateAngle();
//root.getChildren().addAll(createDegreeAngleFor(triangle.getPoints()));
}
}
}
}
};
double getLineDistance(double x1, double y1, double x2, double y2) {
double s1 = Math.pow((x2 - x1), 2);
double s2 = Math.pow((y2 - y1), 2);
double s3 = Math.sqrt(s1 + s2);
return s3;
}
int angels[] = new int[3];
public void calculateAngle() {
double x1 = triangle.getPoints().get(0);
double y1 = triangle.getPoints().get(1);
double x2 = triangle.getPoints().get(2);
double y2 = triangle.getPoints().get(3);
double x3 = triangle.getPoints().get(4);
double y3 = triangle.getPoints().get(5);
double a = getLineDistance(x1, y1, x2, y2);
double b = getLineDistance(x2, y2, x3, y3);
double c = getLineDistance(x3, y3, x1, y1);
double pi = Math.PI;
double angleA = Math.acos((b * b + c * c - a * a) / (2.0 * b * c)) * (180.0 / pi);
double angleB = Math.acos((a * a + c * c - b * b) / (2.0 * a * c)) * (180.0 / pi);
double angleC = (180.0 - angleA - angleB);
System.out.println("=================================");
System.out.println("angleA:" + angleA);
System.out.println("angleB:" + angleB);
System.out.println("angleC:" + angleC);
angels[0] = (int) Math.round(angleA);
angels[2] = (int) Math.round(angleB);
angels[1] = (int) Math.round(angleC);
}
// a draggable anchor displayed around a point.
class Anchor extends Circle {
Anchor(Color color, DoubleProperty x, DoubleProperty y) {
super(x.get(), y.get(), 10);
setFill(color.deriveColor(1, 1, 1, 0.5));
setStroke(color);
setStrokeWidth(2);
setStrokeType(StrokeType.OUTSIDE);
x.bind(centerXProperty());
y.bind(centerYProperty());
enableDrag();
}
// make a node movable by dragging it around with the mouse.
private void enableDrag() {
final Delta dragDelta = new Delta();
setOnMousePressed(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent mouseEvent) {
// record a delta distance for the drag and drop operation.
dragDelta.x = getCenterX() - mouseEvent.getX();
dragDelta.y = getCenterY() - mouseEvent.getY();
getScene().setCursor(javafx.scene.Cursor.MOVE);
}
});
setOnMouseReleased(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent mouseEvent) {
getScene().setCursor(javafx.scene.Cursor.HAND);
System.out.println("values:" + values);
}
});
setOnMouseDragged(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent mouseEvent) {
double newX = mouseEvent.getX() + dragDelta.x;
if (newX > 0 && newX < getScene().getWidth()) {
setCenterX(newX);
}
double newY = mouseEvent.getY() + dragDelta.y;
if (newY > 0 && newY < getScene().getHeight()) {
setCenterY(newY);
}
calculateAngle();
}
});
setOnMouseEntered(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent mouseEvent) {
if (!mouseEvent.isPrimaryButtonDown()) {
getScene().setCursor(javafx.scene.Cursor.HAND);
}
}
});
setOnMouseExited(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent mouseEvent) {
if (!mouseEvent.isPrimaryButtonDown()) {
getScene().setCursor(javafx.scene.Cursor.DEFAULT);
}
}
});
}
// records relative x and y co-ordinates.
private class Delta {
double x, y;
}
}
// @return a list of anchors which can be dragged around to modify points in the format [x1, y1, x2, y2...]
private ObservableList<Anchor> createControlAnchorsFor(final ObservableList<Double> points) {
ObservableList<Anchor> anchors = FXCollections.observableArrayList();
for (int i = 0; i < points.size(); i += 2) {
final int idx = i;
DoubleProperty xProperty = new SimpleDoubleProperty(points.get(i));
DoubleProperty yProperty = new SimpleDoubleProperty(points.get(i + 1));
xProperty.addListener(new ChangeListener<Number>() {
@Override
public void changed(ObservableValue<? extends Number> ov, Number oldX, Number x) {
points.set(idx, (double) x);
}
});
yProperty.addListener(new ChangeListener<Number>() {
@Override
public void changed(ObservableValue<? extends Number> ov, Number oldY, Number y) {
points.set(idx + 1, (double) y);
}
});
anchors.add(new Anchor(Color.GOLD, xProperty, yProperty));
}
return anchors;
}
private ObservableList<DegreeAngel> createDegreeAngleFor(final ObservableList<Double> points) {
ObservableList<DegreeAngel> degreeAngels = FXCollections.observableArrayList();
int j = 0;
for (int i = 0; i < points.size(); i += 2) {
final int idx = i;
DoubleProperty xProperty = new SimpleDoubleProperty(points.get(i));
DoubleProperty yProperty = new SimpleDoubleProperty(points.get(i + 1));
xProperty.addListener(new ChangeListener<Number>() {
@Override
public void changed(ObservableValue<? extends Number> ov, Number oldX, Number x) {
points.set(idx, (double) x);
}
});
yProperty.addListener(new ChangeListener<Number>() {
@Override
public void changed(ObservableValue<? extends Number> ov, Number oldY, Number y) {
points.set(idx + 1, (double) y);
}
});
degreeAngels.add(new DegreeAngel(Color.BLACK, xProperty, yProperty, angels[j]));
j++;
}
return degreeAngels;
}
class DegreeAngel extends Arc {
public DegreeAngel(Color color, DoubleProperty x, DoubleProperty y, int angle) {
super(x.get(), y.get(), 25.0f, 25.0f, 0, angle);
setFill(color.deriveColor(1, 1, 1, 0.5));
setStroke(color);
setStrokeWidth(1);
setStrokeType(StrokeType.OUTSIDE);
setType(ArcType.ROUND);
x.bind(centerXProperty());
y.bind(centerYProperty());
}
}
}

Thursday, 29 August 2013

No Image Reader of class com.sun.media.imageioimpl.plugins.jpeg.CLibJPEGImageReader available for format:jpeg

we have to modify the $DCM4CHEE_HOME/server/default/lib/dcm4che.jar file (expand it), in particular the

org/dcm4cheri/image/ImageReaderFactory.properties

file, changing the lines with "com.sun.media.imageioimpl.plugins.jpeg.CLibJPEGImageReader" with
"com.sun.imageio.plugins.jpeg.JPEGImageReader".
Same thing with the ImageWriterFactory.properties with "com.sun.imageio.plugins.jpeg.JPEGImageWriter"

After that, we have to create the new dcm4che.jar file using this command (run it in the folder containing the dcm4che.jar files previously extracted):

jar cvf dcm4che.jar *

Sobstitute the old jar file with the new one.
Start the server and wado service works with the web interface!

That's all!

Wednesday, 28 August 2013

How To Read Dicom Directory ( DICOMDIR) in JAVA


package com.jay.dicom.test;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import org.dcm4che2.data.DicomObject;
import org.dcm4che2.data.Tag;
public class ReadDicomdir {
private static org.dcm4che2.media.DicomDirReader dicomDir;
java.util.List<String> files = new ArrayList<String>();
public static void main(String[] args) throws IOException {
FinalCode finalCode = new FinalCode();
dicomDir = new org.dcm4che2.media.DicomDirReader(
new File("d:/DICOMDIR"));
finalCode.getFilePath(dicomDir.findFirstRootRecord());
}
public void getFilePath(DicomObject firstRecord) throws IOException {
int i = 1;
for (DicomObject rec = firstRecord; rec != null; rec = dicomDir
.findNextSiblingRecord(rec), ++i) {
if (rec.get(Tag.ReferencedFileID) != null) {
File f = dicomDir.toReferencedFile(rec);
System.out.println(f.getAbsolutePath());
}
getFilePath(dicomDir.findFirstChildRecord(rec));
}
}
}