//Vectors.java import javax.swing.*; import java.awt.*; import java.text.*; import java.util.*; public class Vectors extends JApplet { public void init () { JTextArea textarea = new JTextArea(22,100); textarea.setLineWrap( true ); textarea.setFont( new Font("Courier",Font.BOLD,14) ); JScrollPane scrollpane = new JScrollPane(textarea); DecimalFormat d4 = new DecimalFormat ("0.0000"); String input; StringTokenizer st; double uNorm, vNorm, wNorm, dotProduct=0, angle; input = JOptionPane.showInputDialog("Enter/paste first vector's components separated by spaces");//, st = new StringTokenizer(input); ArrayList u = new ArrayList(); while (st.hasMoreTokens()) u.add(Double.parseDouble(st.nextToken())); input = JOptionPane.showInputDialog("Enter/paste second vector's components separated by spaces");//, st = new StringTokenizer(input); ArrayList v = new ArrayList(); while (st.hasMoreTokens()) v.add(Double.parseDouble(st.nextToken())); input = JOptionPane.showInputDialog("Enter/paste third vector's components separated by spaces, if any");//, st = new StringTokenizer(input); ArrayList w = new ArrayList(); while (st.hasMoreTokens()) w.add(Double.parseDouble(st.nextToken())); if (u.size() != v.size()) { JOptionPane.showMessageDialog(null, "vectors' sizes differ. bailing out...", "Error", JOptionPane.ERROR_MESSAGE); System.exit(1); } Iterator dataItu = u.iterator(); Iterator dataItv = v.iterator(); Iterator dataItw = w.iterator(); Iterator dataIt; double ui, vi, wi, xi, sumSqrd, uSumSqrd=0, vSumSqrd=0, wSumSqrd=0, ux1=0, vx1=0; boolean first=true; ArrayList uPlusv = new ArrayList(); ArrayList uMinusv = new ArrayList(); ArrayList vMinusu = new ArrayList(); ArrayList uCrossv = new ArrayList(); while (dataItu.hasNext() && dataItv.hasNext()) { ui = (Double)dataItu.next(); vi = (Double)dataItv.next(); if (first) { ux1 = ui; vx1 = vi; first = false; } uPlusv.add(ui+vi); uMinusv.add(ui-vi); vMinusu.add(vi-ui); uSumSqrd += ui*ui; //for norm vSumSqrd += vi*vi; dotProduct += ui*vi; } uNorm = Math.sqrt(uSumSqrd); vNorm = Math.sqrt(vSumSqrd); dataItu = u.iterator(); textarea.append("u: ("); //\u20D7 unicode up rt arrow? while (dataItu.hasNext()) textarea.append(""+(Double)dataItu.next()+" "); textarea.append(")"); textarea.append(" norm:\u2551u\u2551="+d4.format(uNorm)); if (u.size() == 2) textarea.append(" direction="+d4.format(Math.toDegrees(Math.acos(ux1/uNorm)))+"\u00B0"); dataItu = u.iterator(); textarea.append(" normalized: ("); while (dataItu.hasNext()) textarea.append(""+d4.format((Double)dataItu.next()/uNorm)+" "); textarea.append(")"); dataItv = v.iterator(); textarea.append("\n\nv: ("); while (dataItv.hasNext()) textarea.append(""+(Double)dataItv.next()+" "); textarea.append(")"); textarea.append(" norm:\u2551v\u2551="+d4.format(vNorm)); if (v.size() == 2) textarea.append(" direction="+d4.format(Math.toDegrees(Math.acos(vx1/vNorm)))+"\u00B0"); dataItv = v.iterator(); textarea.append(" normalized: ("); while (dataItv.hasNext()) textarea.append(""+d4.format((Double)dataItv.next()/vNorm)+" "); textarea.append(")"); if (w.size() > 0) { dataItw = w.iterator(); textarea.append("\n\nw: ("); while (dataItw.hasNext()) { wi = (Double)dataItw.next(); textarea.append(""+wi+" "); wSumSqrd += wi*wi; //for norm } wNorm = Math.sqrt(wSumSqrd); textarea.append(")"); textarea.append(" norm:\u2551w\u2551="+d4.format(wNorm)); dataItw = w.iterator(); textarea.append(" normalized: ("); while (dataItw.hasNext()) textarea.append(""+d4.format((Double)dataItw.next()/wNorm)+" "); textarea.append(")"); } textarea.append("\n\ndot product: u\u00B7v = "+d4.format(dotProduct)); angle = Math.acos(dotProduct/(uNorm*vNorm)); textarea.append("\nangle: \u0398 = "+ d4.format(angle)+" rad = "+ d4.format(Math.toDegrees(angle))+"\u00B0"); dataIt = uPlusv.iterator(); textarea.append("\n\nu+v: ("); sumSqrd = 0; while (dataIt.hasNext()) { xi = (Double)dataIt.next(); sumSqrd += xi*xi; textarea.append(""+xi+" "); } textarea.append(") norm:\u2551u+v\u2551="+d4.format(Math.sqrt(sumSqrd))); dataIt = uMinusv.iterator(); textarea.append("\n\nu-v: ("); sumSqrd = 0; while (dataIt.hasNext()) { xi = (Double)dataIt.next(); sumSqrd += xi*xi; textarea.append(""+xi+" "); } textarea.append(") norm:\u2551u-v\u2551="+d4.format(Math.sqrt(sumSqrd))); dataIt = vMinusu.iterator(); textarea.append("\n\nv-u: ("); sumSqrd = 0; while (dataIt.hasNext()) { xi = (Double)dataIt.next(); sumSqrd += xi*xi; textarea.append(""+xi+" "); } textarea.append(") norm:\u2551v-u\u2551="+d4.format(Math.sqrt(sumSqrd))); if (u.size() == 3) { uCrossv.add((Double)u.get(1)*(Double)v.get(2) - (Double)u.get(2)*(Double)v.get(1)); uCrossv.add((Double)u.get(2)*(Double)v.get(0) - (Double)u.get(0)*(Double)v.get(2)); uCrossv.add((Double)u.get(0)*(Double)v.get(1) - (Double)u.get(1)*(Double)v.get(0)); dataIt = uCrossv.iterator(); textarea.append("\n\nCross product\nu\u02DFv: ("); sumSqrd = 0; while (dataIt.hasNext()) { xi = (Double)dataIt.next(); sumSqrd += xi*xi; textarea.append(""+xi+" "); } textarea.append(") norm:\u2551u\u02DFv\u2551="+d4.format(Math.sqrt(sumSqrd))+ " =\u2551u\u2551\u2551v\u2551sin\u0398 = "+ d4.format((uNorm*vNorm*Math.sin(angle)))); double dotProductu = 0; double dotProductv = 0; dataItu = u.iterator(); dataItv = v.iterator(); dataIt = uCrossv.iterator(); while (dataItu.hasNext()) { ui = (Double)dataItu.next(); vi = (Double)dataItv.next(); xi = (Double)dataIt.next(); dotProductu += ui*xi; dotProductv += vi*xi; } textarea.append("\n u\u00B7(u\u02DFv) = "+d4.format(dotProductu)); textarea.append(" v\u00B7(u\u02DFv) = "+d4.format(dotProductv)); if (w.size() == 3) { dotProduct = 0; dataItw = w.iterator(); dataIt = uCrossv.iterator(); while (dataItw.hasNext()) { wi = (Double)dataItw.next(); xi = (Double)dataIt.next(); dotProduct += wi*xi; } textarea.append("\nVolume of parallelepiped with edges u, v, w = "+ d4.format(Math.abs(dotProduct))); } } JOptionPane.showMessageDialog(null, scrollpane, "Vectors", JOptionPane.PLAIN_MESSAGE); } }