2015-01-19 1 views
0

У меня есть прямоугольник с известным размером и положением. (flag)
Я должен заполнить этот прямоугольник четырьмя другими прямоугольниками. (полосы)
Каждая полоса должна иметь 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

Давайте сделаем вид, что у вас есть одна полоса. В зависимости от угла ширина полосы будет значением между меньшим размером (высота в вашем случае) и более длинным размером (ширина в вашем случае). Формула расчета ширины полосы должна выглядеть примерно так:

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().

+0

Я попробовал, и это помогло настроить некоторые вещи. Но он все еще работает только при 0 ° и 90 °. Я пытаюсь начать с квадрата, и на 45 ° полоса должна быть длинной, как Hypotenuse, поэтому формула неправильная. Теперь у меня есть положение полос, так как я начинаю рисовать слева направо, и я думаю, что я должен начать с центра. –

+0

Вы правы, моя формула не совсем работает. Общая ширина полосы может быть такой же, как и диагональ прямоугольника. Вы должны уметь выяснить, какой угол сделает диагональ общей шириной полосы и придумает лучшую формулу. – Karakuri

+0

Да, я двигаюсь по алгоритму пересечения линии. Нарисуйте линию из верхней левой части прямоугольника с помощью «угла». Затем я нахожу вторую точку пересечения и, наконец, могу вычислить максимальную длину. –