2014-01-13 3 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)을 결정하십시오. 선이 이미지 대각선보다 가파르면 Y 클로즈 패킹이 필요합니다. 다른 상황에서는 X 클로즈 패킹이 필요합니다.

그런 다음 증분 값을 계산하십시오. 가장 가까운 축에있는 증분 값 (필요한 경우)은 해당 축을 따라 비트 맵의 ​​크기가됩니다. 다른 축의 증분 값은 선의 기울기와 가까운 패킹 된 증분의 간단한 선형 함수입니다.

일단 증분 값을 얻으면 비트 맵을 캔버스에 반복적으로 그려서 시작 위치를 시작하고 각 반복마다 그리기 위치를 증가시킵니다. 증가로 인해 두 값 중 하나가 라인 끝 오버 슛을 초래할 때 반복을 중지하십시오.. 증가분을 계산할 때와 줄 끝을 검사 할 때 줄 좌표가 낮은 수에서 높은 수로 또는 높은 수에서 낮은 수로 이동할 수 있다는 사실을 고려해야합니다.

항상 시작점에서 그리기를 시작하지 않고 시작점과 끝점 이미지가 실제 끝점에서 중심점에서 등거리가되도록 선의 중심을 "중앙에 맞추기"를 원할 수도 있습니다. 이 경우 다른 출발점을 계산해야하지만 상당히 간단한 수학이 포함되어야합니다.

+0

'canvas.drawBitmap' 적합한가? – avrono

+0

나는 당신의 제안을 따랐다 : 3 개의 대소 문자를 수직, 수평, 대각선으로 만들어 X, Y 또는 X & Y 중 하나를 따라 증가시켰다. 아주 잘 작동합니다! – avrono

+0

@avrono 당신이 drawBitmap의 올바른 계약을 알아 내서 반갑습니다. 이 질문에 대한 답변이 있으면 답변으로 표시 할 수 있습니까? 이렇게하면 내 평판이 좋아지며 동일한 문제를 겪고있는 다른 사용자가 쉽게 답을 찾을 수 있습니다. – hunt