importer net.java2000.tools.NoNull ;
/**
* Un morceau de code de suivi oculaire qui permet aux yeux de suivre le mouvement de la souris. <br>
* Vous pouvez l'exécuter seul ou le mettre en HTML<br>
* <applet code="Eye" codebase="codebase"
* nom="eyesApplet"><br>
* <param name="faceFile" value="doofus.jpg"/><br>
* <param name="testMode" value="false"/> <br>
* <param name="leftEyeX" value="75"/> <br>
* <param name="leftEyeY" value="77"/> <br>
* <param name="rightEyeX" value="310"/> <br>
* <param name="rightEyeY" value="75"/><br>
* <param name="irisRadius" value="20"/> <br>
* <param name="pupilRadius" value="8"/><br>
* <param name="leftEyeRadius" value="5"/><br>
* <param name="rightEyeRadius" value="5"/> <br>
* <param name="horizontalSkew" value="3.5"/><br>
* <param name="eyeIndependence" value="0.4"/> <br>
* <param name="irisRed" value="128"/><br>
* <param name="irisGreen" value="64"/> <br>
* <param name="irisBlue" value="0"/> <br>
* <param name="verticalOffset" value="100"/> <br>
* </applet>
*
* @auteur Zhao Xueqing, Java Century Network (java2000.net)
*
*/
classe publique Eye étend l'applet {
privé statique final long serialVersionUID = 4124530672062457469L ;
chaîne privée mErrorMessage ;
Image privée mFace ;
couleur privée mIrisColor, mPupilColor = Color.black;
private int mMouseX, mMouseY ;
private int mLeftEyeX, mLeftEyeY, mRightEyeX, mRightEyeY ;
private int mLeftIrisX, mLeftIrisY, mRightIrisX, mRightIrisY ;
private int mLeftPupilX, mLeftPupilY, mRightPupilX, mRightPupilY ;
privé int mIrisRadius, mPupilRadius ;
private int mLeftEyeRadius, mRightEyeRadius, mLeftPupilTR, mRightPupilTR ;
privé int mVerticalOffset ;
// valeur par défaut
private int mFaceX = 0, mFaceY = 0; // l'image commence à 0, 0
private int mIrisRed = 128, mIrisGreen = 64, mIrisBlue = 0 ;
double privé mHorizontalSkew = 3,5, mEyeIndependence = 0,5, mGapFactor = 1,5 ;
privé booléen mTestMode = false ;
Dimension privée mDimension ;
Image privée mImage ;
graphiques privés mGraphics ;
public void init() {
mErrorMessage = nul ;
essayer {
// Quelques paramètres à définir
// image du visage en arrière-plan
mFace = getImage(getCodeBase(), NoNull.toString(getParameter("faceFile"), "doofus.jpg"));
// Coordonnée x de l'œil gauche
mLeftEyeX = mLeftIrisX = mLeftPupilX = Integer.parseInt(NoNull.toString(
getParameter("leftEyeX"), "75"));
//Coordonnée Y de l'œil gauche
mLeftEyeY = mLeftIrisY = mLeftPupilY = Integer.parseInt(NoNull.toString(
getParameter("leftEyeY"), "77"));
//coordonnée x de l'oeil droit
mRightEyeX = mRightIrisX = mRightPupilX = Integer.parseInt(NoNull.toString(
getParameter("rightEyeX"), "310"));
//Coordonnée Y de l'oeil droit
mRightEyeY = mRightIrisY = mRightPupilY = Integer.parseInt(NoNull.toString(
getParameter("rightEyeY"), "75"));
//Le rayon du globe oculaire blanc de l'œil
mIrisRadius = Integer.parseInt(NoNull.toString(getParameter("irisRadius"), "20"));
//Le rayon pupillaire de l'œil
mPupilRadius = Integer.parseInt(NoNull.toString(getParameter("pupilRadius"), "8"));
//Rayon de mouvement de l'œil gauche
mLeftEyeRadius = Integer.parseInt(NoNull.toString(getParameter("leftEyeRadius"), "15"));
//Rayon de mouvement de l'œil droit
mRightEyeRadius = Integer.parseInt(NoNull.toString(getParameter("rightEyeRadius"), "5"));
// paramètres facultatifs
if (getParameter("testMode") != null)
mTestMode = Boolean.valueOf(NoNull.toString(getParameter("testMode"), "true"))
.booleanValue();
if (getParameter("horizontalSkew") != null)
mHorizontalSkew = Double.valueOf(
NoNull.toString(getParameter("horizontalSkew"), "13.5").doubleValue();
if (getParameter("eyeIndependence") != null)
mEyeIndependence = Double.valueOf(
NoNull.toString(getParameter("eyeIndependence"), "0.4").doubleValue();
if (getParameter("irisRed") != null)
mIrisRed = Integer.parseInt(NoNull.toString(getParameter("irisRed"), "128"));
if (getParameter("irisGreen") != null)
mIrisGreen = Integer.parseInt(NoNull.toString(getParameter("irisGreen"), "64"));
if (getParameter("irisBlue") != null)
mIrisBlue = Integer.parseInt(NoNull.toString(getParameter("irisBlue"), "0"));
mIrisColor = nouvelle couleur (mIrisRed, mIrisGreen, mIrisBlue) ;
if (getParameter("verticalOffset") != null)
mVerticalOffset = Integer.parseInt(NoNull.toString(getParameter("verticalOffset"),
"100"));
} attraper (Exception e) {
mErrorMessage = "Paramètre requis incorrect ou manquant.";
e.printStackTrace();
}
// Calculer le rayon de mouvement du globe oculaire
mLeftPupilTR = mLeftEyeRadius + mIrisRadius - (int) (mGapFactor * mPupilRadius) ;
mRightPupilTR = mRightEyeRadius + mIrisRadius - (int) (mGapFactor * mPupilRadius);
//Écouter les événements de la souris
MouseMotion aMouseMotion = new MouseMotion();
this.addMouseMotionListener(aMouseMotion);
this.setSize(400, 135);
}
public void paintFrame (Graphiques g) {
si (mErrorMessage != null) {
showErreur(g);
retour;
}
// visage d'arrière-plan
g.drawImage(mFace, mFaceX, mFaceY, ceci);
// Dessine la sphère extérieure
g.setColor(mIrisColor);
g.fillOval(mLeftIrisX - mIrisRadius, mLeftIrisY - mIrisRadius, 2 * mIrisRadius,
2 * mIrisRadius);
g.fillOval(mRightIrisX - mIrisRadius, mRightIrisY - mIrisRadius, 2 * mIrisRadius,
2 * mIrisRadius);
// dessine les élèves
g.setColor(mPupilColor);
g.fillOval(mLeftPupilX - mPupilRadius, mLeftPupilY - mPupilRadius, 2 * mPupilRadius,
2 * mPupilRadius);
g.fillOval(mRightPupilX - mPupilRadius, mRightPupilY - mPupilRadius, 2 * mPupilRadius,
2 * mPupilRadius);
si (mTestMode) {
g.drawOval(mLeftEyeX - mLeftEyeRadius, mLeftEyeY - mLeftEyeRadius, 2 * mLeftEyeRadius,
2 * mLeftEyeRadius);
g.drawOval(mRightEyeX - mRightEyeRadius, mRightEyeY - mRightEyeRadius,
2 * mRightEyeRadius, 2 * mRightEyeRadius);
}
}
public void mouseMoved() {
// coordonnées de l'iris gauche
int leftDX = mMouseX - mLeftEyeX;
int leftDY = mMouseY - mLeftEyeY;
si (leftDY == 0)
leftDY = 1; // empêche la division par zéro
double gaucheDXDY = (double) gaucheDX / gaucheDY;
double gauche = Math.sqrt(Math.pow(mLeftEyeRadius, 2) / (Math.pow(leftDXDY, 2) + 1));
si (leftDY < 0) {
gauche = -gauche;
}
double leftdx = leftDXDY * leftdy * mHorizontalSkew ;
// coordonnées de l'iris droit
int rightDX = mMouseX - mRightEyeX;
int rightDY = mMouseY - mRightEyeY;
si (rightDY == 0)
rightDY = 1; // empêche la division par zéro
double rightDXDY = (double) rightDX / rightDY;
double rightdy = Math.sqrt(Math.pow(mRightEyeRadius, 2) / (Math.pow(rightDXDY, 2) + 1));
si (droitDY < 0) {
à droite = -à droite;
}
double rightdx = rightDXDY * rightdy * mHorizontalSkew ;
// ajustements pour les iris
double avedx = (rightdx + leftdx) / 2;
double avedy = (droitier + gaucher) / 2 ;
leftdx = leftdx + (avedx - leftdx) * (1 - mEyeIndependence);
rightdx = rightdx + (avedx - rightdx) * (1 - mEyeIndependence);
leftdy = leftdy + (avedy - leftdy) * (1 - mEyeIndependence);
rightdy = rightdy + (avedy - rightdy) * (1 - mEyeIndependence);
// nouvelles positions de l'iris
mLeftIrisX = mLeftEyeX + (int) leftdx ;
mLeftIrisY = mLeftEyeY + (int) gaucher ;
mRightIrisX = mRightEyeX + (int) rightdx ;
mRightIrisY = mRightEyeY + (int) rightdy ;
// coordonnées de la pupille gauche
double leftpdy = Math.sqrt(Math.pow(mLeftPupilTR, 2) / (Math.pow(leftDXDY, 2) + 1));
si (leftDY < 0) {
gauchepdy = -leftpdy;
}
double leftpdx = leftDXDY * leftpdy * (mHorizontalSkew - mGapFactor) ;
// coordonnées du bon élève
double rightpdy = Math.sqrt(Math.pow(mRightPupilTR, 2) / (Math.pow(rightDXDY, 2) + 1));
si (droitDY < 0) {
droitpdy = -rightpdy;
}
double rightpdx = rightDXDY * rightpdy * (mHorizontalSkew - mGapFactor) ;
// ajustements pour les élèves
double avepdx = (rightpdx + leftpdx) / 2 ;
double avepdy = (rightpdy + leftpdy) / 2 ;
leftpdx = leftpdx + (avepdx - leftpdx) * (1 - mEyeIndependence);
rightpdx = rightpdx + (avepdx - rightpdx) * (1 - mEyeIndependence);
leftpdy = leftpdy + (avepdy - leftpdy) * (1 - mEyeIndependence);
rightpdy = rightpdy + (avepdy - rightpdy) * (1 - mEyeIndependence);
// nouveaux postes d'élèves
mLeftPupilX = mLeftEyeX + (int) leftpdx ;
mLeftPupilY = mLeftEyeY + (int) leftpdy ;
mRightPupilX = mRightEyeX + (int) rightpdx ;
mRightPupilY = mRightEyeY + (int) rightpdy ;
repeindre();
}
mise à jour publique void (Graphiques g) {
peindre(g);
}
peinture vide public (Graphiques g) {
Dimension d = getSize();
// crée le contexte graphique hors écran
if ((mGraphics == null) || (d.width != mDimension.width)
|| (d.hauteur != mDimension.hauteur)) {
mDimension = d;
mImage = createImage(d.width, d.height);
mGraphics = mImage.getGraphics();
}
// efface l'image précédente
mGraphics.setColor(getBackground());
mGraphics.fillRect(0, 0, d.width, d.height);
mGraphics.setColor(Couleur.noir);
// peint le cadre dans l'image
paintFrame(mGraphics);
// peint l'image sur l'écran
g.drawImage(mImage, 0, 0, null);
}
la classe MouseMotion étend java.awt.event.MouseMotionAdapter {
public void mouseMoved (événement java.awt.event.MouseEvent) {
Objet objet = event.getSource();
si (objet == Eye.this)
mouseMovedInApplet (événement);
}
}
void mouseMovedInApplet (événement java.awt.event.MouseEvent) {
// récupère les coordonnées de la souris
mMouseX = event.getX();
mMouseY = event.getY();
mouseMoved();
}
public void mouseMovedInBrowser (int x, int y, int windowWidth) {
int appletW = getSize().width;
// ajuste x et y de la souris par rapport à la position de l'applet
mMouseX = x - (windowWidth - appletW) / 2;
mMouseY = y - mVerticalOffset ;
mouseMoved();
}
private void showError (Graphiques g) {
g.setFont(new Font("TimesRoman", Font.BOLD, 12));
g.drawString(mErrorMessage, 10, 20);
}
}