BezierCurve
BezierCurve.java
/* appletviewer BezierCurve.java
*/ import java.applet.Applet; import java.awt.*; public class BezierCurve extends Applet implements Runnable { Dimension dim; Image imgBack; Graphics gBuf; int iDiv = 20; // 分割数 int iTime = 0; // 時間 int iDiff = 1; // 差分 boolean bUpdate = false; double[] adX = new double[10]; double[] adY = new double[10]; double[] adX9 = new double[iDiv + 1]; double[] adY9 = new double[iDiv + 1]; int[][] aaiIndex = {{4,0},{5,1},{6,2},{7,4},{8,5},{9,7}}; public void init() { dim = getSize(); imgBack = createImage(dim.width, dim.height); gBuf = imgBack.getGraphics(); adX[0] = -2.0; adY[0] = -1.0; adX[1] = -1.0; adY[1] = 1.0; adX[2] = 1.0; adY[2] = 1.0; adX[3] = 2.0; adY[3] = -1.0; Thread t = new Thread(this); t.start(); } public void run() { while (true) { try { Thread.sleep(100); } catch (Exception e) { } bUpdate = true; repaint(); } } public void update(Graphics g) { paint(g); } public void paint(Graphics g) { gBuf.clearRect(0, 0, dim.width, dim.height); gBuf.setColor(Color.green); for (int i = -2; i <= 2; i++) { int iX = 250 + 100 * i; gBuf.drawLine(iX, 0, iX, dim.height); } for (int i = -1; i <= 1; i++) { int iY = 150 - 100 * i; gBuf.drawLine(0, iY, dim.width, iY); } double d1 = (double)iTime / (double)iDiv; double d0 = 1.0 - d1; for (int i = 0; i < aaiIndex.length; i++) { int[] ai = aaiIndex[i]; adX[ai[0]] = adX[ai[1]] * d0 + adX[ai[1] + 1] * d1; adY[ai[0]] = adY[ai[1]] * d0 + adY[ai[1] + 1] * d1; } adX9[iTime] = adX[9]; adY9[iTime] = adY[9]; gBuf.setColor(Color.blue); drawPolyline(adX, adY, 4, 3); drawPolyline(adX, adY, 7, 2); gBuf.setColor(Color.red); drawPolyline(adX9, adY9, 0, iTime + 1); gBuf.setColor(Color.black); drawPolyline(adX, adY, 0, 4); g.drawImage(imgBack, 0, 0, this); if (bUpdate) { iTime += iDiff; if (iTime <= 0 || iDiv <= iTime) { iDiff = -iDiff; } bUpdate = false; } } void drawPolyline(double[] adX, double[] adY, int iOffset, int iPoints) { int[] aiX = new int[iPoints]; int[] aiY = new int[iPoints]; for (int i = 0; i < iPoints; i++) { aiX[i] = 250 + (int)(100 * adX[iOffset + i]); aiY[i] = 150 - (int)(100 * adY[iOffset + i]); } gBuf.drawPolyline(aiX, aiY, iPoints); } }