在圆形公式上绘制矩形

时间:2014-08-29 07:28:10

标签: android math

我试图在圆圈上绘制音频文件的光谱。像这样:

enter image description here

所以在圆圈上我只想要像你在图像上看到的那样画出矩形。

我有这段代码:

public void onRender(Canvas canvas, FFTData data, Rect rect) {
    canvas.drawCircle(rect.width()/2, rect.height()/2, 200, mPaint);

    for (int i = 0; i < data.bytes.length / mDivisions; i++) {
        byte rfk = data.bytes[mDivisions * i];
        byte ifk = data.bytes[mDivisions * i + 1];
        float magnitude = (rfk * rfk + ifk * ifk);
        int dbValue = (int) (10 * Math.log10(magnitude));


    }
}

其中FFTData是Android给我的快速傅里叶变换数据。现在在我的dbValue中,我得到了信号的强度。 mDivisions是我想要多少酒吧。目前设置为16,因为我不知道我可以在圈子上设置多少。

我仍然坚持如何用圆心线上的中心绘制矩形...所以我想要一个高度基于dbValue的矩形,这样我就可以获得高低矩形。中心必须放在我的圆圈线上。

有人可以帮我解决这个数学公式吗?

2 个答案:

答案 0 :(得分:2)

在圆的所有360度上运行循环(在所需的步骤),并且对于每个点,将Polar(此角度和圆的半径)坐标转换为笛卡尔坐标,如here所述,实例。这样您就可以得到矩形中心的位置。

Translate坐标系统,使原点位于圆圈线上的所需点,然后rotate为该点处的圆角。

或者,你可以通过角度+ - 一些偏移和半径+ - 一些偏移(与你的绘图值成比例)来建立一个梯形。它将具有较短的内边缘和较长的外边缘。如果并排绘制,这种梯形可能看起来更好。

答案 1 :(得分:1)

我认为你所需要的只是一支铅笔和一张纸,一点点数学,还有一些空闲时间玩: - )

  public class MainActivity extends Activity {
  ImageView drawingImageView;
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    drawingImageView = (ImageView) this.findViewById(R.id.DrawingImageView);

                Paint paint;
                paint = new Paint();
                paint.setColor(Color.GREEN);
                paint.setStyle(Paint.Style.STROKE);
                paint.setStrokeWidth(16);

               final  Bitmap bitmap = Bitmap.createBitmap((int) getWindowManager()
                    .getDefaultDisplay().getWidth(), (int) getWindowManager()
                    .getDefaultDisplay().getHeight(), Bitmap.Config.ARGB_8888);
                Canvas canvas = new Canvas(bitmap);

                int centerX =400;
                int centerY =400;
                int R = 200;

                canvas.drawCircle(centerX, centerY, R, paint);

                int h = 100;

                paint.setColor(Color.RED);
                Path p = new Path();
                p.moveTo(centerX + R - h/2, centerY);
                p.lineTo(centerX + R + h/2, centerY);
                canvas.drawPath(p, paint);

                p = mySpectrumDrawer(centerX,centerY,R,h,15);
                canvas.drawPath(p, paint);

                h = 50;
                p = mySpectrumDrawer(centerX,centerY,R,h,30);
                canvas.drawPath(p, paint);
                h = 60;   
                p = mySpectrumDrawer(centerX,centerY,R,h,60);
                canvas.drawPath(p, paint);
                h = 80;
                p = mySpectrumDrawer(centerX,centerY,R,h,90);
                canvas.drawPath(p, paint);

                drawingImageView.setImageBitmap(bitmap);

    } 

  private Path mySpectrumDrawer(int centerX, int centerY,int R,int height, int angel){

        Path p = new Path();

        int dX = (int) (R*(Math.cos(Math.toRadians(angel))));
        int dY = (int) (R*(Math.sin(Math.toRadians(angel))));

        int dhx = (int) (height/2*(Math.cos(Math.toRadians(angel))));
        int dhy = (int) (height/2*(Math.sin(Math.toRadians(angel))));

        p.moveTo(centerX + dX - dhx , centerY - dY + dhy);
        p.lineTo(centerX + dX + dhx , centerY - dY - dhy);

        return p;
  }
}

enter image description here