【问题标题】:Draw rectangles on circle formula在圆形公式上绘制矩形
【发布时间】:2014-10-23 04:27:52
【问题描述】:

我正在尝试在一个圆圈上绘制音频文件的频谱。像这样:

所以在圆圈上,我只想像您在图像上看到的那样绘制矩形。

我有这个代码:

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 的矩形,以便获得高和低矩形。并且中心必须放在我的圆线上。

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

【问题讨论】:

  • 我通过一个函数解决了你的问题,你传递了矩形的高度和 x 轴的度数,它为你绘制它是你想要的还是你的问题解决了。mySpectrumDrawer(int centerX, int centerY,int R,int height, int angel)@ 987654321@
  • 酷,我现在有所有相同的块,但我需要翻译,旋转..你可以在这里分享你的功能吗?

标签: android math


【解决方案1】:

在圆的所有 360 度上运行一个循环(以所需的步长),并将每个点的极坐标(这个角度和圆的半径)转换为笛卡尔坐标,例如,如 here 所述。通过这种方式,您可以获得矩形中心的位置。

Translate坐标系,使原点在圆线上的所需点,然后rotate在该点的圆角。

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

【讨论】:

  • 你有没有伪代码什么的。我数学不太好。
  • 我怎样才能越过圆的度数?还是您只是指从 0 到 360 的 forloop?
  • 是的,完全正确。例如 for (double angle=0; angle
【解决方案2】:

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

  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;
  }
}

【讨论】:

  • 有效。我是如此接近。我只是把我的 dhX 和 dHy 弄错了:p。谢谢大佬!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-11
相关资源
最近更新 更多