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

+0

Я решил вашу проблему только одной функцией, которой вы передали высоту вашего прямоугольника и степень от оси x, и нарисовать ее для вас, вы хотите, или ваша проблема решена. 'MySpectrumDrawer (int centerX, int centerY, int R , int height, int angel) 'http://i.imgur.com/bti4Sh3.jpg – mmlooloo

+0

Прохладный, у меня есть все те же блоки прямо сейчас, но мне нужно перевести, повернуть. Можете ли вы поделиться своей функцией Вот? – user1007522

ответ

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

2

Запустите цикл по всем 360 градусам окружности (по желаемому шагу), и для каждой точки преобразуйте полярность (этот угол и радиус круга) в декартовую, как описано, например, here. Таким образом вы получите расположение центра вашего прямоугольника.

Translate система координат, создающая начало координат в нужную точку на линии круга, а затем rotate по углу круга в этой точке.

В качестве альтернативы вы можете построить трапецию, получив углы под углом + - некоторое смещение и радиус + - некоторое смещение (пропорциональное вашему размеру). Он будет иметь более короткий внутренний край и более длинный внешний край. Такие трапеции могут выглядеть лучше, если они окрашены бок о бок.

+0

У вас есть псевдокод или что-то в этом роде. Я не так хорош в математике. – user1007522

+0

Как я могу пробежать градусы круга? Или вы просто имеете в виду ловушку от 0 до 360? – user1007522

+0

Да, точно. для (двойной угол = 0, угол <360, угол + = 10), например. – h22

Смежные вопросы