Friday, 24 January 2014

JAVAFX: Dynamically fire event to Node

Event.fireEvent(vbox, new MouseEvent(MouseEvent.MOUSE_CLICKED, 0,
                    0, 0, 0, MouseButton.PRIMARY, 1, true, true, true, true,
                    true, true, true, true, true, true, null));

Thursday, 23 January 2014

How do I implement task prioritization using an ExecutorService in Java 5?


package example;

import java.util.Comparator;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.PriorityBlockingQueue;
import java.util.concurrent.RunnableFuture;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

class PriorityFuture<T> implements RunnableFuture<T> {

    private RunnableFuture<T> src;
    private int priority;

    public PriorityFuture(RunnableFuture<T> other, int priority) {
        this.src = other;
        this.priority = priority;
    }

    public int getPriority() {
        return priority;
    }

    public boolean cancel(boolean mayInterruptIfRunning) {
        return src.cancel(mayInterruptIfRunning);
    }

    public boolean isCancelled() {
        return src.isCancelled();
    }

    public boolean isDone() {
        return src.isDone();
    }

    public T get() throws InterruptedException, ExecutionException {
        return src.get();
    }

    public T get(long timeout, TimeUnit unit) throws InterruptedException,
            ExecutionException, TimeoutException {
        return src.get();
    }

    public void run() {
        src.run();
    }

    public static Comparator<Runnable> COMP = new Comparator<Runnable>() {
        public int compare(Runnable o1, Runnable o2) {
            if (o1 == null && o2 == null)
                return 0;
            else if (o1 == null)
                return -1;
            else if (o2 == null)
                return 1;
            else {
                int p1 = ((PriorityFuture<?>) o1).getPriority();
                int p2 = ((PriorityFuture<?>) o2).getPriority();

                return p1 > p2 ? 1 : (p1 == p2 ? 0 : -1);
            }
        }
    };
}

interface PriorityCallable<T> extends Callable<T> {
    int getPriority();
}

class LenthyJob implements PriorityCallable<Long> {
    private int priority;

    public LenthyJob(int priority) {
        this.priority = priority;
    }

    public Long call() throws Exception {
        System.out.println("Executing: " + priority);
        long num = 1000000;
        for (int i = 0; i < 1000000; i++) {
            num *= Math.random() * 1000;
            num /= Math.random() * 1000;
            if (num == 0)
                num = 1000000;
        }
        return num;
    }

    public int getPriority() {
        return priority;
    }
}

public class TestPQ {

    public static ThreadPoolExecutor getPriorityExecutor(int nThreads) {
        return new ThreadPoolExecutor(nThreads, nThreads, 0L,
                TimeUnit.MILLISECONDS, new PriorityBlockingQueue<Runnable>(10,
                        PriorityFuture.COMP)) {

            protected <T> RunnableFuture<T> newTaskFor(Callable<T> callable) {
                System.out.println("######## newTaskFor : -------");
                RunnableFuture<T> newTaskFor = super.newTaskFor(callable);
               
                return new PriorityFuture<T>(newTaskFor,
                        ((PriorityCallable<T>) callable).getPriority());
            }
        };
    }

    public static void main(String[] args) throws InterruptedException,
            ExecutionException {
        ThreadPoolExecutor exec = getPriorityExecutor(2);

        for (int i = 0; i < 20; i++) {
            int priority = (int) (Math.random() * 100);
            System.out.println("Scheduling: " + priority);
            LenthyJob job = new LenthyJob(priority);
            exec.submit(job);
        }
    }
}

Friday, 10 January 2014

Thread output in certain order

package threadseq;

import java.util.*;

public class OrderThreads {
public static void main(String... args) {
Results results = new Results();
new Thread(new Task(0, "red", results)).start();
new Thread(new Task(1, "orange", results)).start();
new Thread(new Task(2, "yellow", results)).start();
new Thread(new Task(3, "green", results)).start();
new Thread(new Task(4, "blue", results)).start();
new Thread(new Task(5, "indigo", results)).start();
new Thread(new Task(6, "violet", results)).start();
}
}

class Results {
private List<String> results = new ArrayList<String>();
private int i = 0;

public synchronized void submit(int order, String result) {
while (results.size() <= order){
results.add(null);
}
results.set(order, result);
while ((i < results.size()) && (results.get(i) != null)) {
System.out.println("result delivered: " + i + " " + results.get(i));
++i;
}
}
}

class Task implements Runnable {
private final int order;
private final String result;
private final Results results;

public Task(int order, String result, Results results) {
this.order = order;
this.result = result;
this.results = results;
}

public void run() {
try {
Thread.sleep(Math.abs(result.hashCode() % 1000)); // simulate a
// long-running
// computation
} catch (InterruptedException e) {
} // you'd want to think about what to do if interrupted
System.out.println("task finished: " + order + " " + result);
results.submit(order, result);
}
}

Thursday, 9 January 2014

Convert BufferedImage To ByteBuffer

In applet its very simple to do this

BufferedImage originalImage = ImageIO.read(new File("c:\\image\\mypic.jpg"));
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write( originalImage, "jpg", baos );
baos.flush();
byte[] imageInByte = baos.toByteArray();
baos.close()
ByteBuffer buf = ByteBuffer.wrap(imageInByte);

Rotating Points and/or Polygons around a center Point

After searching for what seems like hours to find a simple solution to this problem...and yes I know that AffineTransform can do this, but I knew there was a lot simpler/faster solution and one that doesn’t require creating new Objects.
The trick is to cache the angle and distance of each point from the center point. After doing so, the points can be rotated and the center point can be moved.
Here is the code...the angles are adjusted to 360 degrees...due north is zero.
import java.awt.*;
import javax.swing.*;

public class PointRotation extends JPanel
{
private Point points[] = new Point[4];
private double angles[] = new double[4];
private double distances[] = new double[4];
private Point center = new Point();
private float angle = 0;

public PointRotation()
{
setLayout(null);

int size = 20;
center.setLocation(100, 100);

points[0] = new Point(center.x - size, center.y - size);
points[1] = new Point(center.x + size, center.y - size);
points[2] = new Point(center.x + size, center.y + size);
points[3] = new Point(center.x - size, center.y + size);

angles[0] = this.getAngle360(center.x, center.y, points[0].x, points[0].y);
angles[1] = this.getAngle360(center.x, center.y, points[1].x, points[1].y);
angles[2] = this.getAngle360(center.x, center.y, points[2].x, points[2].y);
angles[3] = this.getAngle360(center.x, center.y, points[3].x, points[3].y);

distances[0] = center.distance(points[0]);
distances[1] = center.distance(points[1]);
distances[2] = center.distance(points[2]);
distances[3] = center.distance(points[3]);
}

protected void paintComponent(Graphics g)
{
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;

g2.setPaint(Color.red);
g2.drawLine(points[0].x, points[0].y, points[1].x, points[1].y);
g2.setPaint(Color.blue);
g2.drawLine(points[1].x, points[1].y, points[2].x, points[2].y);
g2.setPaint(Color.green);
g2.drawLine(points[2].x, points[2].y, points[3].x, points[3].y);
g2.setPaint(Color.cyan);
g2.drawLine(points[3].x, points[3].y, points[0].x, points[0].y);

angle ++;
if (angle >= 360)
{
angle = 0;
}

for (int index = 0; index < points.length; index ++)
{
this.rotatePoint(index, angle);
}

try
{
Thread.sleep(20);
}
catch (Exception exception)
{
// Ignore
}

repaint();
}

private double getAngle360(double x1, double y1, double x2, double y2)
{
double angle = Math.toDegrees(Math.atan2(y2 - y1, x2 - x1));
if (angle < 0) angle = 180 + (180 - -angle);
angle += 90;
if (angle >= 360) angle -= 360;
return angle;
}

private void rotatePoint(int index, float angle)
{
double newAngle = angles


    + angle;
    if (newAngle >= 360) newAngle -= 360;

    double radians = Math.toRadians(newAngle);
    double distance = this.distances

      ;
      int deltaX = (int) (distance * Math.sin(radians));
      int deltaY = (int) (distance * -Math.cos(radians));

      points

        .setLocation(center.x + deltaX, center.y + deltaY);
        }

        public static void main(String[] args)
        {
        PointRotation c = new PointRotation();
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.getContentPane().add(c);
        f.setSize(400, 450);
        f.setLocation(0, 325);
        f.setVisible(true);
        }
        }

        Find length of sub sequence array in increasing order

        public class MyCode {

        public static void main(String[] args) {

        System.out.println("L :"
        + longestSeq(new int[] { 10, 22, 9, 33, 21, 50, 41, 60, 80 }));
        System.out.println("L :"
        + longestSeq(new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 7, 6, 5, 4, 5,
        6, 7, 8, 9, 10, 11 }));
        System.out.println("**************************");
        System.out.println("L :"
        + longestSeq(new int[] { 0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5,
        13, 3, 11, 7, 15 }));
        }

        public static int longestSeq(int[] input1) {
        int[] L = new int[input1.length];
        L[0] = 1;
        for (int i = 1; i < L.length; i++) {
        int maxn = 0;
        for (int j = 0; j < i; j++) {
        if (input1[j] < input1[i] && L[j] > maxn) {
        maxn = L[j];
        }
        }
        L[i] = maxn + 1;
        }
        int maxi = 0;
        for (int i = 0; i < L.length; i++) {
        if (L[i] > maxi) {
        maxi = L[i];
        }
        }
        return (maxi);
        }

        }
        Output:
        L :6
        L :11
        **************************
        L :6

        Wednesday, 1 January 2014

        Create Tube(Pipe) in Java3D and also apply curve




        /*
        This method create ellipse at given x,y,z  point
        */

        LineArray buildEllipse1(double x, double y, double z, double semiMajorAxis,
        double semiMinorAxis) {
        // build geometry
        int totalLines = 50;
        int totalPoints = totalLines * 2;
        double tInc = 1.0 / (double) totalLines;

        Point3d p0 = new Point3d();
        Point3d p1 = new Point3d();

        LineArray lineArray = new LineArray(totalPoints, LineArray.COORDINATES);

        double t = 0.0;
        int lineIndex = 0;
        for (int i = 0; i < totalLines; i++) {
        p0.x = (semiMinorAxis * Math.cos(2.0 * Math.PI * t)) + x;
        p0.y = y;
        p0.z = (semiMajorAxis * Math.sin(2.0 * Math.PI * t)) + z;
        lineArray.setCoordinate(lineIndex++, p0);

        p1.x = (semiMinorAxis * Math.cos(2.0 * Math.PI * (t + tInc))) + x;
        p1.y = y;
        p1.z = (semiMajorAxis * Math.sin(2.0 * Math.PI * (t + tInc))) + z;
        // p1.z=10;
        lineArray.setCoordinate(lineIndex++, p1);
        t += tInc;
        }



        return lineArray;

        }
        / *
        Add tube function add tube by merging of circle and make 3d tube(Pipe)
         */
        private void addTube_onAction() {

        Shape3D circleShape3d = new Shape3D();
        // build appearance
        Appearance appearance = new Appearance();

        LineAttributes lineAttrib = new LineAttributes(2.0f,
        LineAttributes.PATTERN_SOLID, true);
        appearance.setLineAttributes(lineAttrib);

        ColoringAttributes colorAttributes = new ColoringAttributes( new Color3f(Color.YELLOW),
        ColoringAttributes.SHADE_GOURAUD);
        appearance.setColoringAttributes(colorAttributes);

        RenderingAttributes renderAttrib = new RenderingAttributes();
        renderAttrib.setDepthBufferEnable(false);
        renderAttrib.setDepthBufferWriteEnable(false);
        appearance.setRenderingAttributes(renderAttrib);
        BranchGroup branchGroup1 = new BranchGroup();



        BranchGroup branchGroup = new BranchGroup();
        branchGroup.setCapability(Content.ALLOW_DETACH);

        Shape3D shape3d = new Shape3D();
        Color3f color3f = new Color3f(Color.red);

        Point3f pt1 = new Point3f(strToFloat(pt1_x_textField.getText()),
        strToFloat(pt1_y_textField.getText()),
        strToFloat(pt1_z_textField.getText()));
        Point3f pt2 = new Point3f(strToFloat(pt2_x_textField.getText()),
        strToFloat(pt2_y_textField.getText()),
        strToFloat(pt2_z_textField.getText()));

        ArrayList<Point2D> point2ds = generateCurve(
        new Point2D.Double(pt1.getX(), pt1.getY()), new Point2D.Double(
        pt2.getX(), pt2.getY()), 2000, 1);



        Point3d[] coords = new Point3d[point2ds.size()];
        int cnt = 0;
        for (Point2D point2d : point2ds) {
        coords[cnt] = new Point3d(point2d.getX(), point2d.getY(), 250);
        circleShape3d.addGeometry(buildEllipse1(point2d.getX(),
        point2d.getY(), 250,3,3));
        cnt++;
        }
        //circleShape3d.setAppearance(appearance);
        branchGroup1.addChild(circleShape3d);
        image3DUniverse.getScene().addChild(branchGroup1);
        // // Point3f[] coords = { onX, onY };
        //
        int N = coords.length;

        Color3f colors[] = new Color3f[N];
        for (int i = 0; i < N; i++) {
        colors[i] = color3f;
        }

        int[] strip = { N };

        LineStripArray ta = new LineStripArray(N, LineStripArray.COORDINATES
        | LineStripArray.COLOR_3, strip);
        ta.setCoordinates(0, coords);
        ta.setColors(0, colors);

        shape3d.addGeometry(ta);
        branchGroup.addChild(shape3d);
        image3DUniverse.getScene().addChild(branchGroup);

        }

        private static double GetAngle(Point2D x, Point2D o, double R) {
        double cosa = (x.getX() - o.getX()) / R;
        double sina = (x.getY() - o.getY()) / R;

        double angle = Math.acos(cosa);

        return Math.sin(angle) * sina >= 0 ? angle : 2 * Math.PI - angle;
        }


             /*
              This method apply curve on tube depend on radius value 
              */
        private static ArrayList<Point2D> generateCurve(Point2D pFrom, Point2D pTo,
        float pRadius, float pMinDistance) {

        ArrayList<Point2D> pOutPut = new ArrayList<Point2D>();

        double dist = pFrom.distance(pTo);
        double h = Math.sqrt(pRadius * pRadius - (dist * dist / 4.0));
        double angleStep = pMinDistance / pRadius;

        System.out.println(" #### dist ::" + dist);
        System.out.println(" #### pRadius ::" + pRadius);

        // pRadius = (float) ((dist/ 2 ) + 100) ;

        if (2 * pRadius <= dist)
        throw new Error("Radius is too small");

        // find center
        double x1 = pFrom.getX(), x2 = pFrom.getY();
        double y1 = pTo.getX(), y2 = pTo.getY();
        double m1 = (x1 + y1) / 2, m2 = (x2 + y2) / 2;
        double u1 = -(y2 - x2) / dist, u2 = (y1 - x1) / dist;
        double o1 = m1 + h * u1, o2 = m2 + h * u2;
        Point2D o = new Point2D.Double(o1, o2);

        double startAngle = GetAngle(pFrom, o, pRadius);
        double endAngle = GetAngle(pTo, o, pRadius);

        if (endAngle < startAngle)
        endAngle += 2 * Math.PI;

        for (double a = startAngle; a < endAngle; a += angleStep) {
        pOutPut.add(new Point2D.Double(o1 + pRadius * Math.cos(a), o2
        + pRadius * Math.sin(a)));
        }

        pOutPut.add(pTo);

        return pOutPut;
        }