Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 计算非完美圆_Java_Android_Math - Fatal编程技术网

Java 计算非完美圆

Java 计算非完美圆,java,android,math,Java,Android,Math,我想创建一个“非完美圆”的生成者,这个圆有点扭曲,更随机,但看起来仍然有点像圆或者云 这就是我所说的不完美圆的意思: 我想创建一个函数,得到“非完美圆”的最大和最小比例,并得到它的所有点。我知道圆的公式: X^2+Y^2=R^2,但我想不出一种方法使它更随机。有人有什么想法吗 编辑:尝试用点绘制一个完美的圆,但不起作用: for (int step = 0; step < 300; ++step) { double t = step / 300 * 2 * Ma

我想创建一个“非完美圆”的生成者,这个圆有点扭曲,更随机,但看起来仍然有点像圆或者云

这就是我所说的不完美圆的意思:

我想创建一个函数,得到“非完美圆”的最大和最小比例,并得到它的所有点。我知道圆的公式: X^2+Y^2=R^2,但我想不出一种方法使它更随机。有人有什么想法吗

编辑:尝试用点绘制一个完美的圆,但不起作用:

    for (int step = 0; step < 300; ++step) {
         double t = step / 300 * 2 * Math.PI;
         c.drawPoint(300+(float)(33 * Math.cos(t)), 300+(float)(33 * Math.sin(t)), p);
    }
for(int步长=0;步长<300;++步长){
双t=step/300*2*Math.PI;
c、 支点(300+(浮点数)(33*数学cos(t)),300+(浮点数)(33*数学sin(t)),p);
}
编辑2:

    for (int step = 0; step < 20; ++step) {
          double t = step / 20.0 * 2 * Math.PI; 
          double imperfectR = 50.0+randInt(10, 50);
          //I do it here?
          points[step]=new PointF();
          points[step].set((300+(float)(imperfectR  * Math.cos(t))), 300+(float)(imperfectR  * Math.sin(t)));
          if(step==0){
                pp.moveTo(points[step].x, points[step].y);
          }
          else
                pp.quadTo(points[step-1].x, points[step-1].y,points[step].x, points[step].y);

    } 
for(int步长=0;步长<20;++步长){
双t=step/20.0*2*Math.PI;
双不完全tr=50.0+randInt(10,50);
//我在这里做?
点[步骤]=新点F();
点[step].set((300+(float)(imperfectR*Math.cos(t))),300+(float)(imperfectR*Math.sin(t));
如果(步骤==0){
pp.moveTo(点[step].x,点[step].y);
}
其他的
pp.quadTo(点[step-1].x,点[step-1].y,点[step].x,点[step].y);
} 
编辑3:

double t=0;
for (int i = 0; i < points.length/4; i++) {
        if(t==1){
            t=0;
        }
        t+=0.10;
        double imperfectR=0.5*((2*points[i+1].y)+(-points[i].y+points[i+2].y)*t+(2*points[i].y-5*points[i+1].y+4*points[i+2].y-points[i+3].y)*(t*t)+((-points[i].y+3*points[i+1].y-3*points[i+2].y+points[i+3].y)*(t*t*t)));
        newPoints[i].set((300+(float)(imperfectR  * Math.cos(t))), 300+(float)(imperfectR  * Math.sin(t)));
        t+=0.10;
        imperfectR=0.5*((2*points[i+1].y)+(-points[i].y+points[i+2].y)*t+(2*points[i].y-5*points[i+1].y+4*points[i+2].y-points[i+3].y)*(t*t)+((-points[i].y+3*points[i+1].y-3*points[i+2].y+points[i+3].y)*(t*t*t)));
        newPoints[i+1].set((300+(float)(imperfectR  * Math.cos(t))), 300+(float)(imperfectR  * Math.sin(t)));
        t+=0.10;
        imperfectR=0.5*((2*points[i+1].y)+(-points[i].y+points[i+2].y)*t+(2*points[i].y-5*points[i+1].y+4*points[i+2].y-points[i+3].y)*(t*t)+((-points[i].y+3*points[i+1].y-3*points[i+2].y+points[i+3].y)*(t*t*t)));
        newPoints[i+2].set((300+(float)(imperfectR  * Math.cos(t))), 300+(float)(imperfectR  * Math.sin(t)));
        t+=0.10;
        imperfectR=0.5*((2*points[i+1].y)+(-points[i].y+points[i+2].y)*t+(2*points[i].y-5*points[i+1].y+4*points[i+2].y-points[i+3].y)*(t*t)+((-points[i].y+3*points[i+1].y-3*points[i+2].y+points[i+3].y)*(t*t*t)));
        newPoints[i+3].set((300+(float)(imperfectR  * Math.cos(t))), 300+(float)(imperfectR  * Math.sin(t)));
        if(i==0){
            pp.moveTo(newPoints[i].x, newPoints[i].y);
        }
        pp.lineTo(newPoints[i].x, newPoints[i].y);
        pp.lineTo(newPoints[i+1].x, newPoints[i+1].y);
        pp.lineTo(newPoints[i+2].x, newPoints[i+2].y);
        pp.lineTo(newPoints[i+3].x, newPoints[i+3].y);

}
pp.close();
double t=0;
对于(int i=0;i
圆的另一个更容易绘制的方程是其参数形式之一:

x = R * cos(t);
y = R * sin(t);
其中,
R
是标称半径,
t
是介于
0
2*pi
之间的参数。因此,你可以在圆周上画一个“完美”的圆,如下所示:

for (int step = 0; step < NSTEPS; ++step) {
  double t = step / (double) NSTEPS * 2 * pi;
  drawPoint(R * cos(t), R * sin(t));
}
其中
f(t)
是为参数
t
生成半径的函数。现在,您可以为
t
选择任何函数,但您可能希望选择在圆上连续的函数,即
f(t)
没有突然改变值的点

这里有很多选择。我上面建议的例子是建议使用余弦函数的和:

double f(double t) {
  double f = 0;
  for (int i = 0; i < N; ++i) {
    f += A[i] * cos(i * t + w[i]);
  }
  return f;
}
(这不太管用,它不能处理
t
的环绕)


你需要四处玩,看看什么函数和什么类型的随机选择的值为你提供了你想要的形状。

简单方法:计算N个点,满足圆方程->在[0,sigma]范围内随机增加/减少每个坐标->使用这些修改点绘制路径。也许可以研究圆谐波,即使用随机选择的正弦波的加权和来增加半径,其频率是这样的,以便精确的循环数适合圆周?@nikis,但如果我想让它更平滑一点,比如,如果我随机选择每个点,圆圈可能会变成一个扣球,而不是一个圆圈。@SpoocyCrep它取决于N和sigma。好吧,看起来你不会这样做:那么看看这个谢谢你丰富的答案,我现在正在尝试代码,但我没有画出第二个代码中所示的完美圆圈,你能加入吗?我也会编辑我写的代码,但它不能画一个circle@Teepeemm-您不需要单独的正弦,因为
cos(i*t+w[i])
中的偏移量
w[i]
。当然,你可以表示为
cos(A+B)=A cos A+B sin B
@SpoocyCrep如果你真的想要平滑的随机曲线,请阅读以下内容:@pskink请发布你自己的答案,以便我可以向你提问或加入
for (int step = 0; step < NSTEPS; ++step) {
  double t = step / (double) NSTEPS * 2 * pi;
  double imperfectR = f(t);
  drawPoint(imperfectR * cos(t), imperfectR * sin(t));
}
double f(double t) {
  double f = 0;
  for (int i = 0; i < N; ++i) {
    f += A[i] * cos(i * t + w[i]);
  }
  return f;
}
double f(double t) {
  double f = 0;
  for (int i = 0; i < N; ++i) {
    f += A[i] * exp(-Math.pow(t-w[i], 2) / sigma[i]);
  }
  return f;
}