在标志数学公式中绘制条纹

时间:2015-01-19 02:31:25

标签: android math rectangles

我有一个已知大小和位置的矩形。 (标志)
我必须用其他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();

1 个答案:

答案 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()内部。