/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package feuille.drawing.ornament;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Stroke;
import java.awt.geom.CubicCurve2D;
/**
*
* @author The Wingate 2940
*/
public class OrnSMBezier extends AShape{
private OrnControlPoint c1=null, c2=null;
public OrnSMBezier(){
}
public OrnSMBezier(int originX1, int originY1,
int controlX2, int controlY2,
int controlX3, int controlY3,
int lastX4, int lastY4){
originPoint = new java.awt.Point(originX1,originY1);
c1 = new OrnControlPoint(controlX2, controlY2);
c2 = new OrnControlPoint(controlX3,controlY3);
lastPoint = new java.awt.Point(lastX4,lastY4);
}
public OrnSMBezier(int originX1, int originY1,
int lastX4, int lastY4){
originPoint = new java.awt.Point(originX1,originY1);
lastPoint = new java.awt.Point(lastX4,lastY4);
int xdiff = (int)lastPoint.getX() - (int)originPoint.getX();
int ydiff = (int)lastPoint.getY() - (int)originPoint.getY();
int x1_3 = (int)originPoint.getX() + xdiff/3;
int x2_3 = (int)originPoint.getX() + xdiff*2/3;
int y1_3 = (int)originPoint.getY() + ydiff/3;
int y2_3 = (int)originPoint.getY() + ydiff*2/3;
c1 = new OrnControlPoint(x1_3, y1_3);
c2 = new OrnControlPoint(x2_3,y2_3);
}
/** Définit le "point de contrôle" n°1 */
public void setControl1Point(int x1, int y1){
c1 = new OrnControlPoint(x1, y1);
}
/** Définit le "point de contrôle" n°2 */
public void setControl2Point(int x2, int y2){
c2 = new OrnControlPoint(x2, y2);
}
/** Retourne les coordonnées du "point de contrôle" n°1 */
public java.awt.Point getControl1Point(){
return c1.getOriginPoint();
}
/** Retourne les coordonnées du "point de contrôle" n°2 */
public java.awt.Point getControl2Point(){
return c2.getOriginPoint();
}
/** Définit le "point de contrôle" n°1 */
public void setControl1(OrnControlPoint c1){
this.c1 = c1;
}
/** Obtient le "point de contrôle" n°1 */
public OrnControlPoint getControl1(){
return c1;
}
/** Définit le "point de contrôle" n°2 */
public void setControl2(OrnControlPoint c2){
this.c2 = c2;
}
/** Obtient le "point de contrôle" n°2 */
public OrnControlPoint getControl2(){
return c2;
}
// http://fr.wikipedia.org/wiki/Courbe_de_B%C3%A9zier
// Pour retrouver y, nous allons utiliser la relation :
// P(t)=P0(1-t)^3+3P1*t(1-t)^2+3*P2*t^2(1-t)+P3*t^3
// Pöur calculer t on a besoin de faire un produit en croix :
// 1 <> lastPoint.getX()
// t <> x
// D'où t = x / lastPoint.getX()
@Override
public double getY(double x) {
double P0 = originPoint.getX();
double P1 = c1.getOriginPoint().getX();
double P2 = c2.getOriginPoint().getX();
double P3 = lastPoint.getX();
double t = x / lastPoint.getX();
double y =
P0*Math.pow((1-t),3)+
3*P1*t*Math.pow((1-t),2)+
3*P2*Math.pow(t,2)*(1-t)+
P3*Math.pow(t,3);
return y;
}
@Override
public void draw(Graphics2D g2d, Color color) {
Color oldc = g2d.getColor();
g2d.setColor(color);
// On dessine la courbe
CubicCurve2D c = new CubicCurve2D.Double();
c.setCurve(originPoint.x, originPoint.y,
c1.getOriginPoint().x, c1.getOriginPoint().y,
c2.getOriginPoint().x, c2.getOriginPoint().y,
lastPoint.x, lastPoint.y);
g2d.draw(c);
// On dessine les lignes entre points et points de contrôle
g2d.setColor(color.brighter());
Stroke stroke = g2d.getStroke();
float[] dash = {5, 5};
g2d.setStroke(new BasicStroke(1, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 5, dash, 0));
g2d.drawLine(originPoint.x, originPoint.y, c1.getOriginPoint().x, c1.getOriginPoint().y);
g2d.drawLine(c1.getOriginPoint().x, c1.getOriginPoint().y, c2.getOriginPoint().x, c2.getOriginPoint().y);
g2d.drawLine(c2.getOriginPoint().x, c2.getOriginPoint().y, lastPoint.x, lastPoint.y);
g2d.setStroke(stroke);
g2d.setColor(oldc);
// On ne dessine pas les points de contrôle qui sont dessinés indépendamment.
}
}