我有一个已知大小和位置的矩形。 (标志)
我必须用其他4个矩形填充这个矩形。 (条纹)
每个条纹必须具有旗帜总宽度的1/4,并且其位置接近前一个
我必须以0°到90°的随机角度画出这条纹
0°=垂直条纹(条纹宽度=标志宽度/ 4)
90°=水平条纹(条纹宽度=标志高度/ 4)
如何计算其他角度的每个条纹的宽度?
int stripes = 4;
RectF rect = new RectF(0, 0, 100f, 75f);
float angle = new Random.nextInt(90);
float stripeSize;
if (angle == 0) {
stripeSize = rect.width() / stripes;
} else if (angle == 90) {
stripeSize = rect.height() / stripes;
} else {
stripeSize = ?
}
canvas.save();
canvas.rotate(angle, rect.centerX(), rect.centerY());
float offset = 0;
for (int i = 0; i < stripes; i++) {
if (angle == 0) {
reusableRect.set(offset, rect.top, offset + stripeSize, rect.bottom);
} else if (angle == 90) {
reusableRect.set(rect.left, offset, rect.right, offset + stripeSize);
} else {
reusableRect.set(?, ?, ?, ?);
}
canvas.drawRect(reusableRect, paint);
offset += stripeSize;
}
canvas.restore();
答案 0 :(得分:0)
让我们假装你有一个条纹。根据角度,条纹宽度将是较短尺寸(在您的情况下为高度)和较长尺寸(在您的情况下为宽度)之间的值。条带宽度计算的公式应如下所示:
height + ((width - height) * ?)
在哪里?基于旋转角度在0和1之间变化。听起来像正弦函数的我可能是一个很好的候选者:正弦(0)= 0和正弦(90)= 1.你可以使用Math.sin()
,但要注意它所采用的参数是弧度,而不是度,所以你需要先在角度上使用Math.toRadians()
。然后除以条纹的数量:
double radians = Math.toRadians(angle);
float stripeTotal = height + ((width - height) * Math.sin(radians));
float stripeWidth = stripeTotal / 4; // or however many stripes you have
如果不完美,您可以调整配方。最后一点,因为这些值只需要计算一次,我会在每次角度变化时(如果它发生变化)单独进行,而不是在onDraw()
内部。