package curve;

import curve.*;
import java.awt.*;

public class CubicCurve extends Curve {
  
  private NumericTextField xMinText,xMaxText;
  private NumericTextField aText,bText,cText,dText;
  private double aVar,bVar,cVar,dVar;
  
  //Set up curve options panel
  public CubicCurve(DrawCurve aDrawCurve) {

    color=Color.black;
    drawCurve=aDrawCurve;
    if(drawCurve!=null) drawCurve.addCurve(this);

    GridBagLayout layout=new GridBagLayout();
    setBackground(Color.lightGray);
    setLayout(layout);
    GridBagConstraints constraints=new GridBagConstraints();
    
    //Set some defaults
    constraints.weightx=constraints.weighty=1.0;
    constraints.insets=new Insets(5,5,5,5);
    constraints.fill=GridBagConstraints.NONE;
    
    //Title row
    titleLabel=new Label("Equation is y=ax^3+bx^2+cx+d");
		titleLabel.setFont(new Font("Dialog",Font.BOLD,12));
    constraints.gridwidth=GridBagConstraints.REMAINDER;
    layout.setConstraints(titleLabel,constraints);
    add(titleLabel);
    
    MyActionListener actionListener=new MyActionListener();

    //Numbers to substitute into equation
    aText=addNewVariable(layout,"a=","0",actionListener,false);
    bText=addNewVariable(layout,"b=","1",actionListener,true);
    cText=addNewVariable(layout,"c=","0",actionListener,false);
    dText=addNewVariable(layout,"d=","0",actionListener,true);
    xMinText=addNewVariable(layout,"x from","0",actionListener,false);
    xMaxText=addNewVariable(layout,"to","1",actionListener,true);    
  };
    
  public DoubleRect getMinMax() {
    DoubleRect r;
    double yMin,yMax;
    double yValue;
    double dCtr;
    int ctr;
    Coordinate p;
    
    //get xmin,xmax
    xMin=xMinText.asDouble();
    xMax=xMaxText.asDouble();

    //Prepare variables
    aVar=aText.asDouble();
    bVar=bText.asDouble();
    cVar=cText.asDouble();
    dVar=dText.asDouble();
    
    //switch xMin,xMax if wrong way around
    if(xMin>xMax) {
      xMin=xMaxText.asDouble();
      xMax=xMinText.asDouble();
    };
    
    //calculate all the points on y
    
    dCtr=0;
    yMin=yMax=getValue(dCtr).y;
    for(ctr=0;ctr<=100;ctr++) {
      yValue=getValue(dCtr).y;
      if(yValue<yMin) yMin=yValue;
      if(yValue>yMax) yMax=yValue;
      dCtr+=0.01;
    };
    if(xMin==xMax) {
      xMin-=1;
      xMax+=1;
    };
    if(yMin==yMax) {
      yMin-=1;
      yMax+=1;
    };
    r=new DoubleRect(xMin,yMin,xMax-xMin,yMax-yMin);
    return r;
  };

  //t is always between 0 and 1
  public Coordinate getValue(double t) {
    double x,y,xPow;
    Coordinate p;
    
    if(t<0) x=xMin;
    else if(t>1) x=xMax;
    else x=t*(xMax-xMin)+xMin;
    
    //Calculate y
    y=0;
    y+=dVar;
    xPow=x;
    y+=cVar*xPow;
    xPow*=x; //x^2
    y+=bVar*xPow;
    xPow*=x; //x^3
    y+=aVar*xPow;
    
    p=new Coordinate(x,y);
    return p;
  };

	
  public void onActionPerformed(java.awt.event.ActionEvent event)
  {
    if(drawCurve!=null) drawCurve.repaint();
	};

};