2014-08-29 223 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