2014-08-29 221 views
0

我正试图在圆上绘制音频文件的光谱。就像这样:在圆形公式上绘制矩形

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,这样我可以得到高低矩形。中心必须放在我的圆圈线上。

有人可以帮助我在这个数学公式?

+0

玩什么的意思了时间? – user1007522 2014-08-29 08:22:52

+0

我解决了你的问题,只有一个函数,你通过矩形的高度和x轴的度数,它为你绘制它,你想它或你的问题解决.'mySpectrumDrawer(int centerX,int centerY,int R ,int height,int angel)http://i.imgur.com/bti4Sh3.jpg – mmlooloo 2014-08-29 11:11:52

+0

很酷,我现在有所有相同的块,但我需要翻译,旋转..你可能分享你的功能这里? – user1007522 2014-08-29 11:33:55

回答

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

+0

工程。我很亲密。我只是有我的dhX和dhy错误:p。谢啦! – user1007522 2014-08-29 13:22:33

2

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

Translate系统的坐标,使原点位于圆线上的想要的点上,然后由圆点角度在该点上。

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

+0

你有没有伪代码或什么的。数学不好。 – user1007522 2014-08-29 07:50:17

+0

我该如何运行圆的度数?或者你只是指从0到360的forloop? – user1007522 2014-08-29 08:54:56

+0

是的,确切地说。例如(双角度= 0;角度<360;角度+ = 10)。 – h22 2014-08-29 11:32:39