【问题标题】:Drawing stripes in a flag math formula在标志数学公式中绘制条纹
【发布时间】:2015-01-19 02:31:25
【问题描述】:

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

【问题讨论】:

    标签: android math rectangles


    【解决方案1】:

    让我们假设你有一条条纹。根据角度,条纹宽度将是较短尺寸(在您的情况下为高度)和较长尺寸(在您的情况下为宽度)之间的值。条带宽度计算公式应如下所示:

    height + ((width - height) * ?)
    

    在哪里?根据旋转角度在 0 和 1 之间变化。对我来说,听起来正弦函数可能是一个很好的候选:sine(0) = 0 和 sine(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() 内部。

    【讨论】:

    • 我试过了,它有助于调整一些东西。但它仍然只能在 0° 和 90° 下工作。我试图从一个正方形重新开始,在 45°处,stripeTotal 应该和 Hypotenuse 一样长,所以公式不正确。现在我必须定位条纹,因为我从左到右开始绘制,我认为我应该从中心开始
    • 你说得对,我的公式不太适用。条带的总宽度可以与矩形的对角线一样多。您应该能够找出使对角线成为总条纹宽度的角度,并得出一个更好的公式。
    • 是的,事实上,我正在移动在线交叉算法。用“角度”从矩形的左上角画一条线。然后我找到第二个交点,最后我可以计算出最大长度。
    猜你喜欢
    • 2012-10-20
    • 1970-01-01
    • 2012-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-10
    • 2014-09-01
    • 1970-01-01
    相关资源
    最近更新 更多