2014-01-13 4 views
0

Я хотел бы использовать растровое изображение размером 4x4 (другой кирпич в стене), чтобы нарисовать линию, линия может начинаться/останавливаться в любом месте и идти в любом направлении.Создание пользовательской строки с холстом

Я пытаюсь что-то вроде следующего:

Bitmap bm = BitmapFactory.decodeResource(getResources(), R.drawable.brick); 
    int width = bm.getWidth(); 
    int height = bm.getHeight(); 
    float newWidth = Math.abs(line.startX - line.stopX); 
    float newHeight = Math.abs(line.startY - line.stopY); 
    float scaleWidth = ((float) newWidth)/width; 
    float scaleHeight = ((float) newHeight)/height; 
     Matrix matrix = new Matrix(); 
    Matrix m = new Matrix(); 
    // resize the bit map 
    matrix.postScale(scaleWidth, scaleHeight); 
    // recreate the new Bitmap 
    Bitmap resizedBitmap = Bitmap.createBitmap(bm, (int)line.startX,(int)line.startY, width, height, matrix, false); 
    canvas.drawBitmap(resizedBitmap, m, paint); 

Я понимаю, что это изменение размера, а не рисовать .bmp последовательно. Также он выдает ошибки x + width must be <= bitmap.width()

Есть ли у кого-нибудь предложения по использованию техники здесь?

+0

Вы хотите нарисовать последовательно с самой плотной упаковкой, которая предотвращает перекрытие или просто рисует растровое изображение в некоторой постоянной позиционной дельта? – hunt

+0

Глядя на рисование без перекрытия ... Я могу вычислить уравнение линии, которую я хочу нарисовать 'Y = MX + C', и учитывать вертикальные случаи – avrono

ответ

0

Насколько я могу судить, Простейший способ использования будет вычислять значение приращения X и значение приращения Y. Природа этого расчета будет зависеть от того, хотите ли вы плотно упакованные растровые изображения или перекрытий:

Для перекрытия, это должно быть простым расчетом наклона (не забудьте нуль/бесконечности наклона крайних случаев!).

Для плотной упаковки определите расположенное близко расположенное направление (X или Y) путем сравнения наклона линии с уклоном линии, нарисованной по диагонали изображения. Если линия более крутая, чем диагональ изображения, вам нужно плотно закрыть упаковку. В альтернативной ситуации вам нужна X-упаковка.

Затем вычислите значения приращения. Значение приращения на оси с закрытой упаковкой (если необходимо) будет размером растрового изображения вдоль этой оси. Величина приращения на другой оси будет простой линейной функцией наклона линии и приложенного приращения.

После того, как у вас есть значения вашего приращения, итеративно нарисуйте растровое изображение на холсте, начиная с местоположения начала линии и увеличивая место рисования на каждой итерации. Остановите повторение, когда ваш приращение вызывает либо превышение значения конца строки. При вычислении приращения и при проверке конца строки вам придется учитывать тот факт, что координаты линий могут переходить от низкого числа к большому числу или от большого числа к низкому числу.

Вы также можете решить, что вы не всегда хотите начать рисовать в начальной точке, и вместо этого хотите «центрировать» свою линию таким образом, чтобы начальное и конечное изображения были равноудалены в своих центрах от фактических конечных точек. В этом случае вам придется вычислить другую отправную точку, но она должна включать довольно простую математику.

+0

Звучит очень логично, какие формы' canvas.drawBitmap' являются лучшими подходит? – avrono

+0

Я следовал твоему предложению: сделал 3 случая, вертикальные, горизонтальные и диагональные линии и увеличил вдоль линии либо X, Y, либо X и Y. Работает очень хорошо! – avrono

+0

@avrono Рад видеть, что вы выяснили правильный контракт drawBitmap. Если это ответит на ваш вопрос, можете ли вы пометить его как ответ? Это запомнит мою репутацию и упростит для других пользователей, которые испытывают ту же проблему, чтобы найти ответ. – hunt

Смежные вопросы