我试图在圆圈上绘制音频文件的光谱。像这样:
所以在圆圈上我只想要像你在图像上看到的那样画出矩形。
我有这段代码:
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 :(得分: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;
}
}