后面那部分for 循环出来的结果不对
如果把两部分分开单独编,能出正确的数据
是不是内存的问题啊
算法为用两种方法加工椭圆面时的加工步数和求步数差
前面一种为保持X轴方向的步距相等.后一种为两次圆弧插补加工后的包络迹高度相等
public class Stepscha{
public static void main(String[] args){
double a,b,R,l,x0,y0,xx0,yy0,xc,h,x1,k1,k2,a1,b1,d,mid,n=0.1;/*a,b为椭圆轴,x0,y0为砂轮磨削工件的起点,x00,y00为砂轮圆心位置,h为包络迹高度,k1,k2分别为椭圆的切线和法线*/
double xx[]=new double[100000]; //砂轮圆心X轴的坐标
double yy[]=new double[100000]; //砂轮圆心Y轴坐标
int xsteps[]=new int[100000]; //用X轴方向步距不变的加工步数
int hsteps[]=new int[100000]; //用等包络迹高度方法加工的加工步数
float max1[]=new float[100000];
float max;
double hh[]=new double[100000];
int i,m=1,j=1,k=1,e=0,t;
a=170;b=68;l=100.0;R=87.0748; //R为砂轮半径
a1=a+R; //砂轮圆心的椭圆轨迹轴
b1=b+R;
x0=-l/2;//L为工件长度,对X0给初值
y0=Math.sqrt((1-x0*x0/(a*a))*b*b); //根据椭圆方程求y0
k1=-b*b*x0/(a*a*y0); // 椭圆切线
k2=-1/k1; //椭圆法线
xx0=x0-R/Math.sqrt(1+k2*k2);//求初始位置的砂轮圆心位置
mid=xx0;
yy0=Math.sqrt((1-xx0*xx0/(a1*a1))*b1*b1);
for(xc=10;xc>=0.01;xc=xc-0.001){ //当步距为xc时
for(xx0=mid;xx0<=-mid;xx0=xx0+xc){
yy0=Math.sqrt((1-xx0*xx0/(a1*a1))*b1*b1);
xx[m]=xx0;//把砂轮坐标放到数组里
yy[m]=yy0;
m++;
}
for(i=2;i<m;i++){
d=Math.sqrt((xx[i]-xx[i-1])*(xx[i]-xx[i-1])+(yy[i]-yy[i-1])*(yy[i]-yy[i-1]));
h=R-Math.sqrt(R*R-d*d/4); //求xc时的包络迹高度
if(h>max)
max=(float)h; //把步距为xc时的最大包络迹高度辅给max
}
while(max>=0.00001){
if((max-n)<=0.000001){ /*把max与给定的n比较,满足条件是,把max,和步数存到数组*/
xsteps[e]=m-1;
max1[e]=max;
e++;
n=n-0.00001;
}
break; //跳出循环
}
m=1;max=0; //m和max恢复初值,重复循环
}
t=e; //把数组长度存到t
x0=-l/2;
e=0;
for(j=0;j<t;j++){ /*采用等包络高度加工时步数的算法,h用上面数组max1里的值代替(问题好象就出在这*/
while (x0<=l/2) {
d=2*Math.sqrt(R*R-(R-(float)max1[j])*(R-(float)max1[j]));
y0= Math.sqrt((1-x0*x0/(a*a))*b*b);
k1=-b*b*x0/(a*a*y0);
k2=-1/k1;
x1=x0+d/Math.sqrt(1+k1*k1);
x0=x1;
m++;
}
hsteps[e]=m+1;
e++;
x0=-l/2;
}
m=e-1;
System.out.println("h xsteps hsteps xsteps-hsteps");
for(e=0;e<=t;e++){
j=xsteps[e]-hsteps[e];
System.out.println(max1[e]+" "+xsteps[e]+" "+hsteps[e]+" "+j);
}
}
}